main_old.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #define _GNU_SOURCE // 用于启用一些非标准的、GNU C 库扩展的特性,例如:<sched.h> 中的 CPU_ZERO 和 CPU_SET 函数。
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <errno.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11. #include <unistd.h>
  12. //#include <termios.h>
  13. //#include <poll.h>
  14. //#include <tq_uart.h>
  15. //#include <pthread.h>
  16. //#include <sched.h>
  17. //#include <time.h>
  18. #include "predict.h"
  19. #include <stdbool.h>
  20. #include <math.h>
  21. #include "main.h"
  22. #define CURENT_LENGTH 131 //
  23. #define AppLog(msg...) if(LogOn){printf("Log At Line[%d] >> ",__LINE__),printf(msg),printf("\n");}
  24. #define AppErr(msg...) printf("Error At Line[%d] >> ",__LINE__),printf(msg),printf("\n");
  25. unsigned char LogOn = 1;
  26. int current_data [CURENT_LENGTH];
  27. int last_data [CURENT_LENGTH];
  28. int subtraction_data[CURENT_LENGTH];
  29. bool Is_opposite_signs(int *x,int *y);
  30. int min_count_abs(int x,int *arr);
  31. void array_subtraction(int *power,int *last_arr,int *current_arr,int *subtraction_arr);
  32. // int main() {
  33. // //double arr[128] = { -1413,-1487,-1545,-1626,-2256,-2594,-2499,-2317,-2363,-2272,-2191,-2149,-2108,-2068,-1966,-1870,-1796,-1634,-1541,-1475,-1317,-1214,-1056,-912,-744,-580,-415,-268,-143,-9,137,243,410,552,687,846,983,1133,1288,1413,1498,1551,1631,2250,2598,2481,2328,2376,2274,2195,2145,2105,2052,1955,1867,1792,1629,1531,1470,1309,1213,1052,907,743,576,414,264,150,12,-131,-236,-400,-544,-680,-837,-975,-1112,-1273,-1397,-1481,-1541,-1603,-2184,-2566,-2565,-2275,-2338,-2269,-2188,-2148,-2117,-2072,-1990,-1876,-1808,-1663,-1536,-1498,-1336,-1230,-1081,-933,-771,-598,-438,-287,-161,-22,112,231,389,532,665,825,966,1106,1272,1395,1488,1544,1609,2176,2572,2586,2401,2384,2283,2195 };
  34. // init_uart ();
  35. // char num = 0;
  36. // int index;
  37. // collect_data collect_data_test;
  38. // int arr[131] = {572,76,658,-5062,-1258,986,9294,1686,274,-1832,-4292,-876,1294,6122,1420,-804,-9456,-1772,210,7318,2224,288,-1810,-8588,-1558,544,8540,1930,0,-5700,-3572,-544,1576,4762,1112,-1118,-8924,-2196,-194,1872,4034,724,-1404,-5524,-1360,894,9512,1758,-334,-7362,-2230,-998,1194,7336,1464,-728,-9058,-1804,104,6862,2442,398,-1700,-4574,-1034,442,7892,2074,96,-3126,-3894,-646,1494,4996,1174,-984,-9384,-1742,392,7650,4230,894,-1348,-6456,-1452,776,9440,1728,-272,-7344,-2302,-368,1774,4270,1550,-608,-8530,-2022,-30,5658,3494,528,-1638,-4832,-1110,1066,8682,1566,150,-1920,-4090,-800,1378,5628,1316,-928,-9528,-1816,298,7398,2198,196,-1884,-7440,-1490,670,9080,1828,-126,-6832,-2676};
  39. // //int arr[131] = { -1413,-1487,-1545,-1626,-2256,-2594,-2499,-2317,-2363,-2272,-2191,-2149,-2108,-2068,-1966,-1870,-1796,-1634,-1541,-1475,-1317,-1214,-1056,-912,-744,-580,-415,-268,-143,-9,137,243,410,552,687,846,983,1133,1288,1413,1498,1551,1631,2250,2598,2481,2328,2376,2274,2195,2145,2105,2052,1955,1867,1792,1629,1531,1470,1309,1213,1052,907,743,576,414,264,150,12,-131,-236,-400,-544,-680,-837,-975,-1112,-1273,-1397,-1481,-1541,-1603,-2184,-2566,-2565,-2275,-2338,-2269,-2188,-2148,-2117,-2072,-1990,-1876,-1808,-1663,-1536,-1498,-1336,-1230,-1081,-933,-771,-598,-438,-287,-161,-22,112,231,389,532,665,825,966,1106,1272,1395,1488,1544,1609,2176,2572,2586,2401,2384,2283,2195,1895,57,1910 };
  40. // collect_data_test.power_p = arr[128];
  41. // collect_data_test.power_q = arr[129];
  42. // collect_data_test.power_s = arr[130];
  43. // for(index = 0;index < CURENT_LENGTH;index++)
  44. // collect_data_test.current[index] = arr[index];
  45. // while (1)
  46. // {
  47. // /* code */
  48. // procecing(&num, &collect_data_test);
  49. // sleep(5);
  50. // }
  51. // }
  52. bool Is_opposite_signs(int *x,int *y)
  53. {
  54. return ((*x^*y)<0);
  55. }
  56. int min_count_abs(int x,int *arr)
  57. {
  58. if(abs(arr[x]) < abs(arr[x+1]))
  59. return x;
  60. else
  61. return x+1;
  62. }
  63. void array_subtraction(int *power,int *last_arr,int *current_arr,int *subtraction_arr){
  64. u_int8_t last_zero_node [3] = {0};
  65. u_int8_t current_zero_node [3] = {0};
  66. u_int8_t count = 0;
  67. u_int8_t node_count = 0;
  68. //printf("power is %d\n",*power);
  69. if(*power > 15){
  70. if(current_arr[0] != 0){
  71. node_count = 0;
  72. for(count = 0;count<127;count++){
  73. if(Is_opposite_signs(&current_arr[count],&current_arr[count+1])){
  74. current_zero_node[node_count]=min_count_abs(count,current_arr);
  75. node_count++;
  76. }
  77. if(node_count == 3)
  78. break;
  79. }
  80. }
  81. else{
  82. current_zero_node[0] = 0;
  83. node_count = 1;
  84. for(count = 1;count<127;count++){
  85. if(Is_opposite_signs(&current_arr[count],&current_arr[count+1])){
  86. current_zero_node[node_count]=min_count_abs(count,current_arr);
  87. node_count++;
  88. }
  89. if(node_count == 3)
  90. break;
  91. }
  92. }
  93. if(current_arr[current_zero_node[0]+3]<current_arr[current_zero_node[0]]){
  94. for(count=0;count<128;count++){
  95. if(current_arr[count]!=0)
  96. current_arr[count]= -current_arr[count];
  97. }
  98. }
  99. //AppLog("node %d is %d,node %d is %d,node %d is %d\n",current_zero_node[0],current_arr[current_zero_node[0]],current_zero_node[1],current_arr[current_zero_node[1]],current_zero_node[2],current_arr[current_zero_node[2]]);
  100. if(last_arr[0] != 0){
  101. node_count = 0;
  102. for(count = 0;count<127;count++){
  103. if(Is_opposite_signs(&last_arr[count],&last_arr[count+1])){
  104. last_zero_node[node_count]=min_count_abs(count,last_arr);
  105. node_count++;
  106. }
  107. if(node_count == 3)
  108. break;
  109. }
  110. }
  111. else{
  112. last_zero_node[0] = 0;
  113. node_count = 1;
  114. for(count = 1;count<127;count++){
  115. if(Is_opposite_signs(&last_arr[count],&last_arr[count+1])){
  116. last_zero_node[node_count]=min_count_abs(count,last_arr);
  117. node_count++;
  118. }
  119. if(node_count == 3)
  120. break;
  121. }
  122. }
  123. if(last_arr[last_zero_node[0]+3]<last_arr[last_zero_node[0]]){
  124. for(count=0;count<128;count++){
  125. if(last_arr[count]!=0)
  126. last_arr[count]= -last_arr[count];
  127. }
  128. }
  129. //AppLog("node %d is %d,node %d is %d,node %d is %d\n",last_zero_node[0],last_arr[last_zero_node[0]],last_zero_node[1],last_arr[last_zero_node[1]],last_zero_node[2],last_arr[last_zero_node[2]]);
  130. for(count=0;count<79;count++)
  131. subtraction_arr[count]=current_arr[current_zero_node[0]+count]-last_arr[last_zero_node[0]+count];
  132. for(count=79;count<128;count++)
  133. subtraction_arr[count]=subtraction_arr[count-79];
  134. }
  135. else{
  136. for(count=0;count<128;count++)
  137. subtraction_arr[count]=current_arr[count];
  138. }
  139. // printf("subtraction_data is [");
  140. // for(count=0;count<128;count++)
  141. // printf("%d,",subtraction_arr[count]);
  142. // printf("]\n");
  143. }
  144. int current_detection(int *last,int *current){
  145. if(last[0] < 15){
  146. subtraction_data[0] = current_data[0];
  147. subtraction_data[1] = current_data[1];
  148. subtraction_data[2] = current_data[2];
  149. }else{
  150. subtraction_data[0] = current_data[0] - last_data[0];
  151. subtraction_data[1] = current_data[1] - last_data[1];
  152. subtraction_data[2] = current_data[2] - last_data[2];
  153. }
  154. array_subtraction(&last[0],&last_data[3],&current_data[3],&subtraction_data[3]);
  155. int result = run_predict(subtraction_data);
  156. return result;
  157. }