xspDataOpt.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. #include "xspDataOpt.h"
  2. #include "../Hardware/boardinit.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "public.h"
  6. #include "masterslave.h"
  7. testCollDa g_testCollDa;
  8. GunStatus g_gunStatus[4]; // 抬枪信号的状态
  9. //static uint8_t g_srcDa[4][12]; // 读取的原始数据,每个port最多96位数据
  10. uint8_t g_7egDa[29] = {0};
  11. XspErrDa g_xspErrDa;
  12. uint8_t g_logbuff[128] = {0};
  13. XspDataInfo g_xspReDa; // 显示屏的记录数据
  14. Up7segData g_up7segData;
  15. XspCollDa g_xspCollDa;
  16. Error7Seg g_error7seg;
  17. NeedleTable g_neTable[128] = {
  18. {U1_ID,1,255,255},{U1_ID,0,18,5},{U1_ID,0,18,4},{U1_ID,0,18,3},{U1_ID,0,18,6},{U1_ID,1,18,6},{U1_ID,1,18,5},{U1_ID,1,18,4},//M1 P_A
  19. {U1_ID,1,255,255},{U1_ID,0,17,0},{U1_ID,0,18,7},{U1_ID,0,17,6},{U1_ID,0,17,1},{U1_ID,1,17,1},{U1_ID,1,17,0},{U1_ID,1,18,7},//M2 P_A
  20. {U1_ID,1,17,7}, {U1_ID,0,17,3},{U1_ID,0,17,2},{U1_ID,0,17,5},{U1_ID,0,17,4},{U1_ID,1,17,4},{U1_ID,1,17,3},{U1_ID,1,17,2},//M3 P_A
  21. {U1_ID,1,16,3}, {U1_ID,0,16,1},{U1_ID,0,16,0},{U1_ID,0,17,7},{U1_ID,0,16,2},{U1_ID,1,16,2},{U1_ID,1,16,1},{U1_ID,1,16,0},//M4 P_A
  22. {U1_ID,1,16,7}, {U1_ID,0,16,5},{U1_ID,0,16,4},{U1_ID,0,16,3},{U1_ID,0,16,6},{U1_ID,1,16,6},{U1_ID,1,16,5},{U1_ID,1,16,4},//M5 P_A
  23. {U1_ID,1,255,255},{U1_ID,0,15,1},{U1_ID,0,15,0},{U1_ID,0,16,7},{U1_ID,0,15,2},{U1_ID,1,15,2},{U1_ID,1,15,1},{U1_ID,1,15,0},//M6 P_A
  24. {U5_ID,0,255,255},{U5_ID,0, 2,4},{U5_ID,0, 2,5},{U5_ID,0, 2,3},{U5_ID,0, 2,2},{U5_ID,1, 2,2},{U5_ID,1, 2,4},{U5_ID,1, 2,5},//O1 P_A
  25. {U5_ID,0,255,255},{U5_ID,0, 2,0},{U5_ID,0, 2,1},{U5_ID,0, 3,7},{U5_ID,0, 3,6},{U5_ID,1, 3,6},{U5_ID,1, 2,0},{U5_ID,1, 2,1},//O2 P_A
  26. {U5_ID,0,6,0}, {U5_ID,0, 3,4},{U5_ID,0, 3,5},{U5_ID,0, 3,3},{U5_ID,0, 3,2},{U5_ID,1, 3,2},{U5_ID,1, 3,4},{U5_ID,1, 3,5},//O3 P_A
  27. {U5_ID,0,7,4}, {U5_ID,0, 6,2},{U5_ID,0, 6,3},{U5_ID,0 ,6,1},{U5_ID,1, 6,0},{U5_ID,1, 6,1},{U5_ID,1, 6,2},{U5_ID,1, 6,3},//O4 P_A
  28. {U5_ID,0,7,0}, {U5_ID,0, 7,6},{U5_ID,0, 7,7},{U5_ID,0, 7,5},{U5_ID,1, 7,4},{U5_ID,1, 7,5},{U5_ID,1, 7,6},{U5_ID,1, 7,7},//O5 P_A
  29. {U5_ID,0,255,255},{U5_ID,0, 7,2},{U5_ID,0, 7,3},{U5_ID,0, 7,1},{U5_ID,1, 7,0},{U5_ID,1, 7,1},{U5_ID,1, 7,2},{U5_ID,1, 7,3},//O6 P_A
  30. {U4_ID,0,5,7}, {U4_ID,0, 4,4},{U4_ID,0, 4,5},{U4_ID,0, 4,3},{U4_ID,0, 4,2},{U4_ID,1, 4,2},{U4_ID,1, 4,4},{U4_ID,1, 4,5},//P1 P_A
  31. {U4_ID,0,5,3}, {U4_ID,0, 4,0},{U4_ID,0, 4,1},{U4_ID,1, 5,7},{U4_ID,0, 5,6},{U4_ID,1, 5,6},{U4_ID,1, 4,0},{U4_ID,1, 4,1},//P2 P_A
  32. {U4_ID,0,6,7}, {U4_ID,0, 5,4},{U4_ID,0, 5,5},{U4_ID,1, 5,3},{U4_ID,0, 5,2},{U4_ID,1, 5,2},{U4_ID,1, 5,4},{U4_ID,1, 5,5},//P3 P_A
  33. {U4_ID,0,255,255},{U4_ID,0, 5,0},{U4_ID,0, 5,1},{U4_ID,1, 6,7},{U4_ID,0, 6,6},{U4_ID,1, 6,6},{U4_ID,1, 5,0},{U4_ID,1, 5,1},//P4 P_A
  34. };
  35. static int8_t check_segCode(uint8_t segcode,uint8_t *error)
  36. {
  37. int8_t da;
  38. switch(segcode){
  39. case 0x3E: case 0x3B: case 0x37: case 0x1F: *error = 1;
  40. case 0x3F: case 0xBF: da = 0; break; //0
  41. case 0x0E: case 0x16: *error = 1;
  42. case 0x06: case 0x86: da = 1; break; //1
  43. case 0x5A: case 0x59: case 0x53: case 0x1B: *error = 1;
  44. case 0x5B: case 0xDB: da = 2; break; //2
  45. case 0x4E: *error = 1;
  46. case 0x4F: case 0xCF: da = 3; break; //3
  47. case 0x64: case 0x62: case 0x76: *error = 1;
  48. case 0x66: case 0xE6: da = 4; break; //4
  49. case 0x6C: case 0x69: case 0x65: case 0x2D: *error = 1;
  50. case 0x6D: case 0xED: da = 5; break; //5
  51. case 0x7C: case 0x79: case 0x75: case 0x5D: *error = 1;
  52. case 0x7D: case 0xFD: da = 6; break; //6
  53. case 0x05: case 0x03: case 0x17: case 0x27: *error = 1;
  54. case 0x07: case 0x87: da = 7; break; //7
  55. case 0x7E: case 0x77: *error = 1;
  56. case 0x7F: case 0xFF: da = 8; break; //8
  57. case 0x6B: *error = 1;
  58. case 0x6F: case 0xEF: da = 9; break; //9
  59. case 0x46: da = -1; break;
  60. default: da = -1; break;
  61. }
  62. return da;
  63. }
  64. static int8_t check_segCode_first(uint8_t segcode[], Usrc7SegDa *seg, uint8_t *error)
  65. {
  66. int8_t da = 0x00;
  67. uint8_t i = 0,bpl = 0x00;
  68. uint16_t sum = 0;
  69. static uint8_t flag = 0;
  70. g_xspCollDa.bcorrect = 0;
  71. bpl = 0x00;
  72. for (i = 0; i < 16; i++) {
  73. switch (segcode[i]) {
  74. case 0x3E: case 0x3B: case 0x37: case 0x1F: *error = 1;
  75. case 0x3F: case 0xBF: seg->val[i] = 0x3F; break; //0
  76. case 0x0E: case 0x16: *error = 1;
  77. case 0x06: case 0x86: seg->val[i] = 0x06; break; //1
  78. case 0x5A: case 0x59: case 0x53: case 0x1B: *error = 1;
  79. case 0x5B: case 0xDB: seg->val[i] = 0x5B; break; //2
  80. case 0x4E: *error = 1;
  81. case 0x4F: case 0xCF: seg->val[i] = 0x4F; break; //3
  82. case 0x64: case 0x62: case 0x76: *error = 1;
  83. case 0x66: case 0xE6: seg->val[i] = 0x66; break; //4
  84. case 0x6C: case 0x69: case 0x65: case 0x2D: *error = 1;
  85. case 0x6D: case 0xED: seg->val[i] = 0x6D; break; //5
  86. case 0x7C: case 0x79: case 0x75: case 0x5D: *error = 1;
  87. case 0x7D: case 0xFD: seg->val[i] = 0x7D; break; //6
  88. case 0x05: case 0x03: case 0x17: case 0x27: *error = 1;
  89. case 0x07: case 0x87: seg->val[i] = 0x07; break; //7
  90. case 0x7E: case 0x77: *error = 1;
  91. case 0x7F: case 0xFF: seg->val[i] = 0x7F; break; //8
  92. case 0x6B: *error = 1;
  93. case 0x6F: case 0xEF: seg->val[i] = 0x6F; break; //9
  94. case 0x01: case 0x02: case 0x04: case 0x08: // 处理七段码非针的情况
  95. case 0x10: case 0x20: case 0x40:
  96. seg->val[i] = 0x00;
  97. g_xspCollDa.bcorrect |= 0x01;
  98. break;
  99. case 0x80:// 只有点的情况,不算是错误码,直接转成空即不显示
  100. seg->val[i] = 0x00;
  101. break;
  102. case 0x72: case 0x38: case 0xF2: case 0xB8: // 去掉P和L的情况
  103. *error = 1;
  104. da = -1;
  105. bpl = 0x01;
  106. break;
  107. case 0x00: // 处理没有显示的数据
  108. seg->val[i] = segcode[i];
  109. break;
  110. default:
  111. *error = 1;
  112. seg->val[i] = segcode[i];
  113. break;
  114. }
  115. sum += seg->val[i];
  116. //printf("%02x,",segcode[i]);
  117. }
  118. //printf("\n");
  119. if(bpl == 0x01) goto ERROR_END;
  120. if(da == 0x00){ // 考虑去掉P和L的情况
  121. if (sum == 0) da = -1;
  122. else da = 1;
  123. }
  124. if(*error == 0x00) return da;
  125. ERROR_END:
  126. for(i=0;i<16;i++){
  127. if(segcode[i] != g_xspErrDa.segDa[i]) {
  128. memcpy(g_xspErrDa.segDa,segcode,16);
  129. timeout_stop(&g_xspErrDa.timer);
  130. timeout_start(&g_xspErrDa.timer);
  131. flag = 1;
  132. break;
  133. }
  134. }
  135. if((g_logMsg.blogOpen == 1) && (g_logMsg.logType==LOG_TYPE_7SEG)){
  136. if(flag == 1) {
  137. g_xspErrDa.bsend = 2;
  138. flag = 0;
  139. }
  140. if(timeout_isOut(&g_logMsg.timer)){
  141. g_logMsg.blogOpen = 0;
  142. g_logMsg.logType = LOG_TYPE_NULL;
  143. timeout_stop(&g_logMsg.timer);
  144. }
  145. }
  146. else if(g_logMsg.logType == LOG_TYPE_NULL){
  147. if(timeout_isOut(&g_xspErrDa.timer) && flag == 1){
  148. for(i=0;i<16;i++){
  149. if(g_xspErrDa.lastsegDa[i] != g_xspErrDa.segDa[i]) {
  150. memcpy(g_xspErrDa.lastsegDa,g_xspErrDa.segDa,16);
  151. timeout_stop(&g_xspErrDa.timer);
  152. timeout_start(&g_xspErrDa.timer);
  153. flag = 2;
  154. break;
  155. }
  156. }
  157. if(flag == 2) g_xspErrDa.bsend = 2; // 此条记录未发送
  158. else g_xspErrDa.bsend = 1;
  159. flag = 0;
  160. }
  161. }
  162. if((segcode[0] == 0x78) &&(segcode[1]==0x5C) && (segcode[2]==0x78)) da = -1; //totl,在查询总累计的时候显示的
  163. return da;
  164. }
  165. /*-----------------------------------------------------------------------
  166. * 将映射数据转换为实际的数据
  167. * -----------------------------------------------------------------------*/
  168. #if(0)
  169. static uint8_t get_data_from_7segCode(uint8_t *segcode, dispData *tempda )
  170. {
  171. volatile uint8_t i,ret = 0,j=0,bprice = 0, bamount = 0, boil = 0;
  172. int8_t da,comDa[6] = {0},corrDa[6] = {0},bcorrDa = 0;
  173. uint8_t bsegright = 0, bright = 0, berror = 0; // 判断单价 油量 金额是否正确,0位:金额 1位:测量 2位:单价
  174. uint32_t correctAmount = 0, calAmount = 0; // 纠正后的金额,计算的金额
  175. char dastr[11] = {'\0'};
  176. float price = 0,amount =0;
  177. static uint8_t flag = 0;
  178. uint16_t sum = 0, amountadd = 0;
  179. uint8_t segcode01[16] = {0};
  180. g_xspoptDa.bcorrect = 0;
  181. if((segcode[0] == 0x72)){ // 去掉PP情况 定额加油的情况
  182. ret = 0;
  183. goto ERROR_END;
  184. }
  185. if((segcode[0] == 0x38) ) {// 去掉LL情况 定量加油的情况
  186. ret = 0;
  187. goto ERROR_END;
  188. }
  189. for(i=0;i<16;i++){// 去掉只有一个针的情况
  190. switch (segcode[i]){
  191. case 0x01: case 0x02: case 0x04: case 0x08:
  192. case 0x10: case 0x20: case 0x40: case 0x80:
  193. segcode01[i] = 0;
  194. bsegright = 1;// 错误
  195. g_xspoptDa.bcorrect |= 0x01;
  196. break;
  197. default:
  198. segcode01[i] = segcode[i];
  199. break;
  200. }
  201. if(i<6) amountadd += (segcode[i]&0x7F);
  202. sum += segcode[i];
  203. }
  204. if(sum == 0) {
  205. ret = 0;
  206. goto ERROR_END;
  207. }
  208. if(segcode01[0] != 0x00){
  209. if(segcode01[1] == 0x00 || segcode01[2] == 0x00 || segcode01[3] == 0x00){
  210. ret = 0;
  211. goto ERROR_END;
  212. }
  213. }
  214. else {
  215. if(amountadd == 0x00){
  216. ret = 0;
  217. goto ERROR_END;
  218. }
  219. }
  220. for(i=0;i<6;i++){ // 金额
  221. if(segcode01[i] == 0x00 ){ da = 0; dastr[i] = 0x30;}// value = ((value<<(i*8))|da);}
  222. else {
  223. da = check_segCode(segcode01[i],&berror);
  224. if((i==5) && (da == -1)){ // 处理金额的最后一位错误,则不处理
  225. dastr[i] = 0x30;
  226. }
  227. else if(da != -1){
  228. dastr[i] = check_segCode(segcode01[i],&berror) |0x30;
  229. }
  230. else {bamount = 1; bright |= 0x01;} // 金额错误
  231. }
  232. comDa[i] = da;
  233. }
  234. if(bamount == 0){
  235. dastr[i] = 0;
  236. tempda->amount = atol(dastr);
  237. }
  238. j = 0;
  239. for(i=6;i<12;i++,j++) { // 油量
  240. if(segcode01[i] == 0x00 ) { da = 0; dastr[i-6] = 0x30;}// value = ((value<<(j*8))|da);}
  241. else {
  242. da = check_segCode(segcode01[i],&berror);
  243. if(da != -1){
  244. dastr[i-6] = check_segCode(segcode01[i],&berror) |0x30;
  245. }
  246. else {boil = 1; bright |= 0x02 ; break;} // 油量错误
  247. }
  248. }
  249. if(boil == 0) {
  250. dastr[i-6] = 0;
  251. tempda->oil = atol(dastr);
  252. }
  253. if(0 == g_bhavePrice) {
  254. if(bamount == 0 && boil ==0){
  255. if(tempda->oil !=0) price = (float)tempda->amount/(float)tempda->oil;
  256. else price = 0;
  257. tempda->price = (uint32_t)(price*100.0+0.5);
  258. }
  259. }
  260. else {
  261. j = 0;
  262. for(i=12;i<16;i++,j++){ // 单价
  263. if(segcode01[i] == 0x00 ) { da = 0; dastr[i-12] = 0x30;}// value = ((value<<(j*8))|da);}
  264. else {
  265. da = check_segCode(segcode01[i],&berror);
  266. if(da != -1){
  267. dastr[i-12] = check_segCode(segcode01[i],&berror) |0x30;
  268. }
  269. else {bprice = 1; bright |=0x04; break;} // 单价错误
  270. }
  271. }
  272. if(bprice == 0){
  273. dastr[i-12] = 0;
  274. tempda->price = atol(dastr);
  275. }
  276. }
  277. if((bright == 0x00) &&( bsegright==0x00)) { return 1;} // 数据是正确的
  278. else if((bright == 0x00) && (bsegright == 0x01)) { // 数据除了有非针,其它情况全对
  279. ret = 1;
  280. goto ERROR_END;
  281. }
  282. else if(bright == 0x07){ret = 0;} // 全错,无法纠正
  283. else if(bright == 0x04){ // 金额和油量正确,单价错误,可以纠正
  284. ret = 1;
  285. g_xspoptDa.bcorrect |= 0x02;
  286. if(tempda->oil != 0)
  287. tempda->price = (uint32_t)((float)tempda->amount/(float)tempda->oil*100.0);
  288. else tempda->price = 0;
  289. }
  290. else if(bright == 0x02){// 金额和单价正确, 油量错误,可以纠正
  291. ret = 1;
  292. g_xspoptDa.bcorrect |= 0x02;
  293. tempda->oil = (uint32_t)((float)tempda->amount/(float)tempda->price*100.0+0.5);
  294. }
  295. else if(bright == 0x01){// 油量和单价正确, 金额错误, 可以纠正
  296. ret = 1;
  297. g_xspoptDa.bcorrect |= 0x02;
  298. amount = (float)tempda->oil/100.0 *((float)tempda->price/100.0);
  299. calAmount = (uint32_t)(amount*100); // 直接计算的
  300. correctAmount = (uint32_t)(amount+0.5)*100; // 取整后的
  301. corrDa[0] = correctAmount/100000%10;
  302. corrDa[1] = correctAmount/10000%10;
  303. corrDa[2] = correctAmount/1000%10;
  304. corrDa[3] = correctAmount/100%10;
  305. corrDa[4] = correctAmount/10%10;
  306. corrDa[5] = correctAmount%10;
  307. for(i=0;i<6;i++){
  308. if(comDa[i] == -1) continue;
  309. if(corrDa[i] != comDa[i]) {bcorrDa = 1; break;} // 不能用纠正后的数据,用直接计算的值
  310. }
  311. if(bcorrDa == 1) tempda->amount = calAmount; // 直接计算的
  312. else tempda->amount = correctAmount; // 校正后的
  313. }
  314. else {
  315. ret = 0; // 错误其中任意两个
  316. }
  317. ERROR_END:
  318. for(i=0;i<16;i++){
  319. if(segcode[i] != g_xspErrDa.segDa[i]) {
  320. memcpy(g_xspErrDa.segDa,segcode,16);
  321. timeout_stop(&g_xspErrDa.timer);
  322. timeout_start(&g_xspErrDa.timer);
  323. flag = 1;
  324. break;
  325. }
  326. }
  327. if((g_logMsg.blogOpen == 1) && (g_logMsg.logType==LOG_TYPE_7SEG)){
  328. if(flag == 1) {
  329. g_xspErrDa.bsend = 2;
  330. flag = 0;
  331. }
  332. if(timeout_isOut(&g_logMsg.timer)){
  333. g_logMsg.blogOpen = 0;
  334. g_logMsg.logType = LOG_TYPE_NULL;
  335. timeout_stop(&g_logMsg.timer);
  336. }
  337. }
  338. else if(g_logMsg.logType == LOG_TYPE_NULL){
  339. if(timeout_isOut(&g_xspErrDa.timer) && flag == 1){
  340. for(i=0;i<16;i++){
  341. if(g_xspErrDa.lastsegDa[i] != g_xspErrDa.segDa[i]) {
  342. memcpy(g_xspErrDa.lastsegDa,g_xspErrDa.segDa,16);
  343. timeout_stop(&g_xspErrDa.timer);
  344. timeout_start(&g_xspErrDa.timer);
  345. flag = 2;
  346. break;
  347. }
  348. }
  349. if(flag == 2) g_xspErrDa.bsend = 2; // 此条记录未发送
  350. else g_xspErrDa.bsend = 1;
  351. flag = 0;
  352. }
  353. }
  354. return ret;
  355. }
  356. #else
  357. uint8_t get_data_from_7segCode(Usrc7SegDa *seg, dispData *tempda)
  358. {
  359. uint8_t i = 0, berror = 0,bright = 0, ret = 1;
  360. int8_t da = 0, comDa[6] = { 0 };
  361. uint8_t bprice = 0, bamount = 0, boil = 0,corrDa[6] = { 0 }, bcorrDa = 0;
  362. uint8_t priceCnt = 0; // 单价的位数,单价必须为三个,如果为两数,则数据是错误的
  363. char amountStr[6] = {'\0'};
  364. char oilStr[6] = {'\0'};
  365. char priceStr[5] = {'\0'};
  366. uint32_t correctAmount = 0, calAmount = 0; // 纠正后的金额,计算的金额
  367. static float price = 0;
  368. float amount = 0;
  369. for (i = 0; i < 6; i++) {
  370. if (seg->da.amount[i] == 0x00) {
  371. da = 0;
  372. amountStr[i] = 0x30;
  373. if(i>0) amountStr[i-1] = 0x30;
  374. }
  375. else {
  376. da = check_segCode(seg->da.amount[i],&berror);
  377. if ((i == 5) && (da == -1)) amountStr[i] = 0x30; // 处理金额的最后一位,如果金额的最后一位是错误的,则直接变为0
  378. else if (da != -1) {
  379. amountStr[i] = da | 0x30;
  380. }
  381. else {
  382. bamount = 0x01;
  383. bright |= 0x01;
  384. }
  385. }
  386. comDa[i] = da;
  387. }
  388. if (bamount == 0) {
  389. tempda->amount = atol(amountStr);
  390. }
  391. for (i = 0; i < 6; i++) {
  392. if (seg->da.oil[i] == 0x00) {
  393. da = 0;
  394. oilStr[i] = 0x30;
  395. if(i>0) oilStr[i-1] = 0x30;
  396. }
  397. else {
  398. da = check_segCode(seg->da.oil[i], &berror);
  399. if ((i == 5) && (da == -1)) oilStr[i] = 0x30;
  400. else if (da != -1) {
  401. oilStr[i] = da | 0x30;
  402. }
  403. else {
  404. boil = 0x01;
  405. bright |= 0x02;
  406. }
  407. }
  408. }
  409. if (boil == 0) {
  410. tempda->oil = atol(oilStr);
  411. }
  412. if (0 == g_bhavePrice) { // 没有单价屏
  413. if ((bamount == 0) &&( boil == 0)) {
  414. if (tempda->oil != 0) price = (float)tempda->amount / (float)tempda->oil;
  415. else price = 0;
  416. tempda->price = (uint32_t)(price*100.0 + 0.5);
  417. }
  418. else if((bamount == 1) && (boil == 0)){ // 金额错误,油量对
  419. tempda->amount = price * tempda->oil/100;
  420. }
  421. else if((bamount == 0) && (boil == 1)){ // 金额对,油量错误
  422. if(price > 0.1)
  423. tempda->oil = (uint32_t)((float)tempda->amount / price +0.5);
  424. }
  425. }
  426. else { // 有单价屏
  427. priceCnt = 0x00;
  428. for (i = 0; i < 4; i++) {
  429. if (seg->da.price[i] == 0x00) { da = 0; priceStr[i] = 0x30; }
  430. else {
  431. priceCnt |= ((uint8_t)0x01 << (3-i));
  432. da = check_segCode(seg->da.price[i], &berror);
  433. if (da != -1) {
  434. priceStr[i] = da | 0x30;
  435. }
  436. else {
  437. bprice = 0x01;
  438. bright |= 0x04;
  439. }
  440. }
  441. }
  442. if (bprice == 0) {
  443. if(priceCnt == 0x07)
  444. tempda->price = atol(priceStr);
  445. else {
  446. bright |= 0x04;
  447. }
  448. }
  449. }
  450. if(bright == 0x00) ret = 1; // 三项全对
  451. else if (bright == 0x07) ret = 0; // 金额 油量 单价全部错误
  452. else if (bright == 0x04) { // 单价错误 金额 油量正确
  453. if (tempda->oil != 0)
  454. tempda->price = (uint32_t)((float)tempda->amount / (float)tempda->oil*100.0 + 0.5);
  455. else tempda->price = 0;
  456. g_xspCollDa.bcorrect |= 0x02;
  457. }
  458. else if (bright == 0x02) { // 油量错误 金额 单价正确
  459. if(tempda->price != 0)
  460. tempda->oil = (uint32_t)((float)tempda->amount / (float)tempda->price*100.0 + 0.5);
  461. g_xspCollDa.bcorrect |= 0x02;
  462. }
  463. else if (bright == 0x01) { // 金额错误 油量 单价正确
  464. amount = (float)tempda->oil / 100.0 *((float)tempda->price / 100.0);
  465. calAmount = (uint32_t)(amount * 100); // 直接计算的
  466. correctAmount = (uint32_t)(amount + 0.5) * 100; // 取整后的
  467. corrDa[0] = correctAmount / 100000 % 10;
  468. corrDa[1] = correctAmount / 10000 % 10;
  469. corrDa[2] = correctAmount / 1000 % 10;
  470. corrDa[3] = correctAmount / 100 % 10;
  471. corrDa[4] = correctAmount / 10 % 10;
  472. corrDa[5] = correctAmount % 10;
  473. for (i = 0; i < 6; i++) {
  474. if (comDa[i] == -1) continue;
  475. if (corrDa[i] != comDa[i]) { bcorrDa = 1; break; } // 不能用纠正后的数据,用直接计算的值
  476. }
  477. if (bcorrDa == 1) tempda->amount = calAmount; // 直接计算的
  478. else tempda->amount = correctAmount; // 校正后的
  479. g_xspCollDa.bcorrect |= 0x02;
  480. }
  481. else { // 错误其中两项,无法纠正
  482. ret = 0;
  483. }
  484. return ret;
  485. }
  486. #endif
  487. /*-------------------------------------------------------------------------------
  488. * 保存记录
  489. * -------------------------------------------------------------------------------*/
  490. void save_record_to_flash(uint8_t recordMode)
  491. {
  492. int amount = 0;
  493. // uint32_t addTime;
  494. // if(recordMode == 0x01){
  495. // addTime = g_xspCollDa.gunDnTime - g_xspCollDa.gunUpTime; // 计算加油的时间 单位ms
  496. // printf("~~~~~~~~~~~~~~addtime = %d, oil = %d\n",addTime, g_xspCollDa.curDisp.oil);
  497. // }
  498. g_xspCollDa.lastbSaveRecord = 0;
  499. if((recordMode == 0x01) &&(g_xspCollDa.bcheckDa == 0) ){//
  500. if((g_xspCollDa.curDisp.amount == 888888) || (g_xspCollDa.curDisp.oil == 888888)) return;
  501. if((g_xspCollDa.curDisp.amount == 0) || (g_xspCollDa.curDisp.oil == 0)) return ;
  502. if(g_xspCollDa.curDisp.amount >=999999 || g_xspCollDa.curDisp.oil>=999999) return;
  503. g_xspReDa.reDa.amount = g_xspCollDa.curDisp.amount;
  504. g_xspReDa.reDa.price = g_xspCollDa.curDisp.price;
  505. g_xspReDa.reDa.oil = g_xspCollDa.curDisp.oil;
  506. g_xspReDa.reDa.tamount = g_xspCollDa.lastTamout + g_xspCollDa.curDisp.amount;
  507. g_xspReDa.reDa.toil = g_xspCollDa.lastToil + g_xspCollDa.curDisp.oil;
  508. }
  509. else
  510. {
  511. if((g_xspCollDa.lastDisp.amount == 888888) || (g_xspCollDa.lastDisp.oil == 888888)) return;
  512. if((g_xspCollDa.lastDisp.amount == 0) || (g_xspCollDa.lastDisp.oil == 0)) return ;
  513. if(g_xspCollDa.lastDisp.amount == g_xspCollDa.lastDisp.oil) return;
  514. if(g_xspCollDa.lastDisp.amount >=999999 || g_xspCollDa.lastDisp.oil>=999999) return;
  515. amount = g_xspCollDa.curDisp.amount - g_xspCollDa.lastDisp.amount;
  516. if((g_xspCollDa.curDisp.amount!=0) &&(amount>0) && (amount <50)){ // 和当前的值校正一下
  517. g_xspCollDa.lastDisp.amount = g_xspCollDa.curDisp.amount;
  518. g_xspCollDa.lastDisp.oil = g_xspCollDa.curDisp.oil;
  519. }
  520. g_xspReDa.reDa.amount = g_xspCollDa.lastDisp.amount;
  521. g_xspReDa.reDa.price = g_xspCollDa.lastDisp.price;
  522. g_xspReDa.reDa.oil = g_xspCollDa.lastDisp.oil;
  523. g_xspReDa.reDa.tamount = g_xspCollDa.lastTamout + g_xspCollDa.lastDisp.amount;
  524. g_xspReDa.reDa.toil = g_xspCollDa.lastToil + g_xspCollDa.lastDisp.oil;
  525. }
  526. g_xspReDa.reDa.bcorrect = ((g_xspCollDa.bcorrect|0xFFFF)<<8);
  527. g_xspReDa.reDa.bsend = 0xFFFF;
  528. g_xspReDa.reDa.recodeMode = recordMode;
  529. g_xspReDa.reDa.timer = rtc_counter_get();// 产生记录的时间
  530. g_xspCollDa.lastTamout = g_xspReDa.reDa.tamount;
  531. g_xspCollDa.lastToil = g_xspReDa.reDa.toil;
  532. g_xspReDa.reDa.recordId = (g_xspReDa.reDa.recordId+1)%0xFFFFFFFF;
  533. write_flash(g_xspReDa.data);
  534. printf("新记录: recordId=%d, amout:%d, oil:%d, tamout:%lld, toil:%lld\r\n",g_xspReDa.reDa.recordId,\
  535. g_xspReDa.reDa.amount,g_xspReDa.reDa.oil,g_xspReDa.reDa.tamount,g_xspReDa.reDa.toil);
  536. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData)); // 存储完成后,要清除保留的数据
  537. }
  538. /*------------------------------------------------------------------------
  539. * 抬枪信号的处理
  540. * -----------------------------------------------------------------------*/
  541. void init_gun_status(void)
  542. {
  543. uint8_t i;
  544. for(i=0;i<4;i++){
  545. g_gunStatus[i].curst = HIGHT_LEVEL;
  546. g_gunStatus[i].lastst = HIGHT_LEVEL;
  547. g_gunStatus[i].timer = 0;
  548. g_gunStatus[i].bsave = 0;
  549. }
  550. g_gunSta.bGunUp = 0;
  551. timeout_setValue(&g_gunSta.guntime,2000);
  552. timeout_setValue(&g_gunSta.taigunTime,500);
  553. }
  554. void deal_gun_status(uint32_t tick)
  555. {
  556. uint8_t status;
  557. static uint8_t laststatus = 0xFF;
  558. static uint8_t count = 0;
  559. if((tick%1000) != 0) return; // 10ms处理一次
  560. if(g_xspCollDa.curstatus == STATUS_PROG) return; // 在加油过程中,不处理抬挂枪的信号
  561. status = gpio_input_bit_get(TQ_PORT,TQ_PIN);
  562. if(status != laststatus) {
  563. laststatus = status;
  564. count = 0;
  565. }
  566. else count++;
  567. if(count>=4){
  568. if(RESET == status) { // 有抬枪信号
  569. g_gunStatus[0].curst = LOW_LEVEL;
  570. g_gunStatus[0].bsave = 0;
  571. timeout_stop(&g_gunSta.guntime);
  572. }
  573. else { // 没有抬枪信号,有挂枪
  574. if(g_gunStatus[0].curst == LOW_LEVEL){
  575. g_gunStatus[0].lastst = g_gunStatus[0].curst;
  576. timeout_start(&g_gunSta.guntime); // 启动抬枪的时候
  577. g_gunStatus[0].bsave = 1;
  578. g_gunStatus[0].curst = LOW_HIGHT;
  579. }
  580. }
  581. count = 0;
  582. }
  583. }
  584. void check_gun_status_to_save_record(void)
  585. {
  586. uint8_t status;
  587. static uint8_t gunstatus = 0xFF;
  588. if(gunstatus != g_gunStatus[0].curst){
  589. printf("gunstatus = %d ", g_gunStatus[0].curst);
  590. switch(g_gunStatus[0].curst){
  591. case HIGHT_LOW: case LOW_LEVEL:
  592. if(gpio_input_bit_get(TQ_PORT,TQ_PIN)!= RESET) break;
  593. printf("抬枪\n");
  594. g_xspCollDa.gunUpTime = Get_SysTick(); // 得到抬枪的时间
  595. if((Get_SysTick() - g_xspCollDa.gunDnTime) <1000) break;
  596. if((g_xspCollDa.curstatus != STATUS_START) && (g_xspCollDa.curstatus != STATUS_PROG)){
  597. g_xspCollDa.curstatus = STATUS_START;
  598. }
  599. g_xspCollDa.gunStatus = GUN_UP;
  600. break;
  601. case LOW_HIGHT: case HIGHT_LEVEL:
  602. g_xspCollDa.gunDnTime = Get_SysTick(); // 得到挂枪的时间
  603. printf("挂枪\n");
  604. if((g_xspCollDa.gunUpTime==0)){
  605. g_gunStatus[0].bsave = 0;
  606. gunstatus = g_gunStatus[0].curst;
  607. return;
  608. }
  609. else if((g_xspCollDa.gunDnTime >= g_xspCollDa.gunUpTime)){
  610. if(g_xspCollDa.gunDnTime-g_xspCollDa.gunUpTime<1000) {
  611. printf("干扰产生的抬枪信号\n");
  612. g_gunStatus[0].bsave = 0;
  613. gunstatus = g_gunStatus[0].curst;
  614. return;
  615. }
  616. }
  617. g_xspCollDa.gunStatus = GUN_DOWN;
  618. g_xspCollDa.gunUpTime = 0;
  619. break;
  620. }
  621. gunstatus = g_gunStatus[0].curst;
  622. }
  623. status = gpio_input_bit_get(TQ_PORT,TQ_PIN);
  624. if(timeout_isOut(&g_gunSta.guntime) && (g_gunStatus[0].bsave == 1) && (g_xspCollDa.curstatus != STATUS_PROG)){
  625. if((SET == gpio_input_bit_get(TQ_PORT,TQ_PIN)) && (g_xspCollDa.bSaveRecode == 1)){
  626. printf("枪已经挂\n");
  627. g_gunSta.bGunDn = 0;
  628. save_record_to_flash(0x01);//存储数据
  629. g_xspCollDa.bSaveRecode = 0;
  630. printf("抬枪信号产生一笔新的记录\r\n");
  631. g_gunSta.bgun = 0;
  632. g_gunStatus[0].bsave = 0;
  633. g_xspCollDa.curstatus = STATUS_END;
  634. g_xspCollDa.gunUpTime = 0;
  635. g_xspCollDa.startToprog = 0;
  636. }
  637. else {
  638. printf("空抬枪,未加油\n");
  639. g_gunStatus[0].bsave = 0;
  640. g_xspCollDa.curstatus = STATUS_NULL;
  641. g_xspCollDa.gunUpTime = 0;
  642. }
  643. }
  644. }
  645. /*------------------------------------------------------------------------
  646. * 时间 30分钟没有保存记录,则保存
  647. * -----------------------------------------------------------------------*/
  648. void init_xsp_run_data(void)
  649. {
  650. timeout_setValue(&g_xspErrDa.timer,3000);
  651. timeout_setValue(&g_xspCollDa.sameTimer, 3000);
  652. g_logMsg.logType = LOG_TYPE_NULL;
  653. }
  654. /*-------------------------------------------------------------------------
  655. * 上电对比上次保存和当前屏显是否一致
  656. * 上电是只执行一次
  657. * ------------------------------------------------------------------------*/
  658. void power_up_check_last_cur(dispData *da)
  659. {
  660. return;
  661. // if((da->amount == 0) && (da->oil == 0)) g_xspoptDa.lastDawrite = 1;
  662. // else if((g_xspReDa.reDa.amount==da->amount) \
  663. // && (g_xspReDa.reDa.oil==da->oil)) { // 当前屏显和上一比存储的是一比数据,本数据已存储
  664. // g_xspoptDa.lastDawrite = 1;
  665. // g_xspCollDa.curDisp.oil = da->oil;
  666. // g_xspCollDa.curDisp.amount = da->amount;
  667. // printf("当前屏显与flash中存储的一致");
  668. // }
  669. // else g_xspoptDa.lastDawrite = 0;
  670. }
  671. void analysis_7seg_code(uint8_t _7egDa[])
  672. {
  673. uint8_t i = 0, bflag = 0,bequal = 0,bstart =0;
  674. uint8_t boil = 0, bamt = 0;
  675. uint32_t eAmount = 0, eOil = 0,tickoil,tickAm; // 用于存储差额的
  676. int8_t ret = 0;
  677. uint32_t tampTime = 0;
  678. Usrc7SegDa *src7Da = NULL, *last1 = NULL, *last2 = NULL;
  679. static dispData temp,nostart;
  680. // float price;
  681. uint16_t uprice = 0;
  682. src7Da = &g_xspCollDa.cur;
  683. last1 = &g_xspCollDa.last1;
  684. last2 = &g_xspCollDa.last2;
  685. g_error7seg.berror = 0;
  686. ret = check_segCode_first(&_7egDa[START_ID],src7Da, &g_error7seg.berror); // 2. 第一次解析
  687. if (ret == -1) {
  688. printf("采集到的7段码全部为0\n");
  689. return;
  690. }
  691. bflag = g_xspCollDa.cur.da.amount[0] | g_xspCollDa.cur.da.amount[1] | g_xspCollDa.cur.da.amount[2] | g_xspCollDa.cur.da.oil[0] | g_xspCollDa.cur.da.oil[1] | g_xspCollDa.cur.da.oil[2];
  692. if (bflag == 0x00) { // 金额 油量的高3个字节都为0(即不显示任何数)则判断是否是加油开始
  693. if(g_xspCollDa.cur.da.amount[3] == 0x3F) {bamt |=0x01;}
  694. if(g_xspCollDa.cur.da.amount[4] == 0x3F) {bamt |=0x02;}
  695. if(g_xspCollDa.cur.da.amount[5] == 0x3F) {bamt |=0x04;}
  696. if(g_xspCollDa.cur.da.oil[3] == 0x3F) {boil |= 0x01; }
  697. if(g_xspCollDa.cur.da.oil[4] == 0x3F) {boil |= 0x02; }
  698. if(g_xspCollDa.cur.da.oil[5] == 0x3F) {boil |= 0x04; }
  699. if((bamt== 0x07) && (boil == 0x07 || boil==0x06 || boil==0x05 || boil==0x03)) bstart = 1;
  700. else if((boil== 0x07) && (bamt == 0x07 || bamt==0x06 || bamt==0x05 || bamt==0x03)) bstart=1;
  701. else bstart = 0;
  702. if (bstart == 0x01) {
  703. printf("显示屏显示为0.00, 加油开始.......\n");
  704. if(g_xspCollDa.bSaveRecode == 0x01) {// 判断是否需要存储记录
  705. save_record_to_flash(0x00);
  706. printf("xsp change 00 save\n");
  707. g_xspCollDa.bSaveRecode = 0x00;
  708. }
  709. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData));
  710. memset(&g_xspCollDa.curDisp, 0, sizeof(dispData));
  711. g_xspCollDa.lastTick = Get_SysTick();
  712. g_xspCollDa.startTime = Get_SysTick();
  713. g_xspCollDa.startToprog = 0;
  714. g_xspCollDa.bcheckDa = 0;
  715. temp.amount = 0;
  716. temp.oil = 0;
  717. g_xspCollDa.curstatus = STATUS_START; // 加油开始
  718. g_xspCollDa.bstart00 = 1;
  719. }
  720. }
  721. bequal = 0;
  722. for (i = 0; i < 3; i++) {
  723. if ((src7Da->uDa.da32[i] != last1->uDa.da32[i]) && (src7Da->uDa.da32[i] != last2->uDa.da32[i])) {
  724. bequal = 1;
  725. break;
  726. }
  727. }
  728. if (bequal == 1) {
  729. memcpy(last2->val, last1->val, 16);
  730. memcpy(last1->val, src7Da->val, 16);
  731. ret = get_data_from_7segCode(src7Da, &temp);
  732. if(ret == 0) goto ERROR_END;
  733. if(((temp.oil == 0x00) && (temp.amount!= 0x00))||((temp.oil!=0)&&(temp.amount==0))) return;
  734. tampTime = Get_SysTick()-g_xspCollDa.lastcomTick;
  735. g_xspCollDa.lastcomTick = Get_SysTick();
  736. if ((g_xspCollDa.curstatus == STATUS_START) ) {
  737. if ((temp.amount > g_xspCollDa.curDisp.amount) || (temp.oil > g_xspCollDa.curDisp.oil)) {
  738. eAmount = abs((int)temp.amount - (int)g_xspCollDa.curDisp.amount);
  739. eOil = abs((int)temp.oil - (int)g_xspCollDa.curDisp.oil);
  740. //printf("aaaaaa = %d, eamout = %d, eoil = %d\n",Get_SysTick()-g_xspCollDa.lastTick,eAmount,eOil);
  741. if((eAmount < 100) && (eOil<50) && ((Get_SysTick()-g_xspCollDa.lastTick) < 500)){ //判断是额增长且时间差小于500ms
  742. g_xspCollDa.startToprog++;
  743. g_xspCollDa.lastTick = Get_SysTick();
  744. }
  745. if((g_xspCollDa.startToprog > 5)||(g_xspCollDa.gunStatus==GUN_UP)){//||(g_gunStatus[0].curst==HIGHT_LOW)||(g_gunStatus[0].curst == LOW_LEVEL)
  746. g_xspCollDa.curstatus = STATUS_PROG; // 加油过程
  747. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  748. }
  749. g_xspCollDa.bcheckDa = 0;
  750. }
  751. }
  752. else {
  753. if((temp.amount==0x00)&&(temp.oil==0x00)){
  754. //printf("ccccccccccccccccccc\n");
  755. if(g_xspCollDa.lastbSaveRecord == 0x01) {// 判断是否需要存储记录
  756. save_record_to_flash(0x00);
  757. printf("xsp change 01 save\n");
  758. g_xspCollDa.lastbSaveRecord = 0x00;
  759. }
  760. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData));
  761. memset(&g_xspCollDa.curDisp, 0, sizeof(dispData));
  762. g_xspCollDa.lastTick = Get_SysTick();
  763. g_xspCollDa.startTime = Get_SysTick();
  764. g_xspCollDa.startToprog = 0;
  765. g_xspCollDa.bcheckDa = 0;
  766. g_xspCollDa.curstatus = STATUS_START; // 加油开始
  767. }
  768. }
  769. memcpy(&g_xspCollDa.curDisp, &temp, sizeof(dispData));
  770. if (g_xspCollDa.curstatus == STATUS_PROG) { // 加油中
  771. uprice = (uint32_t)((float)temp.amount/(float)temp.oil*100.0+0.5);
  772. if ( (uprice<1200) && (temp.amount >= g_xspCollDa.lastDisp.amount) && (temp.oil >= g_xspCollDa.lastDisp.oil)) {
  773. eAmount = temp.amount - g_xspCollDa.lastDisp.amount;
  774. eOil = temp.oil - g_xspCollDa.lastDisp.oil;
  775. tickoil = ((Get_SysTick()-g_xspCollDa.lastTick)/10)+1;//*10; // 12毫秒 加10毫升的油
  776. tickoil = ((tickoil <5) ? 5: tickoil);
  777. tickAm = (uint32_t)((float)tickoil*(float)temp.price/100.00+0.5)+1;
  778. if((eAmount <= tickAm) && (eOil <=tickoil) ){
  779. memcpy(&g_xspCollDa.lastDisp1,&g_xspCollDa.lastDisp,sizeof(dispData));
  780. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  781. printf("有效,显示屏加油中.......(%010u) ", Get_SysTick());
  782. g_xspCollDa.lastTick1 = g_xspCollDa.lastTick;
  783. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  784. g_xspCollDa.bstart00 = 0;
  785. }
  786. else {
  787. printf("无效,显示屏加油中.......(%010u,%010u) ", Get_SysTick(),g_xspCollDa.lastTick);
  788. }
  789. printf("(%02d,%02d) %d,%d,%d\n",tickAm,tickoil, temp.amount, temp.oil, temp.price);
  790. g_xspCollDa.bSaveRecode = 1;
  791. }
  792. else { // 数据采集错误 ,是否可以纠正还原一下正确的数据???
  793. if((temp.amount >=g_xspCollDa.lastDisp1.amount) && (temp.oil >= g_xspCollDa.lastDisp1.oil)){
  794. eAmount = temp.amount - g_xspCollDa.lastDisp1.amount;
  795. eOil = temp.oil - g_xspCollDa.lastDisp1.oil;
  796. tickoil = ((Get_SysTick()-g_xspCollDa.lastTick1)/10)+1;//*9;
  797. tickoil = ((tickoil <5) ? 5: tickoil);
  798. tickAm = (uint32_t)((float)tickoil*(float)temp.price/100.00+0.5)+1;
  799. if((eAmount <= tickAm) && (eOil <=tickoil) ){
  800. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  801. printf("上次数据错误,这组数据矫正 %d, %d,%d\n ", temp.amount, temp.oil, temp.price);
  802. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  803. }
  804. else {
  805. printf("%d,%d\n",g_xspCollDa.lastDisp1.amount,g_xspCollDa.lastDisp1.oil);
  806. printf("abcdef~~~~~ %d,%d,%d,%d,%d\n",tickAm,tickoil,temp.amount, temp.oil, temp.price);
  807. }
  808. }
  809. else {
  810. printf("加油中,数据采集错误 ");
  811. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  812. }
  813. }
  814. g_xspCollDa.stopTime = Get_SysTick(); // 整个过程加油的停止时间
  815. g_xspCollDa.bcheckDa = 0;
  816. g_gunStatus[0].bsave = 0;
  817. }
  818. else if (g_xspCollDa.curstatus == STATUS_STOP) { // 停止后,又开始变化的,要判断一下当前的数据是继续加油还是数据的查询
  819. eAmount = abs((int)temp.amount - (int)g_xspCollDa.lastDisp.amount);
  820. eOil = abs((int)temp.oil - (int)g_xspCollDa.lastDisp.oil);
  821. if ((eAmount < 100) && (eOil < 10)) {
  822. printf("加油继续........(%010u) ", Get_SysTick());
  823. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  824. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  825. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  826. g_xspCollDa.curstatus = STATUS_PROG;
  827. g_xspCollDa.bSaveRecode = 1;
  828. }
  829. else {
  830. printf("数据查询 ");
  831. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  832. g_xspCollDa.curstatus = STATUS_CHECK;
  833. g_xspCollDa.bcheckDa = 1;
  834. }
  835. }
  836. else { // 加油停止,或是加油查询时 END, CHECK ,NULL 或是开始到加油中的转换过程
  837. printf("数据显示(%d) ",g_xspCollDa.curstatus);
  838. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  839. if(((gpio_input_bit_get(TQ_PORT,TQ_PIN)==RESET)||(tampTime<500)) &&(g_xspCollDa.bstart00==0)){ // 没有检测到00,但检测到抬枪信号的开始
  840. if ((temp.amount > nostart.amount) || (temp.oil > nostart.oil)) {
  841. eAmount = abs((int)temp.amount - (int)nostart.amount);
  842. eOil = abs((int)temp.oil - (int)nostart.oil);
  843. //printf("aaaaaa = %d, eamout = %d, eoil = %d\n",Get_SysTick()-g_xspCollDa.lastTick,eAmount,eOil);
  844. if((eAmount < 100) && (eOil<50) ){ //判断是额增长且时间差小于500ms
  845. g_xspCollDa.startToprog++;
  846. g_xspCollDa.lastTick = Get_SysTick();
  847. }
  848. else g_xspCollDa.startToprog = 0;
  849. if(g_xspCollDa.startToprog > 5){
  850. if(g_xspCollDa.lastbSaveRecord==0x01){
  851. save_record_to_flash(0x00);
  852. printf("xsp change 02 save\n");
  853. g_xspCollDa.lastbSaveRecord = 0x00;
  854. }
  855. memcpy(&g_xspCollDa.lastDisp,&temp,sizeof(dispData));
  856. g_xspCollDa.lastTick1 = g_xspCollDa.lastTick;
  857. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  858. g_xspCollDa.curstatus = STATUS_PROG; // 加油过程
  859. }
  860. g_xspCollDa.bcheckDa = 0;
  861. }
  862. memcpy(&nostart, &temp, sizeof(dispData));
  863. printf("aaaaaaaaaaaaaaaaaaa\n");
  864. }
  865. }
  866. timeout_setValue(&g_xspCollDa.sameTimer, 3000);
  867. timeout_start(&g_xspCollDa.sameTimer);
  868. }
  869. else {
  870. if (timeout_isOut(&g_xspCollDa.sameTimer)) {
  871. ret = get_data_from_7segCode(src7Da, &temp);
  872. if(ret == 0) goto ERROR_END;
  873. if (g_xspCollDa.curstatus == STATUS_PROG) {
  874. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  875. g_xspCollDa.curstatus = STATUS_STOP; // 加油停止
  876. g_xspCollDa.bstart00 = 0;
  877. g_xspCollDa.lastbSaveRecord = g_xspCollDa.bSaveRecode;
  878. }
  879. if (g_xspCollDa.curstatus == STATUS_STOP) printf("加油中止,");
  880. else if (g_xspCollDa.curstatus == STATUS_END) printf("加油结束,");
  881. else if (g_xspCollDa.curstatus == STATUS_CHECK) {
  882. printf("查询数据,");
  883. g_xspCollDa.bcheckDa = 1;
  884. }
  885. printf("显示屏数据未变化.......(%010u) ",Get_SysTick());
  886. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  887. g_xspCollDa.startToprog = 0;
  888. timeout_start(&g_xspCollDa.sameTimer);
  889. }
  890. else {
  891. if((temp.amount==0x00) && (temp.oil==0x00)){//显示屏显示00的时候,
  892. g_xspCollDa.lastTick = Get_SysTick();
  893. g_xspCollDa.startTime = Get_SysTick();
  894. }
  895. }
  896. return;
  897. }
  898. return;
  899. ERROR_END:
  900. printf("数据采集错误:");
  901. for(i=0;i<17;i++){
  902. printf("%02x,",_7egDa[i]);
  903. }
  904. printf("\n");
  905. g_xspCollDa.errorNum++;
  906. return;
  907. }
  908. void anay_7eg(void)
  909. {
  910. uint8_t i;//,j;
  911. uint8_t index,pos;//,bindex
  912. // dispData tempda;
  913. // static uint8_t bfirst = 0;
  914. // uint8_t ret = 0;
  915. memset(g_7egDa,0,sizeof(g_7egDa));
  916. if(g_devMsg.bHYdev == 0x00){
  917. for(i=0;i<g_table1027.groupNum;i++){
  918. pos = g_table1027.table[i][0]; // 片选,
  919. index = g_table1027.table[i][1]; //位
  920. if((pos >24) || (index >8)) continue; //最多24个片选,8个数据位
  921. g_7egDa[i/8+1] |= (((g_timeInfo.srcDa[pos]>>index)&0x01)<<(7-i%8));//(((g_srcDa[port][7-srcIndex]>>indexid)&0x01)<<(7-(i%8)));
  922. }
  923. }
  924. else if(g_devMsg.bHYdev == 0x01) {
  925. memcpy(g_7egDa,(char*)&g_timeInfo.srcDa[0],17);
  926. }
  927. else {
  928. for(i=0;i<g_table1027.groupNum;i++){
  929. pos = g_table1027.table[i][0]; // 片选,
  930. index = g_table1027.table[i][1]; //位
  931. if((pos >24) || (index >8)) continue; //最多24个片选,8个数据位
  932. g_7egDa[i/8+1] |= (((g_timeInfo.srcDa[pos]>>index)&0x01)<<(7-i%8));//(((g_srcDa[port][7-srcIndex]>>indexid)&0x01)<<(7-(i%8)));
  933. }
  934. }
  935. //g_7egDa[12] = 0xFE;//g_7egDa[12]&(~0x01);
  936. //g_7egDa[4] &= 0x3F;
  937. check_gun_status_to_save_record();
  938. analysis_7seg_code(g_7egDa);
  939. }
  940. void init_test_coll_data_info(uint8_t bstart)
  941. {
  942. memset(&g_testCollDa,0,sizeof(testCollDa));
  943. g_testCollDa.bTestCollDa = bstart;
  944. if(g_devMsg.bHYdev == 0x01){
  945. g_testCollDa.collTime = 20; // 100个节拍采集一次(即1ms)
  946. init_comMsg();
  947. }
  948. else
  949. g_testCollDa.collTime = 50; // 100个节拍采集一次(即1ms)
  950. }
  951. ComId _comMsg[3][2];
  952. void init_comMsg(void)
  953. {
  954. _comMsg[U5_ID][0].comPort = 8;
  955. _comMsg[U5_ID][0].comPin = 7;
  956. _comMsg[U5_ID][1].comPort = 8;
  957. _comMsg[U5_ID][1].comPin = 6;
  958. _comMsg[U1_ID][0].comPort = 15;
  959. _comMsg[U1_ID][0].comPin = 4;//5;
  960. _comMsg[U1_ID][1].comPort = 15;
  961. _comMsg[U1_ID][1].comPin = 3;
  962. _comMsg[U4_ID][0].comPort = 6;
  963. _comMsg[U4_ID][0].comPin = 5;
  964. _comMsg[U4_ID][1].comPort = 6;
  965. _comMsg[U4_ID][1].comPin = 4;
  966. }
  967. void deal_coll_data_com(void)
  968. {
  969. volatile uint16_t i = 0,j = 0,k = 0,mm = 0,m=0, dealIndex = 0;
  970. uint8_t val = 0,pos = 0,sameflag = 0,val1 = 0,bZero=0,bOne = 0;//,testi = 0;
  971. static uint8_t samecount = 0;
  972. volatile static uint16_t curIndex = 0, dealnum = 1;
  973. static uint32_t testflag = 0;
  974. uint8_t comstatus = 0;
  975. // uint8_t uid,cId,csId,pid,comval,bitval;
  976. if((g_testCollDa.collNum == g_testCollDa.dealNum)) return;
  977. if((g_testCollDa.bdealDa==0) && (g_testCollDa.collNum<2)) return;
  978. dealIndex = ((g_testCollDa.collNum == 0) ? TEST_COLL_DA_MAX_NUM: g_testCollDa.collNum);
  979. for(i=(curIndex+1);i<dealIndex;i++){
  980. if(i == dealIndex) {printf("aaaaaaaaaaaaa\n");break;}
  981. sameflag = 0;
  982. for(j=0;j<TEST_COLL_GROUP;j++){
  983. if((g_testCollDa.collDa[i-1][j]^g_testCollDa.collDa[i][j])) { // 不相同再处理位
  984. for(k = 0;k <8;k++) {
  985. val = (g_testCollDa.collDa[i][j]>>k)&0x01;
  986. pos = (j<<3) + 7- k; // j *8 + k;
  987. if(val != g_testCollDa.lastval[pos]){
  988. g_testCollDa.lastval[pos] = val;
  989. g_testCollDa.tcollNum[pos]++;
  990. }
  991. testflag++;
  992. }
  993. sameflag = 0;
  994. samecount = 0;
  995. }
  996. else {
  997. testflag += 8;
  998. sameflag++;
  999. }
  1000. }
  1001. dealnum++;
  1002. if(sameflag == (TEST_COLL_GROUP)){
  1003. memcpy(&g_testCollDa.lastDa[samecount][0],(char*)(&g_testCollDa.collDa[i][0]),TEST_COLL_GROUP);
  1004. samecount++;
  1005. }
  1006. else {
  1007. if(samecount>=SAME_GROUP) {
  1008. break;
  1009. }
  1010. }
  1011. }
  1012. if(samecount >=SAME_GROUP) {
  1013. if(i == (dealIndex)) curIndex = i-1;
  1014. else curIndex = i;
  1015. for(m=0;m<g_extimsg.groupNum;m++){
  1016. comstatus = (g_testCollDa.lastDa[0][g_extimsg.comPort[m]] >> g_extimsg.comPin[m])&0x01;
  1017. (comstatus == 0)? (bZero++) : (bOne++);
  1018. }
  1019. comstatus = ((bZero>bOne)?0:1);
  1020. memset((char*)g_timeInfo.srcDa,0,sizeof(g_timeInfo.srcDa));
  1021. for(j=0;j<TEST_COLL_GROUP;j++){
  1022. for(k = 0;k <8;k++) {
  1023. val = (g_testCollDa.lastDa[0][j]>>k)&0x01;
  1024. if(val != comstatus) val1 = 1;
  1025. else val1 = 0;
  1026. g_timeInfo.srcDa[j] |= (val1<< k);
  1027. }
  1028. }
  1029. samecount = 0;
  1030. g_testCollDa.dealNum = i;
  1031. anay_7eg();
  1032. }
  1033. else {
  1034. curIndex = i-1;// dealIndex-1;
  1035. g_testCollDa.dealNum = i;//dealIndex;
  1036. }
  1037. if((g_testCollDa.bdealDa == 0x01)&& (dealnum ==(TEST_COLL_DA_MAX_NUM))) {
  1038. // for(i=0;i<192;i++){
  1039. // //if((i%16) == 0) printf("\n");
  1040. // //printf("%03d,",g_testCollDa.tcollNum[i]);
  1041. // g_testCollDa.tcollNum[i] = 0; // 这行必须有,确定放的位置
  1042. // }
  1043. memcpy(g_testCollDa.sendCollNum,g_testCollDa.tcollNum,192);
  1044. memset(g_testCollDa.tcollNum,0,192);
  1045. g_testCollDa.bdealDa = 0;
  1046. dealnum = 1;
  1047. curIndex = 0;
  1048. g_testCollDa.dealNum = 0;
  1049. //printf("test flag %d\n",testflag);
  1050. testflag = 0;
  1051. samecount = 0;
  1052. }
  1053. }
  1054. ComSrcDa g_comSrcDa;
  1055. void deal_coll_data_HY(void)
  1056. {
  1057. volatile uint16_t i = 0,j = 0,k = 0,mm = 0, m=0,dealIndex = 0;
  1058. // uint8_t val = 0,pos = 0,sameflag = 0,val1 = 0,bZero=0,bOne = 0,testi = 0;
  1059. static uint8_t samecount = 0;
  1060. volatile static uint16_t curIndex = 0, dealnum = 1;
  1061. static uint32_t testflag = 0;
  1062. // uint8_t comstatus = 0;
  1063. uint8_t u1com0,flag;//u1com1,u4com0,u4com1,u5com0,u5com1,,valpos
  1064. uint8_t uid,cId,csId,pid,comval,bitval,num;
  1065. if((g_testCollDa.collNum == g_testCollDa.dealNum)) return;
  1066. if((g_testCollDa.bdealDa==0) && (g_testCollDa.collNum<6)) return;
  1067. dealIndex = ((g_testCollDa.collNum == 0) ? TEST_COLL_DA_MAX_NUM: g_testCollDa.collNum);
  1068. for(i=(curIndex+1);i<dealIndex;i++){
  1069. if(i == dealIndex) {printf("aaaaaaaaaaaaa\n");break;}
  1070. // sameflag = 0;
  1071. // u1com0 = (g_testCollDa.collDa[i][_comMsg[U1_ID][0].comPort] >>_comMsg[U1_ID][0].comPin)&0x01;
  1072. // u1com1 = (g_testCollDa.collDa[i][_comMsg[U1_ID][1].comPort] >>_comMsg[U1_ID][1].comPin)&0x01;
  1073. // u4com0 = (g_testCollDa.collDa[i][_comMsg[U4_ID][0].comPort] >>_comMsg[U4_ID][0].comPin)&0x01;
  1074. // u4com1 = (g_testCollDa.collDa[i][_comMsg[U4_ID][1].comPort] >>_comMsg[U4_ID][1].comPin)&0x01;
  1075. // u5com0 = (g_testCollDa.collDa[i][_comMsg[U5_ID][0].comPort] >>_comMsg[U5_ID][0].comPin)&0x01;
  1076. // u5com1 = (g_testCollDa.collDa[i][_comMsg[U5_ID][1].comPort] >>_comMsg[U5_ID][1].comPin)&0x01;
  1077. //printf("%d,%d,%d,%d,%d,%d\n",u1com0,u1com1,u4com0,u4com1,u5com0,u5com1);
  1078. for(j=0;j<3;j++){
  1079. for(k=0;k<2;k++){
  1080. flag = (0x01<<(j*2+k));
  1081. u1com0 = (g_testCollDa.collDa[i][_comMsg[U1_ID+j][k].comPort] >>_comMsg[U1_ID+j][k].comPin)&0x01;
  1082. if((u1com0 == 0x00) && (g_comSrcDa.daMsg[U1_ID+j][k].lastvl==0)&&((g_comSrcDa.flag&flag) !=flag)){
  1083. num = g_comSrcDa.daMsg[U1_ID+j][k].num;
  1084. memcpy(&g_comSrcDa.daMsg[U1_ID+j][k].tda[num][0],(char*)&g_testCollDa.collDa[i][0],TEST_COLL_GROUP);
  1085. g_comSrcDa.daMsg[U1_ID+j][k].num++;
  1086. }
  1087. else {
  1088. g_comSrcDa.daMsg[U1_ID+j][k].num = 0;
  1089. }
  1090. g_comSrcDa.daMsg[U1_ID+j][k].lastvl= u1com0;
  1091. if((g_comSrcDa.daMsg[U1_ID+j][k].num>5)&&((g_comSrcDa.flag&flag) !=flag)){
  1092. g_comSrcDa.flag |= flag;
  1093. g_comSrcDa.daMsg[U1_ID+j][k].num = 0;
  1094. //valpos = (i - g_comSrcDa.daMsg[U1_ID+j][k].startpos)/2;
  1095. memcpy(&g_comSrcDa.daMsg[U1_ID+j][k].da[0],&g_comSrcDa.daMsg[U1_ID+j][k].tda[3][0],TEST_COLL_GROUP);
  1096. //break;
  1097. }
  1098. //printf("j=%d,k=%d,num = %d,flag = %02x\n",j,k,g_comSrcDa.daMsg[U1_ID+j][k].num,g_comSrcDa.flag);
  1099. }
  1100. if(g_comSrcDa.flag == 0x3F){
  1101. break;
  1102. }
  1103. }
  1104. dealnum++;
  1105. if(g_comSrcDa.flag == 0x3F){
  1106. g_comSrcDa.flag = 0;
  1107. samecount = 4;
  1108. break;
  1109. }
  1110. }
  1111. if(samecount >=3) {
  1112. // printf("ccccccccccccc\n");
  1113. if(i == (dealIndex)) curIndex = i-1;
  1114. else curIndex = i;
  1115. memset((char*)g_timeInfo.srcDa,0,sizeof(g_timeInfo.srcDa));
  1116. for(mm=0;mm<128;mm++){
  1117. uid = g_neTable[mm].uId; // u1 u4 或 u5
  1118. cId = g_neTable[mm].comIndex; // com0 还是com1
  1119. csId = g_neTable[mm].csIndex; //
  1120. pid = g_neTable[mm].pinIndex;
  1121. if(csId ==0xFF || pid == 0xFF) continue;
  1122. comval = (g_comSrcDa.daMsg[uid][cId].da[_comMsg[uid][cId].comPort]>> _comMsg[uid][cId].comPin)&0x01;
  1123. bitval = (g_comSrcDa.daMsg[uid][cId].da[csId]>>pid)&0x01;
  1124. if(comval != bitval) g_timeInfo.srcDa[mm/8+1] |= (0x01<<(7-mm%8));
  1125. }
  1126. samecount = 0;
  1127. g_testCollDa.dealNum = i;
  1128. anay_7eg();
  1129. }
  1130. else {
  1131. curIndex = i-1;// dealIndex-1;
  1132. g_testCollDa.dealNum = i;//dealIndex;
  1133. }
  1134. if((g_testCollDa.bdealDa == 0x01)&& (dealnum ==(TEST_COLL_DA_MAX_NUM))) {
  1135. memcpy(g_testCollDa.sendCollNum,g_testCollDa.tcollNum,192);
  1136. memset(g_testCollDa.tcollNum,0,192);
  1137. g_testCollDa.bdealDa = 0;
  1138. dealnum = 1;
  1139. curIndex = 0;
  1140. g_testCollDa.dealNum = 0;
  1141. //printf("test flag %d\n",testflag);
  1142. testflag = 0;
  1143. samecount = 0;
  1144. }
  1145. }