xspDataOpt.c 49 KB

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