ALGO_AlgorithmBase_ATY.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. /**
  2. * @file ALGO_AlgorithmBase_ATY.c
  3. *
  4. * @param Project ALGO_Algorithm_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of base algorithm
  20. *
  21. * @version
  22. * - 1_01_220601 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_02_251124 > ATY
  25. * -# add and test
  26. * @todo long support
  27. ********************************************************************************
  28. */
  29. #ifndef __ALGO_AlgorithmBase_ATY_C
  30. #define __ALGO_AlgorithmBase_ATY_C
  31. #include "ALGO_AlgorithmBase_ATY.h"
  32. #define ALGO_AlgorithmBase_ATY_TAG "\r\n[ALGO_AlgorithmBase_ATY] "
  33. /******************************* For user *************************************/
  34. /******************************************************************************/
  35. /* Bit Inversion **************************************************************/
  36. /* Easy way to implement Invert ***********************************************/
  37. /**
  38. * @brief Invert buf with uint8 size(LSB <-> MSB)
  39. * @param genBuf Generate buf
  40. * @param srcBuf Input source buf
  41. */
  42. void ALGO_InvertUint8_Group(uint8_t* genBuf, uint8_t* srcBuf){
  43. uint8_t i = 0;
  44. uint8_t temp_uint8 = 0;
  45. for(i = 0; i < 8; i++){
  46. if((*srcBuf) & (1 << i))
  47. temp_uint8 |= 1 << (7 - i);
  48. }
  49. *genBuf = temp_uint8;
  50. }
  51. /**
  52. * @brief Invert buf with uint16 size(LSB <-> MSB)
  53. * @param genBuf Generate buf
  54. * @param srcBuf Input source buf
  55. */
  56. void ALGO_InvertUint16_Group(uint16_t* genBuf, uint16_t* srcBuf){
  57. uint8_t i = 0;
  58. uint16_t temp_uint16 = 0;
  59. for(i = 0; i < 16; i++){
  60. if((*srcBuf) & (1 << i))
  61. temp_uint16 |= 1 << (15 - i);
  62. }
  63. *genBuf = temp_uint16;
  64. }
  65. /**
  66. * @brief Invert buf with uint32 size(LSB <-> MSB)
  67. * @param genBuf Generate buf
  68. * @param srcBuf Input source buf
  69. */
  70. void ALGO_InvertUint32_Group(uint32_t* genBuf, uint32_t* srcBuf){
  71. uint8_t i = 0;
  72. uint32_t temp_uint32 = 0;
  73. for(i = 0; i < 32; i++){
  74. if((*srcBuf) & (1 << i))
  75. temp_uint32 |= 1 << (31 - i);
  76. }
  77. *genBuf = temp_uint32;
  78. }
  79. /**
  80. * @brief Invert buf with n size(LSB <-> MSB)
  81. * @param genBuf Generate buf
  82. * @param srcBuf Input source buf
  83. * @param len Data length
  84. */
  85. void ALGO_InvertBitsN_Group(uint32_t* genBuf, uint32_t* srcBuf, uint8_t len){
  86. uint8_t i = 0;
  87. uint32_t temp_uint32 = 0;
  88. for(i = 0; i < len; i++){
  89. if((*srcBuf) & (1 << i))
  90. temp_uint32 |= 1 << (len - 1 - i);
  91. }
  92. *genBuf = temp_uint32;
  93. }
  94. /* End of Easy way to implement Invert ****************************************/
  95. /* Math Utilities *************************************************************/
  96. /**
  97. * @brief Pow() function in easy way
  98. * @param x value to deal
  99. * @param n index, >= 0
  100. * @note 17 significant digits
  101. */
  102. float ALGO_MATH_POW_EASY(float x, uint8_t n){
  103. float result = 1;
  104. while(n--)
  105. result *= x;
  106. return result;
  107. }
  108. /**
  109. * @brief Pow() function in quick way
  110. * @param x value to deal
  111. * @param n index, >= 0
  112. */
  113. int ALGO_MATH_POW_QUICK(int x, int n){
  114. float result = 1;
  115. while(n){
  116. if(n & 1) result = result * x;
  117. x = x * x;
  118. n >>= 1;
  119. }
  120. return result;
  121. }
  122. /**
  123. * @brief Pow() function
  124. * @param x value to deal
  125. * @param n index
  126. */
  127. float ALGO_MATH_POW(float x, int n){
  128. if(n == 0)
  129. return 1.0;
  130. else if(n < 0)
  131. return 1.0 / ALGO_MATH_POW(x, -n);
  132. else if(n > 0){
  133. float temp_d = ALGO_MATH_POW(x, n / 2);
  134. if((n % 2) == 1) // odd n
  135. return x * temp_d * temp_d;
  136. else // even n
  137. return temp_d * temp_d;
  138. }
  139. return 0;
  140. }
  141. /**
  142. * @brief Sqrt() function
  143. * @param x value to deal
  144. */
  145. int ALGO_MATH_SQRT(int x){
  146. int left = 1;
  147. int right = x;
  148. int result = 0;
  149. while(left <= right){
  150. int mid = left + (right - left) / 2;
  151. if(mid <= x / mid){
  152. result = mid;
  153. left = mid + 1;
  154. }
  155. else{
  156. right = mid - 1;
  157. }
  158. }
  159. return result;
  160. }
  161. /**
  162. * @brief ln() function
  163. * @param x value to deal
  164. * @note 17 significant digits
  165. */
  166. float ALGO_MATH_LogLn(float x){
  167. // take the first 15+1 terms to estimate
  168. const int N = 15;
  169. int k, nk;
  170. float a, aa, b;
  171. a = (x - 1) / (x + 1);
  172. aa = a * a;
  173. nk = 2 * N + 1;
  174. b = 1.0 / nk;
  175. for(k = N; k > 0; k--){
  176. nk = nk - 2;
  177. b = 1.0 / nk + aa * b;
  178. }
  179. return 2.0 * a * b;
  180. }
  181. float ALGO_NumberSuitScop(float valueIn, float scopMin, float scopMax, float step){
  182. uint16_t errCount = 0;
  183. while((valueIn < scopMin || valueIn > scopMax) && (uint32_t)step != 0){
  184. errCount++; if(errCount > 60000) return -1;
  185. if(valueIn < scopMin)
  186. valueIn += step;
  187. else if(valueIn > scopMax)
  188. valueIn -= step;
  189. }
  190. return valueIn;
  191. }
  192. uint16_t ALGO_BinarySearch(const double* arr, uint16_t size, double target){
  193. uint16_t l = 0, r = size;
  194. while(l < r){
  195. uint16_t m = l + ((r - l) >> 1);
  196. if(arr[m] < target) l = (uint16_t)(m + 1);
  197. else r = m;
  198. }
  199. return (l < size) ? l : size;
  200. }
  201. float ALGO_Sqrt_NewtonNumber(float x){
  202. float xhalf = 0.5 * x;
  203. int i = *(int*)&x;
  204. if(!x) return 0;
  205. i = 0x5f375a86 - (i >> 1); // beautiful number
  206. x = *(float*)&i;
  207. x = x * (1.5 - xhalf * x * x); // Newton iteration
  208. x = x * (1.5 - xhalf * x * x); // Newton iteration
  209. x = x * (1.5 - xhalf * x * x); // Newton iteration
  210. return (1 / x);
  211. }
  212. /* Metrics ********************************************************************/
  213. float ALGO_GetRms(uint16_t currentValue, uint16_t currentNum, float sumValue, uint16_t wholeNum){
  214. float value = sumValue;
  215. value += (currentValue * currentValue);
  216. if(currentNum >= wholeNum){
  217. value /= currentNum;
  218. value = ALGO_Sqrt_NewtonNumber(value);
  219. return value;
  220. }
  221. return 0;
  222. }
  223. /* RC Filters *****************************************************************/
  224. double ALGO_RC_LpFilter(ALGO_RC_FilterPara_t* rcPara, double val){
  225. rcPara->lVal = ((double)val * rcPara->k + rcPara->lVal * (1 - rcPara->k));
  226. return rcPara->lVal;
  227. }
  228. double ALGO_RC_HpFilter(ALGO_RC_FilterPara_t* rcPara, double val){
  229. rcPara->lVal = ((double)val * rcPara->k + rcPara->lVal * (1 - rcPara->k));
  230. return -(val - rcPara->lVal);
  231. }
  232. /* Debug Tests ****************************************************************/
  233. #ifdef __DEBUG_ALGO_AlgorithmBase_ATY
  234. void ALGO_Swap_Test(void){
  235. uint32_t a = 0, b = 1;
  236. printf_ATY("\r\nALGO_Swap_Test - Before: %d - %d\r\n", a, b);
  237. ALGO_SWAP(uint8_t, 0, a, b);
  238. printf_ATY("\r\nALGO_Swap_Test - After: %d - %d\r\n", a, b);
  239. }
  240. void ALGO_Sort_Test(void){
  241. const uint32_t temp_uint32[12] = {
  242. 0xffffff14, 0xffffff19, 0xffffff17, 0xffffff12,
  243. 0xffffff18, 0xffffff00, 0xffffff11, 0xffffffff,
  244. 0xffffff13, 0xffffff15, 0xffffff16, 0xffffff20};
  245. printf_ATY("\r\nALGO_Sort_Test - Before: \r\n");
  246. for(uint8_t i = 0; i < 12; i++)
  247. printf_ATY("%x ", temp_uint32[i]);
  248. printf_ATY("\r\n");
  249. ALGO_Sort(uint32_t, 0, temp_uint32);
  250. printf_ATY("\r\nALGO_Sort_Test - After: \r\n");
  251. for(uint8_t i = 0; i < 12; i++)
  252. printf_ATY("%x ", temp_uint32[i]);
  253. printf_ATY("\r\n");
  254. }
  255. void ALGO_AverageInDelExtremum_Test(void){
  256. const uint32_t temp_uint32g[12] = {14, 19, 17, 12, 18, 0, 11, 1055, 13, 15, 16, 20};
  257. uint32_t temp_uint32;
  258. printf_ATY("\r\nALGO_AverageInDelExtremum_Test - Origin: \r\n");
  259. for(uint8_t i = 0; i < 12; i++)
  260. printf_ATY("%d ", temp_uint32g[i]);
  261. printf_ATY("\r\n");
  262. ALGO_AverageInDelExtremum(uint32_t, 0, temp_uint32g, temp_uint32);
  263. printf_ATY("\r\nALGO_AverageInDelExtremum_Test - Result: %d\r\n", temp_uint32);
  264. }
  265. void ALGO_INVERT_Test(void){
  266. uint32_t TT0 = 0;
  267. const uint8_t TT1 = 0xF0; // 0x0F
  268. const uint8_t TT2 = 0x12; // 0x48
  269. const uint16_t TT3 = 0xF0E0; // 0x070F
  270. const uint16_t TT4 = 0x1234; // 0x2C48
  271. const uint32_t TT5 = 0xF0E0D0C0; // 0x030B070F
  272. const uint32_t TT6 = 0x12345678; // 0x1E6A2C48
  273. ALGO_INVERT_BITS(TT1);
  274. TT0 = TT1;
  275. ALGO_INVERT_BITS(TT2);
  276. TT0 = TT2;
  277. ALGO_INVERT_BITS(TT3);
  278. TT0 = TT3;
  279. ALGO_INVERT_BITS(TT4);
  280. TT0 = TT4;
  281. ALGO_INVERT_BITS(TT5);
  282. TT0 = TT5;
  283. ALGO_INVERT_BITS(TT6);
  284. TT0 = TT6;
  285. TT0 = 0;
  286. }
  287. void ALGO_Test_Whole(void){
  288. printf_ATY("\r\n\r\n");
  289. printf_ATY("------------------\r\n");
  290. printf_ATY("/* - ALGO_TEST -*/\r\n");
  291. ALGO_Swap_Test();
  292. ALGO_Sort_Test();
  293. ALGO_AverageInDelExtremum_Test();
  294. }
  295. #endif /* __DEBUG_ALGO_AlgorithmBase_ATY */
  296. #ifdef ALGO_AlgorithmBase_ATY_Test_ATY
  297. uint8_t ALGO_AlgorithmBase_ATY_Test_Pass;
  298. uint8_t ALGO_AlgorithmBase_ATY_Test_Fail;
  299. static int __aty_close_d(double a, double b, double tol){ return (a > b ? (a - b) : (b - a)) <= tol; }
  300. static int __aty_equal_u(uint32_t a, uint32_t b){ return a == b; }
  301. uint32_t ALGO_AlgorithmBase_ATY_Test(void){
  302. ALGO_AlgorithmBase_ATY_Test_Pass = 0;
  303. ALGO_AlgorithmBase_ATY_Test_Fail = 0;
  304. printf_ATY_D("%sSTART\r\n", ALGO_AlgorithmBase_ATY_TAG);
  305. {
  306. int a = -5, b = 7;
  307. int abs_a = ALGO_ABS(a);
  308. int max_ab = ALGO_MAX(a, b);
  309. int min_ab = ALGO_MIN(a, b);
  310. int ok1 = __aty_equal_u((uint32_t)abs_a, (uint32_t)5);
  311. int ok2 = __aty_equal_u((uint32_t)max_ab, (uint32_t)7);
  312. int ok3 = __aty_equal_u((uint32_t)min_ab, (uint32_t)-5);
  313. if(ok1) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  314. if(ok2) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  315. if(ok3) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  316. printf_ATY_D(" ABS(a) = %d, MAX = %d, MIN = %d, %s\r\n", abs_a, max_ab, min_ab, ((ok1 && ok2 && ok3) ? "PASS" : "FAIL"));
  317. }
  318. {
  319. int okd1 = ALGO_DECCHK('5');
  320. int okd2 = !ALGO_DECCHK('A');
  321. int okh1 = ALGO_HEXCHK('F');
  322. int okh2 = !ALGO_HEXCHK('G');
  323. if(okd1 && okd2) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  324. if(okh1 && okh2) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  325. printf_ATY_D(" DEC = %d/%d, HEX = %d/%d, %s\r\n", okd1, okd2, okh1, okh2, ((okd1 && okd2 && okh1 && okh2) ? "PASS" : "FAIL"));
  326. }
  327. {
  328. uint16_t c16 = ALGO_COMB16(0x12, 0x34);
  329. uint32_t c32 = ALGO_COMB32(0x12, 0x34, 0x56, 0x78);
  330. uint8_t l16 = ALGO_UINT16_L(0x1234);
  331. uint8_t h16 = ALGO_UINT16_H(0x1234);
  332. int okc16 = __aty_equal_u(c16, 0x1234u);
  333. int okc32 = __aty_equal_u(c32, 0x12345678u);
  334. int oklh = __aty_equal_u((uint32_t)l16, (uint32_t)0x34u) && __aty_equal_u((uint32_t)h16, (uint32_t)0x12u);
  335. if(okc16) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  336. if(okc32) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  337. if(oklh) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  338. printf_ATY_D(" COMB16 = 0x%x, COMB32 = 0x%x, L = 0x%x, H = 0x%x, %s\r\n", c16, c32, l16, h16, ((okc16 && okc32 && oklh) ? "PASS" : "FAIL"));
  339. }
  340. {
  341. int okb = __aty_equal_u((uint32_t)ALGO_BOOL(5), (uint32_t)1);
  342. int okn = __aty_equal_u((uint32_t)ALGO_NOT(0), (uint32_t)1);
  343. int oka = __aty_equal_u((uint32_t)ALGO_AND(1, 0), (uint32_t)0);
  344. int oko = __aty_equal_u((uint32_t)ALGO_OR(1, 0), (uint32_t)1);
  345. if(okb && okn && oka && oko) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  346. printf_ATY_D(" BOOL = %d, NOT = %d, AND = %d, OR = %d, %s\r\n", ALGO_BOOL(5), ALGO_NOT(0), ALGO_AND(1, 0), ALGO_OR(1, 0), ((okb && okn && oka && oko) ? "PASS" : "FAIL"));
  347. }
  348. {
  349. float pe = ALGO_MATH_POW_EASY(2.0f, 10);
  350. int pq = ALGO_MATH_POW_QUICK(2, 10);
  351. float pn = ALGO_MATH_POW(2.0f, 10);
  352. int okpe = __aty_close_d(pe, 1024.0, 1e-5);
  353. int okpq = __aty_equal_u((uint32_t)pq, (uint32_t)1024);
  354. int okpn = __aty_close_d(pn, 1024.0, 1e-3);
  355. if(okpe) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  356. if(okpq) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  357. if(okpn) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  358. printf_ATY_D(" POW_EASY = %f, POW_QUICK = %d, POW = %f, %s\r\n", pe, pq, pn, ((okpe && okpq && okpn) ? "PASS" : "FAIL"));
  359. }
  360. {
  361. int s10 = ALGO_MATH_SQRT(10);
  362. int s16 = ALGO_MATH_SQRT(16);
  363. int oks = __aty_equal_u((uint32_t)s10, (uint32_t)3) && __aty_equal_u((uint32_t)s16, (uint32_t)4);
  364. if(oks) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  365. printf_ATY_D(" SQRT(10) = %d, SQRT(16) = %d, %s\r\n", s10, s16, (oks ? "PASS" : "FAIL"));
  366. }
  367. {
  368. float le = ALGO_MATH_LogLn(2.7182818f);
  369. int okle = __aty_close_d(le, 1.0, 1e-3);
  370. if(okle) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  371. printf_ATY_D(" LN(e) = %f, %s\r\n", le, (okle ? "PASS" : "FAIL"));
  372. }
  373. {
  374. float sn = ALGO_Sqrt_NewtonNumber(9.0f);
  375. int oksi = __aty_close_d(sn, 3.0, 1e-3);
  376. if(oksi) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  377. printf_ATY_D(" NewtonSqrt(9) = %f, %s\r\n", sn, (oksi ? "PASS" : "FAIL"));
  378. }
  379. {
  380. ALGO_RC_FilterPara_t lp = {0.1, 0.0};
  381. double o1 = ALGO_RC_LpFilter(&lp, 0.0);
  382. double o2 = ALGO_RC_LpFilter(&lp, 10.0);
  383. double o3 = ALGO_RC_LpFilter(&lp, 10.0);
  384. double e2 = 10.0 * 0.1 + 0.0 * 0.9;
  385. double e3 = 10.0 * 0.1 + e2 * 0.9;
  386. int okrc = __aty_close_d(o1, 0.0, 1e-9) && __aty_close_d(o2, e2, 1e-9) && __aty_close_d(o3, e3, 1e-9);
  387. if(okrc) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  388. printf_ATY_D(" LP o1 = %f, o2 = %f, o3 = %f, %s\r\n", o1, o2, o3, (okrc ? "PASS" : "FAIL"));
  389. }
  390. {
  391. ALGO_RC_FilterPara_t hp = {0.1, 0.0};
  392. double h1 = ALGO_RC_HpFilter(&hp, 0.0);
  393. double h2 = ALGO_RC_HpFilter(&hp, 10.0);
  394. double h3 = ALGO_RC_HpFilter(&hp, 10.0);
  395. double e2 = -(10.0 - (10.0 * 0.1 + 0.0 * 0.9));
  396. double e3 = -(10.0 - (10.0 * 0.1 + (10.0 * 0.1 + 0.0 * 0.9) * 0.9));
  397. int okhp = __aty_close_d(h1, 0.0, 1e-9) && __aty_close_d(h2, e2, 1e-9) && __aty_close_d(h3, e3, 1e-9);
  398. if(okhp) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  399. printf_ATY_D(" HP h1 = %f, h2 = %f, h3 = %f, %s\r\n", h1, h2, h3, (okhp ? "PASS" : "FAIL"));
  400. }
  401. {
  402. float v1 = ALGO_NumberSuitScop(105.0f, 0.0f, 100.0f, 1.0f);
  403. float v2 = ALGO_NumberSuitScop(-5.0f, 0.0f, 100.0f, 1.0f);
  404. int okns = __aty_close_d(v1, 100.0, 1e-5) && __aty_close_d(v2, 0.0, 1e-5);
  405. if(okns) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  406. printf_ATY_D(" SuitScop v1 = %f, v2 = %f, %s\r\n", v1, v2, (okns ? "PASS" : "FAIL"));
  407. }
  408. {
  409. uint16_t whole = 2;
  410. float sum = 0.0f;
  411. float r1 = ALGO_GetRms(3, 1, sum, whole);
  412. sum += 3 * 3;
  413. float r2 = ALGO_GetRms(4, 2, sum, whole);
  414. int okr = __aty_close_d(r2, 3.5355, 1e-3);
  415. if(okr) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  416. printf_ATY_D(" RMS r1 = %f, r2 = %f, %s\r\n", r1, r2, (okr ? "PASS" : "FAIL"));
  417. }
  418. {
  419. double arr[5] = {1.0, 2.0, 3.0, 5.0, 8.0};
  420. uint16_t i1 = ALGO_BinarySearch(arr, 5, 5.0);
  421. uint16_t i2 = ALGO_BinarySearch(arr, 5, 4.0);
  422. int okb1 = __aty_equal_u((uint32_t)i1, (uint32_t)3);
  423. int okb2 = __aty_equal_u((uint32_t)i2, (uint32_t)3);
  424. if(okb1) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  425. if(okb2) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  426. printf_ATY_D(" BinSearch i1 = %d, i2 = %d, %s\r\n", i1, i2, ((okb1 && okb2) ? "PASS" : "FAIL"));
  427. }
  428. {
  429. uint8_t g8 = 0; uint8_t s8 = 0xF0; ALGO_InvertUint8_Group(&g8, &s8);
  430. uint16_t g16 = 0; uint16_t s16 = 0x1234; ALGO_InvertUint16_Group(&g16, &s16);
  431. uint32_t g32 = 0; uint32_t s32 = 0x12345678; ALGO_InvertUint32_Group(&g32, &s32);
  432. int oki = __aty_equal_u((uint32_t)g8, (uint32_t)0x0Fu) && __aty_equal_u((uint32_t)g16, (uint32_t)0x2C48u) && __aty_equal_u((uint32_t)g32, (uint32_t)0x1E6A2C48u);
  433. if(oki) ALGO_AlgorithmBase_ATY_Test_Pass++; else ALGO_AlgorithmBase_ATY_Test_Fail++;
  434. printf_ATY_D(" Invert g8 = 0x%x, g16 = 0x%x, g32 = 0x%x, %s\r\n", g8, g16, g32, (oki ? "PASS" : "FAIL"));
  435. }
  436. printf_ATY_D("%sEND: Pass = %d, Fail = %d\r\n", ALGO_AlgorithmBase_ATY_TAG, ALGO_AlgorithmBase_ATY_Test_Pass, ALGO_AlgorithmBase_ATY_Test_Fail);
  437. return ALGO_AlgorithmBase_ATY_Test_Fail;
  438. }
  439. #endif /* ALGO_AlgorithmBase_ATY_Test_ATY */
  440. #endif /* __ALGO_AlgorithmBase_ATY_C */
  441. /******************************** End Of File *********************************/