xspDataOpt.c 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264
  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. if((recordMode == 0x01) &&(g_xspCollDa.bcheckDa == 0) ){//
  499. if((g_xspCollDa.curDisp.amount == 888888) || (g_xspCollDa.curDisp.oil == 888888)) return;
  500. if((g_xspCollDa.curDisp.amount == 0) || (g_xspCollDa.curDisp.oil == 0)) return ;
  501. if(g_xspCollDa.curDisp.amount >=999999 || g_xspCollDa.curDisp.oil>=999999) return;
  502. g_xspReDa.reDa.amount = g_xspCollDa.curDisp.amount;
  503. g_xspReDa.reDa.price = g_xspCollDa.curDisp.price;
  504. g_xspReDa.reDa.oil = g_xspCollDa.curDisp.oil;
  505. g_xspReDa.reDa.tamount = g_xspCollDa.lastTamout + g_xspCollDa.curDisp.amount;
  506. g_xspReDa.reDa.toil = g_xspCollDa.lastToil + g_xspCollDa.curDisp.oil;
  507. }
  508. else
  509. {
  510. if((g_xspCollDa.lastDisp.amount == 888888) || (g_xspCollDa.lastDisp.oil == 888888)) return;
  511. if((g_xspCollDa.lastDisp.amount == 0) || (g_xspCollDa.lastDisp.oil == 0)) return ;
  512. if(g_xspCollDa.lastDisp.amount == g_xspCollDa.lastDisp.oil) return;
  513. if(g_xspCollDa.lastDisp.amount >=999999 || g_xspCollDa.lastDisp.oil>=999999) return;
  514. amount = g_xspCollDa.curDisp.amount - g_xspCollDa.lastDisp.amount;
  515. if((g_xspCollDa.curDisp.amount!=0) &&(amount>0) && (amount <50)){ // 和当前的值校正一下
  516. g_xspCollDa.lastDisp.amount = g_xspCollDa.curDisp.amount;
  517. g_xspCollDa.lastDisp.oil = g_xspCollDa.curDisp.oil;
  518. }
  519. g_xspReDa.reDa.amount = g_xspCollDa.lastDisp.amount;
  520. g_xspReDa.reDa.price = g_xspCollDa.lastDisp.price;
  521. g_xspReDa.reDa.oil = g_xspCollDa.lastDisp.oil;
  522. g_xspReDa.reDa.tamount = g_xspCollDa.lastTamout + g_xspCollDa.lastDisp.amount;
  523. g_xspReDa.reDa.toil = g_xspCollDa.lastToil + g_xspCollDa.lastDisp.oil;
  524. }
  525. g_xspReDa.reDa.bcorrect = ((g_xspCollDa.bcorrect|0xFFFF)<<8);
  526. g_xspReDa.reDa.bsend = 0xFFFF;
  527. g_xspReDa.reDa.recodeMode = recordMode;
  528. g_xspReDa.reDa.timer = rtc_counter_get();// 产生记录的时间
  529. g_xspCollDa.lastTamout = g_xspReDa.reDa.tamount;
  530. g_xspCollDa.lastToil = g_xspReDa.reDa.toil;
  531. g_xspReDa.reDa.recordId = (g_xspReDa.reDa.recordId+1)%0xFFFFFFFF;
  532. write_flash(g_xspReDa.data);
  533. printf("新记录: recordId=%d, amout:%d, oil:%d, tamout:%lld, toil:%lld\r\n",g_xspReDa.reDa.recordId,\
  534. g_xspReDa.reDa.amount,g_xspReDa.reDa.oil,g_xspReDa.reDa.tamount,g_xspReDa.reDa.toil);
  535. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData)); // 存储完成后,要清除保留的数据
  536. }
  537. /*------------------------------------------------------------------------
  538. * 抬枪信号的处理
  539. * -----------------------------------------------------------------------*/
  540. void init_gun_status(void)
  541. {
  542. uint8_t i;
  543. for(i=0;i<4;i++){
  544. g_gunStatus[i].curst = HIGHT_LEVEL;
  545. g_gunStatus[i].lastst = HIGHT_LEVEL;
  546. g_gunStatus[i].timer = 0;
  547. g_gunStatus[i].bsave = 0;
  548. }
  549. g_gunSta.bGunUp = 0;
  550. timeout_setValue(&g_gunSta.guntime,2000);
  551. timeout_setValue(&g_gunSta.taigunTime,500);
  552. }
  553. void deal_gun_status(uint32_t tick)
  554. {
  555. uint8_t status;
  556. static uint8_t laststatus = 0xFF;
  557. static uint8_t count = 0;
  558. if((tick%1000) != 0) return; // 10ms处理一次
  559. if(g_xspCollDa.curstatus == STATUS_PROG) return; // 在加油过程中,不处理抬挂枪的信号
  560. status = gpio_input_bit_get(TQ_PORT,TQ_PIN);
  561. if(status != laststatus) {
  562. laststatus = status;
  563. count = 0;
  564. }
  565. else count++;
  566. if(count>=4){
  567. if(RESET == status) { // 有抬枪信号
  568. g_gunStatus[0].curst = LOW_LEVEL;
  569. g_gunStatus[0].bsave = 0;
  570. timeout_stop(&g_gunSta.guntime);
  571. }
  572. else { // 没有抬枪信号,有挂枪
  573. if(g_gunStatus[0].curst == LOW_LEVEL){
  574. g_gunStatus[0].lastst = g_gunStatus[0].curst;
  575. timeout_start(&g_gunSta.guntime); // 启动抬枪的时候
  576. g_gunStatus[0].bsave = 1;
  577. g_gunStatus[0].curst = LOW_HIGHT;
  578. }
  579. }
  580. count = 0;
  581. }
  582. }
  583. void check_gun_status_to_save_record(void)
  584. {
  585. uint8_t status;
  586. static uint8_t gunstatus = 0xFF;
  587. if(gunstatus != g_gunStatus[0].curst){
  588. printf("gunstatus = %d ", g_gunStatus[0].curst);
  589. switch(g_gunStatus[0].curst){
  590. case HIGHT_LOW: case LOW_LEVEL:
  591. if(gpio_input_bit_get(TQ_PORT,TQ_PIN)!= RESET) break;
  592. printf("抬枪\n");
  593. g_xspCollDa.gunUpTime = Get_SysTick(); // 得到抬枪的时间
  594. if((Get_SysTick() - g_xspCollDa.gunDnTime) <1000) break;
  595. if((g_xspCollDa.curstatus != STATUS_START) && (g_xspCollDa.curstatus != STATUS_PROG)){
  596. g_xspCollDa.curstatus = STATUS_START;
  597. }
  598. g_xspCollDa.gunStatus = GUN_UP;
  599. break;
  600. case LOW_HIGHT: case HIGHT_LEVEL:
  601. g_xspCollDa.gunDnTime = Get_SysTick(); // 得到挂枪的时间
  602. printf("挂枪\n");
  603. if((g_xspCollDa.gunUpTime==0)){
  604. g_gunStatus[0].bsave = 0;
  605. gunstatus = g_gunStatus[0].curst;
  606. return;
  607. }
  608. else if((g_xspCollDa.gunDnTime >= g_xspCollDa.gunUpTime)){
  609. if(g_xspCollDa.gunDnTime-g_xspCollDa.gunUpTime<1000) {
  610. printf("干扰产生的抬枪信号\n");
  611. g_gunStatus[0].bsave = 0;
  612. gunstatus = g_gunStatus[0].curst;
  613. return;
  614. }
  615. }
  616. g_xspCollDa.gunStatus = GUN_DOWN;
  617. g_xspCollDa.gunUpTime = 0;
  618. break;
  619. }
  620. gunstatus = g_gunStatus[0].curst;
  621. }
  622. status = gpio_input_bit_get(TQ_PORT,TQ_PIN);
  623. if(timeout_isOut(&g_gunSta.guntime) && (g_gunStatus[0].bsave == 1) && (g_xspCollDa.curstatus != STATUS_PROG)){
  624. if((SET == gpio_input_bit_get(TQ_PORT,TQ_PIN)) && (g_xspCollDa.bSaveRecode == 1)){
  625. printf("枪已经挂\n");
  626. g_gunSta.bGunDn = 0;
  627. save_record_to_flash(0x01);//存储数据
  628. g_xspCollDa.bSaveRecode = 0;
  629. printf("抬枪信号产生一笔新的记录\r\n");
  630. g_gunSta.bgun = 0;
  631. g_gunStatus[0].bsave = 0;
  632. g_xspCollDa.curstatus = STATUS_END;
  633. g_xspCollDa.gunUpTime = 0;
  634. g_xspCollDa.startToprog = 0;
  635. }
  636. else {
  637. printf("空抬枪,未加油\n");
  638. g_gunStatus[0].bsave = 0;
  639. g_xspCollDa.curstatus = STATUS_NULL;
  640. g_xspCollDa.gunUpTime = 0;
  641. }
  642. }
  643. }
  644. /*------------------------------------------------------------------------
  645. * 时间 30分钟没有保存记录,则保存
  646. * -----------------------------------------------------------------------*/
  647. void init_xsp_run_data(void)
  648. {
  649. timeout_setValue(&g_xspErrDa.timer,3000);
  650. timeout_setValue(&g_xspCollDa.sameTimer, 3000);
  651. g_logMsg.logType = LOG_TYPE_NULL;
  652. }
  653. /*-------------------------------------------------------------------------
  654. * 上电对比上次保存和当前屏显是否一致
  655. * 上电是只执行一次
  656. * ------------------------------------------------------------------------*/
  657. void power_up_check_last_cur(dispData *da)
  658. {
  659. return;
  660. // if((da->amount == 0) && (da->oil == 0)) g_xspoptDa.lastDawrite = 1;
  661. // else if((g_xspReDa.reDa.amount==da->amount) \
  662. // && (g_xspReDa.reDa.oil==da->oil)) { // 当前屏显和上一比存储的是一比数据,本数据已存储
  663. // g_xspoptDa.lastDawrite = 1;
  664. // g_xspCollDa.curDisp.oil = da->oil;
  665. // g_xspCollDa.curDisp.amount = da->amount;
  666. // printf("当前屏显与flash中存储的一致");
  667. // }
  668. // else g_xspoptDa.lastDawrite = 0;
  669. }
  670. void analysis_7seg_code(uint8_t _7egDa[])
  671. {
  672. uint8_t i = 0, bflag = 0,bequal = 0,bstart =0;
  673. uint8_t boil = 0, bamt = 0;
  674. uint32_t eAmount = 0, eOil = 0,tickoil,tickAm; // 用于存储差额的
  675. int8_t ret = 0;
  676. uint32_t tampTime = 0;
  677. Usrc7SegDa *src7Da = NULL, *last1 = NULL, *last2 = NULL;
  678. static dispData temp,nostart;
  679. // float price;
  680. uint16_t uprice = 0;
  681. src7Da = &g_xspCollDa.cur;
  682. last1 = &g_xspCollDa.last1;
  683. last2 = &g_xspCollDa.last2;
  684. g_error7seg.berror = 0;
  685. ret = check_segCode_first(&_7egDa[START_ID],src7Da, &g_error7seg.berror); // 2. 第一次解析
  686. if (ret == -1) {
  687. printf("采集到的7段码全部为0\n");
  688. return;
  689. }
  690. 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];
  691. if (bflag == 0x00) { // 金额 油量的高3个字节都为0(即不显示任何数)则判断是否是加油开始
  692. if(g_xspCollDa.cur.da.amount[3] == 0x3F) {bamt |=0x01;}
  693. if(g_xspCollDa.cur.da.amount[4] == 0x3F) {bamt |=0x02;}
  694. if(g_xspCollDa.cur.da.amount[5] == 0x3F) {bamt |=0x04;}
  695. if(g_xspCollDa.cur.da.oil[3] == 0x3F) {boil |= 0x01; }
  696. if(g_xspCollDa.cur.da.oil[4] == 0x3F) {boil |= 0x02; }
  697. if(g_xspCollDa.cur.da.oil[5] == 0x3F) {boil |= 0x04; }
  698. if((bamt== 0x07) && (boil == 0x07 || boil==0x06 || boil==0x05 || boil==0x03)) bstart = 1;
  699. else if((boil== 0x07) && (bamt == 0x07 || bamt==0x06 || bamt==0x05 || bamt==0x03)) bstart=1;
  700. else bstart = 0;
  701. if (bstart == 0x01) {
  702. printf("显示屏显示为0.00, 加油开始.......\n");
  703. if(g_xspCollDa.bSaveRecode == 0x01) {// 判断是否需要存储记录
  704. save_record_to_flash(0x00);
  705. g_xspCollDa.bSaveRecode = 0x00;
  706. }
  707. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData));
  708. memset(&g_xspCollDa.curDisp, 0, sizeof(dispData));
  709. g_xspCollDa.lastTick = Get_SysTick();
  710. g_xspCollDa.startTime = Get_SysTick();
  711. g_xspCollDa.startToprog = 0;
  712. g_xspCollDa.bcheckDa = 0;
  713. temp.amount = 0;
  714. temp.oil = 0;
  715. g_xspCollDa.curstatus = STATUS_START; // 加油开始
  716. g_xspCollDa.bstart00 = 1;
  717. }
  718. }
  719. bequal = 0;
  720. for (i = 0; i < 3; i++) {
  721. if ((src7Da->uDa.da32[i] != last1->uDa.da32[i]) && (src7Da->uDa.da32[i] != last2->uDa.da32[i])) {
  722. bequal = 1;
  723. break;
  724. }
  725. }
  726. if (bequal == 1) {
  727. memcpy(last2->val, last1->val, 16);
  728. memcpy(last1->val, src7Da->val, 16);
  729. ret = get_data_from_7segCode(src7Da, &temp);
  730. if(ret == 0) goto ERROR_END;
  731. if(((temp.oil == 0x00) && (temp.amount!= 0x00))||((temp.oil!=0)&&(temp.amount==0))) return;
  732. tampTime = Get_SysTick()-g_xspCollDa.lastcomTick;
  733. g_xspCollDa.lastcomTick = Get_SysTick();
  734. if ((g_xspCollDa.curstatus == STATUS_START) ) {
  735. if ((temp.amount > g_xspCollDa.curDisp.amount) || (temp.oil > g_xspCollDa.curDisp.oil)) {
  736. eAmount = abs((int)temp.amount - (int)g_xspCollDa.curDisp.amount);
  737. eOil = abs((int)temp.oil - (int)g_xspCollDa.curDisp.oil);
  738. //printf("aaaaaa = %d, eamout = %d, eoil = %d\n",Get_SysTick()-g_xspCollDa.lastTick,eAmount,eOil);
  739. if((eAmount < 100) && (eOil<50) && ((Get_SysTick()-g_xspCollDa.lastTick) < 500)){ //判断是额增长且时间差小于500ms
  740. g_xspCollDa.startToprog++;
  741. g_xspCollDa.lastTick = Get_SysTick();
  742. }
  743. if((g_xspCollDa.startToprog > 5)||(g_xspCollDa.gunStatus==GUN_UP)){//||(g_gunStatus[0].curst==HIGHT_LOW)||(g_gunStatus[0].curst == LOW_LEVEL)
  744. g_xspCollDa.curstatus = STATUS_PROG; // 加油过程
  745. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  746. }
  747. g_xspCollDa.bcheckDa = 0;
  748. }
  749. }
  750. else {
  751. if((temp.amount==0x00)&&(temp.oil==0x00)){
  752. //printf("ccccccccccccccccccc\n");
  753. if(g_xspCollDa.bSaveRecode == 0x01) {// 判断是否需要存储记录
  754. save_record_to_flash(0x00);
  755. g_xspCollDa.bSaveRecode = 0x00;
  756. }
  757. memset(&g_xspCollDa.lastDisp, 0, sizeof(dispData));
  758. memset(&g_xspCollDa.curDisp, 0, sizeof(dispData));
  759. g_xspCollDa.lastTick = Get_SysTick();
  760. g_xspCollDa.startTime = Get_SysTick();
  761. g_xspCollDa.startToprog = 0;
  762. g_xspCollDa.bcheckDa = 0;
  763. g_xspCollDa.curstatus = STATUS_START; // 加油开始
  764. }
  765. }
  766. memcpy(&g_xspCollDa.curDisp, &temp, sizeof(dispData));
  767. if (g_xspCollDa.curstatus == STATUS_PROG) { // 加油中
  768. uprice = (uint32_t)((float)temp.amount/(float)temp.oil*100.0+0.5);
  769. if ( (uprice<1200) && (temp.amount >= g_xspCollDa.lastDisp.amount) && (temp.oil >= g_xspCollDa.lastDisp.oil)) {
  770. eAmount = temp.amount - g_xspCollDa.lastDisp.amount;
  771. eOil = temp.oil - g_xspCollDa.lastDisp.oil;
  772. tickoil = ((Get_SysTick()-g_xspCollDa.lastTick)/10)+1;//*10; // 12毫秒 加10毫升的油
  773. tickoil = ((tickoil <5) ? 5: tickoil);
  774. tickAm = (uint32_t)((float)tickoil*(float)temp.price/100.00+0.5)+1;
  775. if((eAmount <= tickAm) && (eOil <=tickoil) ){
  776. memcpy(&g_xspCollDa.lastDisp1,&g_xspCollDa.lastDisp,sizeof(dispData));
  777. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  778. printf("有效,显示屏加油中.......(%010u) ", Get_SysTick());
  779. g_xspCollDa.lastTick1 = g_xspCollDa.lastTick;
  780. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  781. g_xspCollDa.bstart00 = 0;
  782. }
  783. else {
  784. printf("无效,显示屏加油中.......(%010u,%010u) ", Get_SysTick(),g_xspCollDa.lastTick);
  785. }
  786. printf("(%02d,%02d) %d,%d,%d\n",tickAm,tickoil, temp.amount, temp.oil, temp.price);
  787. g_xspCollDa.bSaveRecode = 1;
  788. }
  789. else { // 数据采集错误 ,是否可以纠正还原一下正确的数据???
  790. if((temp.amount >=g_xspCollDa.lastDisp1.amount) && (temp.oil >= g_xspCollDa.lastDisp1.oil)){
  791. eAmount = temp.amount - g_xspCollDa.lastDisp1.amount;
  792. eOil = temp.oil - g_xspCollDa.lastDisp1.oil;
  793. tickoil = ((Get_SysTick()-g_xspCollDa.lastTick1)/10)+1;//*9;
  794. tickoil = ((tickoil <5) ? 5: tickoil);
  795. tickAm = (uint32_t)((float)tickoil*(float)temp.price/100.00+0.5)+1;
  796. if((eAmount <= tickAm) && (eOil <=tickoil) ){
  797. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  798. printf("上次数据错误,这组数据矫正 %d, %d,%d\n ", temp.amount, temp.oil, temp.price);
  799. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  800. }
  801. else {
  802. printf("%d,%d\n",g_xspCollDa.lastDisp1.amount,g_xspCollDa.lastDisp1.oil);
  803. printf("abcdef~~~~~ %d,%d,%d,%d,%d\n",tickAm,tickoil,temp.amount, temp.oil, temp.price);
  804. }
  805. }
  806. else {
  807. printf("加油中,数据采集错误 ");
  808. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  809. }
  810. }
  811. g_xspCollDa.stopTime = Get_SysTick(); // 整个过程加油的停止时间
  812. g_xspCollDa.bcheckDa = 0;
  813. g_gunStatus[0].bsave = 0;
  814. }
  815. else if (g_xspCollDa.curstatus == STATUS_STOP) { // 停止后,又开始变化的,要判断一下当前的数据是继续加油还是数据的查询
  816. eAmount = abs((int)temp.amount - (int)g_xspCollDa.lastDisp.amount);
  817. eOil = abs((int)temp.oil - (int)g_xspCollDa.lastDisp.oil);
  818. if ((eAmount < 100) && (eOil < 10)) {
  819. printf("加油继续........(%010u) ", Get_SysTick());
  820. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  821. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  822. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  823. g_xspCollDa.curstatus = STATUS_PROG;
  824. g_xspCollDa.bSaveRecode = 1;
  825. }
  826. else {
  827. printf("数据查询 ");
  828. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  829. g_xspCollDa.curstatus = STATUS_CHECK;
  830. g_xspCollDa.bcheckDa = 1;
  831. }
  832. }
  833. else { // 加油停止,或是加油查询时 END, CHECK ,NULL 或是开始到加油中的转换过程
  834. printf("数据显示(%d) ",g_xspCollDa.curstatus);
  835. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  836. if(((gpio_input_bit_get(TQ_PORT,TQ_PIN)==RESET)||(tampTime<500)) &&(g_xspCollDa.bstart00==0)){ // 没有检测到00,但检测到抬枪信号的开始
  837. if ((temp.amount > nostart.amount) || (temp.oil > nostart.oil)) {
  838. eAmount = abs((int)temp.amount - (int)nostart.amount);
  839. eOil = abs((int)temp.oil - (int)nostart.oil);
  840. //printf("aaaaaa = %d, eamout = %d, eoil = %d\n",Get_SysTick()-g_xspCollDa.lastTick,eAmount,eOil);
  841. if((eAmount < 100) && (eOil<50) ){ //判断是额增长且时间差小于500ms
  842. g_xspCollDa.startToprog++;
  843. g_xspCollDa.lastTick = Get_SysTick();
  844. }
  845. else g_xspCollDa.startToprog = 0;
  846. if(g_xspCollDa.startToprog > 5){
  847. if(g_xspCollDa.bSaveRecode==0x01){
  848. save_record_to_flash(0x00);
  849. g_xspCollDa.bSaveRecode = 0x00;
  850. }
  851. memcpy(&g_xspCollDa.lastDisp,&temp,sizeof(dispData));
  852. g_xspCollDa.lastTick1 = g_xspCollDa.lastTick;
  853. g_xspCollDa.lastTick = Get_SysTick(); // 只有在加油时,记录时间戳
  854. g_xspCollDa.curstatus = STATUS_PROG; // 加油过程
  855. }
  856. g_xspCollDa.bcheckDa = 0;
  857. }
  858. memcpy(&nostart, &temp, sizeof(dispData));
  859. printf("aaaaaaaaaaaaaaaaaaa\n");
  860. }
  861. }
  862. timeout_setValue(&g_xspCollDa.sameTimer, 3000);
  863. timeout_start(&g_xspCollDa.sameTimer);
  864. }
  865. else {
  866. if (timeout_isOut(&g_xspCollDa.sameTimer)) {
  867. ret = get_data_from_7segCode(src7Da, &temp);
  868. if(ret == 0) goto ERROR_END;
  869. if (g_xspCollDa.curstatus == STATUS_PROG) {
  870. memcpy(&g_xspCollDa.lastDisp, &temp, sizeof(dispData));
  871. g_xspCollDa.curstatus = STATUS_STOP; // 加油停止
  872. g_xspCollDa.bstart00 = 0;
  873. }
  874. if (g_xspCollDa.curstatus == STATUS_STOP) printf("加油中止,");
  875. else if (g_xspCollDa.curstatus == STATUS_END) printf("加油结束,");
  876. else if (g_xspCollDa.curstatus == STATUS_CHECK) {
  877. printf("查询数据,");
  878. g_xspCollDa.bcheckDa = 1;
  879. }
  880. printf("显示屏数据未变化.......(%010u) ",Get_SysTick());
  881. printf("%d,%d,%d\n", temp.amount, temp.oil, temp.price);
  882. g_xspCollDa.startToprog = 0;
  883. timeout_start(&g_xspCollDa.sameTimer);
  884. }
  885. else {
  886. if((temp.amount==0x00) && (temp.oil==0x00)){//显示屏显示00的时候,
  887. g_xspCollDa.lastTick = Get_SysTick();
  888. g_xspCollDa.startTime = Get_SysTick();
  889. }
  890. }
  891. return;
  892. }
  893. return;
  894. ERROR_END:
  895. printf("数据采集错误:");
  896. for(i=0;i<17;i++){
  897. printf("%02x,",_7egDa[i]);
  898. }
  899. printf("\n");
  900. g_xspCollDa.errorNum++;
  901. return;
  902. }
  903. void anay_7eg(void)
  904. {
  905. uint8_t i;//,j;
  906. uint8_t index,pos;//,bindex
  907. // dispData tempda;
  908. // static uint8_t bfirst = 0;
  909. // uint8_t ret = 0;
  910. memset(g_7egDa,0,sizeof(g_7egDa));
  911. if(g_devMsg.bHYdev == 0x00){
  912. for(i=0;i<g_table1027.groupNum;i++){
  913. pos = g_table1027.table[i][0]; // 片选,
  914. index = g_table1027.table[i][1]; //位
  915. if((pos >24) || (index >8)) continue; //最多24个片选,8个数据位
  916. g_7egDa[i/8+1] |= (((g_timeInfo.srcDa[pos]>>index)&0x01)<<(7-i%8));//(((g_srcDa[port][7-srcIndex]>>indexid)&0x01)<<(7-(i%8)));
  917. }
  918. }
  919. else if(g_devMsg.bHYdev == 0x01) {
  920. memcpy(g_7egDa,(char*)&g_timeInfo.srcDa[0],17);
  921. }
  922. else {
  923. for(i=0;i<g_table1027.groupNum;i++){
  924. pos = g_table1027.table[i][0]; // 片选,
  925. index = g_table1027.table[i][1]; //位
  926. if((pos >24) || (index >8)) continue; //最多24个片选,8个数据位
  927. g_7egDa[i/8+1] |= (((g_timeInfo.srcDa[pos]>>index)&0x01)<<(7-i%8));//(((g_srcDa[port][7-srcIndex]>>indexid)&0x01)<<(7-(i%8)));
  928. }
  929. }
  930. //g_7egDa[12] = 0xFE;//g_7egDa[12]&(~0x01);
  931. //g_7egDa[4] &= 0x3F;
  932. check_gun_status_to_save_record();
  933. analysis_7seg_code(g_7egDa);
  934. }
  935. void init_test_coll_data_info(uint8_t bstart)
  936. {
  937. memset(&g_testCollDa,0,sizeof(testCollDa));
  938. g_testCollDa.bTestCollDa = bstart;
  939. if(g_devMsg.bHYdev == 0x01){
  940. g_testCollDa.collTime = 20; // 100个节拍采集一次(即1ms)
  941. init_comMsg();
  942. }
  943. else
  944. g_testCollDa.collTime = 50; // 100个节拍采集一次(即1ms)
  945. }
  946. ComId _comMsg[3][2];
  947. void init_comMsg(void)
  948. {
  949. _comMsg[U5_ID][0].comPort = 8;
  950. _comMsg[U5_ID][0].comPin = 7;
  951. _comMsg[U5_ID][1].comPort = 8;
  952. _comMsg[U5_ID][1].comPin = 6;
  953. _comMsg[U1_ID][0].comPort = 15;
  954. _comMsg[U1_ID][0].comPin = 4;//5;
  955. _comMsg[U1_ID][1].comPort = 15;
  956. _comMsg[U1_ID][1].comPin = 3;
  957. _comMsg[U4_ID][0].comPort = 6;
  958. _comMsg[U4_ID][0].comPin = 5;
  959. _comMsg[U4_ID][1].comPort = 6;
  960. _comMsg[U4_ID][1].comPin = 4;
  961. }
  962. void deal_coll_data_com(void)
  963. {
  964. volatile uint16_t i = 0,j = 0,k = 0,mm = 0,m=0, dealIndex = 0;
  965. uint8_t val = 0,pos = 0,sameflag = 0,val1 = 0,bZero=0,bOne = 0;//,testi = 0;
  966. static uint8_t samecount = 0;
  967. volatile static uint16_t curIndex = 0, dealnum = 1;
  968. static uint32_t testflag = 0;
  969. uint8_t comstatus = 0;
  970. // uint8_t uid,cId,csId,pid,comval,bitval;
  971. if((g_testCollDa.collNum == g_testCollDa.dealNum)) return;
  972. if((g_testCollDa.bdealDa==0) && (g_testCollDa.collNum<2)) return;
  973. dealIndex = ((g_testCollDa.collNum == 0) ? TEST_COLL_DA_MAX_NUM: g_testCollDa.collNum);
  974. for(i=(curIndex+1);i<dealIndex;i++){
  975. if(i == dealIndex) {printf("aaaaaaaaaaaaa\n");break;}
  976. sameflag = 0;
  977. for(j=0;j<TEST_COLL_GROUP;j++){
  978. if((g_testCollDa.collDa[i-1][j]^g_testCollDa.collDa[i][j])) { // 不相同再处理位
  979. for(k = 0;k <8;k++) {
  980. val = (g_testCollDa.collDa[i][j]>>k)&0x01;
  981. pos = (j<<3) + 7- k; // j *8 + k;
  982. if(val != g_testCollDa.lastval[pos]){
  983. g_testCollDa.lastval[pos] = val;
  984. g_testCollDa.tcollNum[pos]++;
  985. }
  986. testflag++;
  987. }
  988. sameflag = 0;
  989. samecount = 0;
  990. }
  991. else {
  992. testflag += 8;
  993. sameflag++;
  994. }
  995. }
  996. dealnum++;
  997. if(sameflag == (TEST_COLL_GROUP)){
  998. memcpy(&g_testCollDa.lastDa[samecount][0],(char*)(&g_testCollDa.collDa[i][0]),TEST_COLL_GROUP);
  999. samecount++;
  1000. }
  1001. else {
  1002. if(samecount>=SAME_GROUP) {
  1003. break;
  1004. }
  1005. }
  1006. }
  1007. if(samecount >=SAME_GROUP) {
  1008. if(i == (dealIndex)) curIndex = i-1;
  1009. else curIndex = i;
  1010. for(m=0;m<g_extimsg.groupNum;m++){
  1011. comstatus = (g_testCollDa.lastDa[0][g_extimsg.comPort[m]] >> g_extimsg.comPin[m])&0x01;
  1012. (comstatus == 0)? (bZero++) : (bOne++);
  1013. }
  1014. comstatus = ((bZero>bOne)?0:1);
  1015. memset((char*)g_timeInfo.srcDa,0,sizeof(g_timeInfo.srcDa));
  1016. for(j=0;j<TEST_COLL_GROUP;j++){
  1017. for(k = 0;k <8;k++) {
  1018. val = (g_testCollDa.lastDa[0][j]>>k)&0x01;
  1019. if(val != comstatus) val1 = 1;
  1020. else val1 = 0;
  1021. g_timeInfo.srcDa[j] |= (val1<< k);
  1022. }
  1023. }
  1024. samecount = 0;
  1025. g_testCollDa.dealNum = i;
  1026. anay_7eg();
  1027. }
  1028. else {
  1029. curIndex = i-1;// dealIndex-1;
  1030. g_testCollDa.dealNum = i;//dealIndex;
  1031. }
  1032. if((g_testCollDa.bdealDa == 0x01)&& (dealnum ==(TEST_COLL_DA_MAX_NUM))) {
  1033. // for(i=0;i<192;i++){
  1034. // //if((i%16) == 0) printf("\n");
  1035. // //printf("%03d,",g_testCollDa.tcollNum[i]);
  1036. // g_testCollDa.tcollNum[i] = 0; // 这行必须有,确定放的位置
  1037. // }
  1038. memcpy(g_testCollDa.sendCollNum,g_testCollDa.tcollNum,192);
  1039. memset(g_testCollDa.tcollNum,0,192);
  1040. g_testCollDa.bdealDa = 0;
  1041. dealnum = 1;
  1042. curIndex = 0;
  1043. g_testCollDa.dealNum = 0;
  1044. //printf("test flag %d\n",testflag);
  1045. testflag = 0;
  1046. samecount = 0;
  1047. }
  1048. }
  1049. ComSrcDa g_comSrcDa;
  1050. void deal_coll_data_HY(void)
  1051. {
  1052. volatile uint16_t i = 0,j = 0,k = 0,mm = 0, m=0,dealIndex = 0;
  1053. // uint8_t val = 0,pos = 0,sameflag = 0,val1 = 0,bZero=0,bOne = 0,testi = 0;
  1054. static uint8_t samecount = 0;
  1055. volatile static uint16_t curIndex = 0, dealnum = 1;
  1056. static uint32_t testflag = 0;
  1057. // uint8_t comstatus = 0;
  1058. uint8_t u1com0,flag;//u1com1,u4com0,u4com1,u5com0,u5com1,,valpos
  1059. uint8_t uid,cId,csId,pid,comval,bitval,num;
  1060. if((g_testCollDa.collNum == g_testCollDa.dealNum)) return;
  1061. if((g_testCollDa.bdealDa==0) && (g_testCollDa.collNum<6)) return;
  1062. dealIndex = ((g_testCollDa.collNum == 0) ? TEST_COLL_DA_MAX_NUM: g_testCollDa.collNum);
  1063. for(i=(curIndex+1);i<dealIndex;i++){
  1064. if(i == dealIndex) {printf("aaaaaaaaaaaaa\n");break;}
  1065. // sameflag = 0;
  1066. // u1com0 = (g_testCollDa.collDa[i][_comMsg[U1_ID][0].comPort] >>_comMsg[U1_ID][0].comPin)&0x01;
  1067. // u1com1 = (g_testCollDa.collDa[i][_comMsg[U1_ID][1].comPort] >>_comMsg[U1_ID][1].comPin)&0x01;
  1068. // u4com0 = (g_testCollDa.collDa[i][_comMsg[U4_ID][0].comPort] >>_comMsg[U4_ID][0].comPin)&0x01;
  1069. // u4com1 = (g_testCollDa.collDa[i][_comMsg[U4_ID][1].comPort] >>_comMsg[U4_ID][1].comPin)&0x01;
  1070. // u5com0 = (g_testCollDa.collDa[i][_comMsg[U5_ID][0].comPort] >>_comMsg[U5_ID][0].comPin)&0x01;
  1071. // u5com1 = (g_testCollDa.collDa[i][_comMsg[U5_ID][1].comPort] >>_comMsg[U5_ID][1].comPin)&0x01;
  1072. //printf("%d,%d,%d,%d,%d,%d\n",u1com0,u1com1,u4com0,u4com1,u5com0,u5com1);
  1073. for(j=0;j<3;j++){
  1074. for(k=0;k<2;k++){
  1075. flag = (0x01<<(j*2+k));
  1076. u1com0 = (g_testCollDa.collDa[i][_comMsg[U1_ID+j][k].comPort] >>_comMsg[U1_ID+j][k].comPin)&0x01;
  1077. if((u1com0 == 0x00) && (g_comSrcDa.daMsg[U1_ID+j][k].lastvl==0)&&((g_comSrcDa.flag&flag) !=flag)){
  1078. num = g_comSrcDa.daMsg[U1_ID+j][k].num;
  1079. memcpy(&g_comSrcDa.daMsg[U1_ID+j][k].tda[num][0],(char*)&g_testCollDa.collDa[i][0],TEST_COLL_GROUP);
  1080. g_comSrcDa.daMsg[U1_ID+j][k].num++;
  1081. }
  1082. else {
  1083. g_comSrcDa.daMsg[U1_ID+j][k].num = 0;
  1084. }
  1085. g_comSrcDa.daMsg[U1_ID+j][k].lastvl= u1com0;
  1086. if((g_comSrcDa.daMsg[U1_ID+j][k].num>5)&&((g_comSrcDa.flag&flag) !=flag)){
  1087. g_comSrcDa.flag |= flag;
  1088. g_comSrcDa.daMsg[U1_ID+j][k].num = 0;
  1089. //valpos = (i - g_comSrcDa.daMsg[U1_ID+j][k].startpos)/2;
  1090. memcpy(&g_comSrcDa.daMsg[U1_ID+j][k].da[0],&g_comSrcDa.daMsg[U1_ID+j][k].tda[3][0],TEST_COLL_GROUP);
  1091. //break;
  1092. }
  1093. //printf("j=%d,k=%d,num = %d,flag = %02x\n",j,k,g_comSrcDa.daMsg[U1_ID+j][k].num,g_comSrcDa.flag);
  1094. }
  1095. if(g_comSrcDa.flag == 0x3F){
  1096. break;
  1097. }
  1098. }
  1099. dealnum++;
  1100. if(g_comSrcDa.flag == 0x3F){
  1101. g_comSrcDa.flag = 0;
  1102. samecount = 4;
  1103. break;
  1104. }
  1105. }
  1106. if(samecount >=3) {
  1107. // printf("ccccccccccccc\n");
  1108. if(i == (dealIndex)) curIndex = i-1;
  1109. else curIndex = i;
  1110. memset((char*)g_timeInfo.srcDa,0,sizeof(g_timeInfo.srcDa));
  1111. for(mm=0;mm<128;mm++){
  1112. uid = g_neTable[mm].uId; // u1 u4 或 u5
  1113. cId = g_neTable[mm].comIndex; // com0 还是com1
  1114. csId = g_neTable[mm].csIndex; //
  1115. pid = g_neTable[mm].pinIndex;
  1116. if(csId ==0xFF || pid == 0xFF) continue;
  1117. comval = (g_comSrcDa.daMsg[uid][cId].da[_comMsg[uid][cId].comPort]>> _comMsg[uid][cId].comPin)&0x01;
  1118. bitval = (g_comSrcDa.daMsg[uid][cId].da[csId]>>pid)&0x01;
  1119. if(comval != bitval) g_timeInfo.srcDa[mm/8+1] |= (0x01<<(7-mm%8));
  1120. }
  1121. samecount = 0;
  1122. g_testCollDa.dealNum = i;
  1123. anay_7eg();
  1124. }
  1125. else {
  1126. curIndex = i-1;// dealIndex-1;
  1127. g_testCollDa.dealNum = i;//dealIndex;
  1128. }
  1129. if((g_testCollDa.bdealDa == 0x01)&& (dealnum ==(TEST_COLL_DA_MAX_NUM))) {
  1130. memcpy(g_testCollDa.sendCollNum,g_testCollDa.tcollNum,192);
  1131. memset(g_testCollDa.tcollNum,0,192);
  1132. g_testCollDa.bdealDa = 0;
  1133. dealnum = 1;
  1134. curIndex = 0;
  1135. g_testCollDa.dealNum = 0;
  1136. //printf("test flag %d\n",testflag);
  1137. testflag = 0;
  1138. samecount = 0;
  1139. }
  1140. }