xspDataOpt.c 47 KB

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