smp_shell.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492
  1. #include "board.h"
  2. #include "string.h"
  3. #include "tdc_tof.h"
  4. #include "stdlib.h"
  5. #include "ymodem.h"
  6. #include "smp_shell.h"
  7. #include "app_nb.h"
  8. #include "bill.h"
  9. #include "param.h"
  10. #include "eeprom.h"
  11. #include "alarm.h"
  12. extern uint8_t NbIntStep;
  13. void Cmd_Ver(uint8_t argc, char **argv)
  14. {
  15. //extern uint32_t SOFT_VER;
  16. extern uint32_t BUILD_DATE;
  17. extern uint16_t BUILD_TIME;
  18. printf("soft_ver: %c%d.%d.%d.%d\n", SOFT_VER[0], SOFT_VER[1], SOFT_VER[2], SOFT_VER[3],SOFT_VER[4]);
  19. printf("build_time: %d/%d/%d %d:%d\n", BUILD_DATE>>16, (uint8_t)(BUILD_DATE>>8), (uint8_t)BUILD_DATE,
  20. (uint8_t)(BUILD_TIME>>8), (uint8_t)BUILD_TIME);
  21. }
  22. void Cmd_Plot(uint8_t argc, char **argv)
  23. {
  24. if (argc==2){
  25. if (strcmp(argv[1], "on")==0){
  26. SerPlot_Mode &= ~SERPLOT_DMATX_OFF;
  27. } else if (strcmp(argv[1], "off")==0){
  28. SerPlot_Mode |= SERPLOT_DMATX_OFF;
  29. }
  30. }
  31. }
  32. void Cmd_Reset(uint8_t argc, char **argv)
  33. {
  34. uint32_t prm1;
  35. if (argc>=2){
  36. str2int(argv[1], &prm1);
  37. if (prm1>30){
  38. prm1 = 30;
  39. }
  40. us_delay(prm1*1000);
  41. }
  42. printf("soft reset will be done.\n\n");
  43. while(FinSh_Txbuf_Busy()){
  44. // wait until Txbuf done
  45. }
  46. rt_hw_interrupt_disable();
  47. us_delay(10000);
  48. NVIC_SystemReset();
  49. }
  50. void Cmd_Date(uint8_t argc, char **argv)
  51. {
  52. uint16_t flag;
  53. uint32_t tmp;
  54. uint8_t y_bcd;
  55. uint8_t m_bcd;
  56. uint8_t d_bcd;
  57. flag = 0;
  58. if (argc == 1) {
  59. get_rtc_date(&y_bcd, &m_bcd, &d_bcd);
  60. printf("20%02x-%02x-%02x\n", y_bcd, m_bcd, d_bcd);
  61. } else if (argc == 2) {
  62. if (strcmp(argv[1], "help")==0) {
  63. flag |= 0x8000u;
  64. } else {
  65. flag |= 0x1u;
  66. }
  67. } else if (argc == 4) {
  68. str2int(argv[1], &tmp);
  69. y_bcd = OctToBcd((uint8_t)(tmp % 2000));
  70. str2int(argv[2], &tmp);
  71. m_bcd = OctToBcd((uint8_t)tmp);
  72. str2int(argv[3], &tmp);
  73. d_bcd = OctToBcd((uint8_t)tmp);
  74. set_rtc_date(y_bcd, m_bcd, d_bcd);
  75. } else {
  76. flag |= 0x1u;
  77. }
  78. if (flag) {
  79. if (flag&0x1u) {
  80. printf(" unknown cmd. only the following cmds supported.\n");
  81. }
  82. printf(" date [<year> <month> <day>]\n");
  83. printf(" :get/set date.\n");
  84. }
  85. }
  86. void Cmd_Time(uint8_t argc, char **argv)
  87. {
  88. uint16_t flag;
  89. uint32_t tmp;
  90. uint8_t s_bcd;
  91. uint8_t m_bcd;
  92. uint8_t h_bcd;
  93. flag = 0;
  94. if (argc == 1) {
  95. get_rtc_time(&h_bcd, &m_bcd, &s_bcd);
  96. printf("%02xh:%02xm:%02xs\n", h_bcd, m_bcd, s_bcd);
  97. } else if (argc == 2) {
  98. if (strcmp(argv[1], "help")==0) {
  99. flag |= 0x8000u;
  100. } else {
  101. flag |= 0x1u;
  102. }
  103. } else if (argc == 4) {
  104. str2int(argv[1], &tmp);
  105. h_bcd = OctToBcd((uint8_t)tmp);
  106. str2int(argv[2], &tmp);
  107. m_bcd = OctToBcd((uint8_t)tmp);
  108. str2int(argv[3], &tmp);
  109. s_bcd = OctToBcd((uint8_t)tmp);
  110. set_rtc_time(h_bcd, m_bcd, s_bcd);
  111. } else {
  112. flag |= 0x1u;
  113. }
  114. if (flag) {
  115. if (flag&0x1u) {
  116. printf(" unknown cmd. only the following cmds supported.\n");
  117. }
  118. printf(" time [<hour> <minute> <second>]\n");
  119. printf(" :get/set time.\n");
  120. }
  121. }
  122. extern Param_t Param;
  123. #define FLASH_ADDR_SAVEPARAM (0x00008000u - 512)
  124. #define SAVEPARAM_HEAD_SIZE (32)
  125. #define MCUFLASH_SAVED_LEN (72)//yw 112->72
  126. /*
  127. void SaveParam(void) {
  128. uint32_t param_len = 0;
  129. uint32_t param_crc;
  130. uint8_t *data;
  131. McuFlash_WP_t WP;
  132. uint8_t i;
  133. Nb_Run_t *nb_run;
  134. GetNbRun(&nb_run);
  135. McuFlash_Unlock();
  136. // erase Flahs
  137. McuFlash_EraseSegment(FLASH_ADDR_SAVEPARAM, 512);
  138. data = (uint8_t *)(FLASH_ADDR_SAVEPARAM + SAVEPARAM_HEAD_SIZE);
  139. McuFlash_OpenWP(FLASH_ADDR_SAVEPARAM + SAVEPARAM_HEAD_SIZE, &WP);
  140. // write param
  141. for (i = 0; i < MUX_CH_NUM; i++) {
  142. McuFlash_Buf2WP((uint8_t *)&TdcItf.path_skew[i], 4, &WP);
  143. param_len += 1;
  144. }
  145. McuFlash_Buf2WP((uint8_t *)&TdcItf.pipe_coe, 4, &WP);
  146. param_len += 1;
  147. McuFlash_Buf2WP((uint8_t *)nb_run->imei, 16, &WP);
  148. param_len += 4;
  149. McuFlash_Buf2WP((uint8_t *)nb_run->ccid, 32, &WP);
  150. param_len += 8;
  151. McuFlash_Buf2WP(TdcItf.mux_ch_no, sizeof(TdcItf.mux_ch_no), &WP);
  152. param_len += 1;
  153. McuFlash_Buf2WP((uint8_t *)&Param, sizeof(Param), &WP);
  154. param_len += (sizeof(Param) / 4);
  155. McuFlash_CloseWP(&WP);
  156. // calculate CRC
  157. param_crc = 0xFFFFFFFFu;
  158. param_crc = com_crc32L_next(param_crc, data, 4*param_len, 0xEDB88320);
  159. McuFlash_OpenWP(FLASH_ADDR_SAVEPARAM, &WP);
  160. // write header
  161. McuFlash_Buf2WP((uint8_t *)&param_len, 4, &WP);
  162. McuFlash_Buf2WP((uint8_t *)&param_crc, 4, &WP);
  163. McuFlash_CloseWP(&WP);
  164. McuFlash_Lock();
  165. }*/
  166. void Cmd_SaveParam(uint8_t argc, char **argv)
  167. {
  168. SaveParam();
  169. }
  170. /*
  171. int32_t LoadParam(void) {
  172. uint32_t param_len;
  173. uint32_t param_crc;
  174. uint32_t check_crc;
  175. uint32_t *data;
  176. uint8_t i;
  177. Nb_Run_t *nb_run;
  178. GetNbRun(&nb_run);
  179. data = (uint32_t *)(FLASH_ADDR_SAVEPARAM);
  180. param_len = *data++;
  181. param_crc = *data;
  182. if (param_len>120 || param_len != MCUFLASH_SAVED_LEN){
  183. return(1);
  184. }
  185. // calculate CRC
  186. data = (uint32_t *)(FLASH_ADDR_SAVEPARAM + SAVEPARAM_HEAD_SIZE);
  187. check_crc = 0xFFFFFFFFu;
  188. check_crc = com_crc32L_next(check_crc, (uint8_t *)data, 4*param_len, 0xEDB88320);
  189. if (check_crc!=param_crc){
  190. return(2);
  191. }
  192. for (i = 0; i < MUX_CH_NUM; i++) {
  193. memcpy(&TdcItf.path_skew[i], data++, 4);
  194. }
  195. memcpy(&TdcItf.pipe_coe, data++, 4);
  196. memcpy(nb_run->imei, data, 16);
  197. nb_run->imei[16] = 0;
  198. data += 4;
  199. memcpy(nb_run->ccid, data, 32);
  200. nb_run->ccid[31] = 0;
  201. data += 8;
  202. memcpy(TdcItf.mux_ch_no, data++, 4);
  203. memcpy(&Param, data, sizeof(Param));
  204. data += (sizeof(Param) / 4);
  205. return(0);
  206. }*/
  207. #ifndef BOOTLOADER_ENABLE
  208. const uint32_t crc32tab[] =
  209. {
  210. 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
  211. 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
  212. 0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
  213. 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
  214. 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
  215. 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
  216. 0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
  217. 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
  218. 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
  219. 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
  220. 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
  221. 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
  222. 0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
  223. 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
  224. 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
  225. 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
  226. 0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
  227. 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
  228. 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
  229. 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
  230. 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
  231. 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
  232. 0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
  233. 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
  234. 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
  235. 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
  236. 0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
  237. 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
  238. 0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
  239. 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
  240. 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
  241. 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
  242. 0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
  243. 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
  244. 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
  245. 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
  246. 0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
  247. 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
  248. 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
  249. 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
  250. 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
  251. 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
  252. 0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
  253. 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
  254. 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
  255. 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
  256. 0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
  257. 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
  258. 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
  259. 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
  260. 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
  261. 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
  262. 0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
  263. 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
  264. 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
  265. 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
  266. 0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
  267. 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
  268. 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
  269. 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
  270. 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
  271. 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
  272. 0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
  273. 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
  274. };
  275. uint32_t upgrade_pkg_crc32(const uint8_t *buf, uint32_t size)
  276. {
  277. uint32_t i, crc;
  278. uint32_t crc_l;
  279. crc = 0xFFFFFFFF;
  280. for (i = 0; i < size; i++)
  281. {
  282. crc = crc32tab[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);
  283. }
  284. crc ^= 0xFFFFFFFF;
  285. ToggleEndian((uint8_t *)(&crc), (uint8_t *)(&crc_l), 4, 1);
  286. return(crc_l);
  287. }
  288. #endif
  289. void Cmd_Upgrade(uint8_t argc, char **argv)
  290. {
  291. uint16_t res;
  292. uint16_t flag;
  293. uint32_t crc_chk;
  294. int16_t i;
  295. McuFlash_WP_t WP;
  296. flag = 0;
  297. if (argc>=2){
  298. if (strcmp(argv[1], "help")==0) {
  299. flag |= 0x8000u;
  300. } else if (strcmp(argv[1], "dup")==0 || strcmp(argv[1], "bin")==0) {
  301. printf("Ymodem RX in MCU side is ready.\n");
  302. printf("please start Ymodem TX in PC side within 45 seconds.\n");
  303. printf("throughput is 0 in first dozens of seconds because of erasing.\n");
  304. printf("normally the downloading will take dozens of seconds.\n");
  305. Finsh_Uart_Mode |= YMODEM_UPGRADE_ON;
  306. ymodem_cntxt.Buf = malloc(YMODEM_BUF_DEPTH);
  307. if (strcmp(argv[1], "bin")==0) {
  308. ymodem_cntxt.MaxSize = 96*1024-32;
  309. ymodem_cntxt.FlashAddr = 0x00020020u;
  310. } else {
  311. ymodem_cntxt.MaxSize = 32*1024;
  312. ymodem_cntxt.FlashAddr = 0x00038000u;
  313. }
  314. res = ymodem_rx_file(&ymodem_cntxt);
  315. Finsh_Uart_Mode &= ~YMODEM_UPGRADE_ON;
  316. if (res==0 && strcmp(argv[1], "bin")==0) {
  317. crc_chk = upgrade_pkg_crc32((uint8_t *)0x00020020u, ymodem_cntxt.Fsize);
  318. memcpy(ymodem_cntxt.Buf , &(ymodem_cntxt.Fsize), 4);
  319. memcpy(ymodem_cntxt.Buf+4, &crc_chk , 4);
  320. for(i=8; i<32; i++){
  321. ymodem_cntxt.Buf[i] = 0x00u;
  322. }
  323. McuFlash_Unlock();
  324. McuFlash_OpenWP(0x00020000u, &WP);
  325. McuFlash_Buf2WP(ymodem_cntxt.Buf, 32, &WP);
  326. McuFlash_CloseWP(&WP);
  327. McuFlash_Lock();
  328. }
  329. us_delay(100000); // 100 ms
  330. if (res==0){
  331. printf("%d bytes received.\n", ymodem_cntxt.Fsize);
  332. } else if (res==1){
  333. printf("ymodem failed!!!\n");
  334. } else if (res==2){
  335. printf("file size is over, drop it!!!\n");
  336. }
  337. free(ymodem_cntxt.Buf);
  338. } else {
  339. flag |= 0x1u;
  340. }
  341. } else {
  342. flag |= 0x1u;
  343. }
  344. if (flag) {
  345. if (flag&0x1u){
  346. printf(" unknown cmd. only the following cmds supported.\n");
  347. }
  348. printf(" upgrade dup\n");
  349. printf(" :start Y-modem transfer DUP from PC to MCU flash.\n");
  350. printf(" upgrade bin\n");
  351. printf(" :start Y-modem transfer BIN from PC to MCU flash.\n");
  352. printf("\n");
  353. }
  354. }
  355. void Cmd_Adc(uint8_t argc, char **argv)
  356. {
  357. adc_get();
  358. printf("Temperature of MCU is %3.1fC\n", McuTemp);
  359. printf("Voltage of VCC is %dmV\n", McuVcc);
  360. printf("Voltage of VBAT is %dmV\n", McuVbat);
  361. printf("Voltage of VTxBAT is %dmV\n", McuVTxbat);
  362. printf("Water pressure is %.3fMPa\n", WaterPressure);
  363. }
  364. extern uint32_t test_var_flag;
  365. void Cmd_Pipe(uint8_t argc, char **argv)
  366. {
  367. uint16_t flag;
  368. float TmpFloat;
  369. flag = 0;
  370. if (argc==2){
  371. if (strcmp(argv[1], "help")==0) {
  372. flag |= 0x8000u;
  373. } else if (strcmp(argv[1], "temp")==0) {
  374. printf("Pipe temperature = %3.1fC\n", WaterTemp);
  375. } else if (strcmp(argv[1], "getcoe")==0) {
  376. printf("current PipeCoe = %.6f\n", TdcItf.pipe_coe);
  377. } else if (strcmp(argv[1], "udskew") == 0) {
  378. uint8_t ch_num = GetChNum();
  379. for (uint8_t i = 0; i < ch_num; i++) {
  380. uint8_t ch = TdcItf.mux_ch_no[i];
  381. printf("Ch%d TdcPathSkew = %.3fns.\n", ch, TdcItf.path_skew[ch]);
  382. }
  383. } else if (strcmp(argv[1], "var") == 0) {
  384. test_var_flag = 1;
  385. printf("Variance test to begin, please wait three minutes.\n");
  386. } else {
  387. flag |= 0x1u;
  388. }
  389. } else if (argc==3) {
  390. str2float(argv[2], &TmpFloat);
  391. if (strcmp(argv[1], "setcoe")==0) {
  392. TdcItf.pipe_coe = TmpFloat;
  393. } else if (strcmp(argv[1], "gaincoe")==0) {
  394. TdcItf.pipe_coe *= TmpFloat;
  395. } else {
  396. flag |= 0x1u;
  397. }
  398. } else {
  399. flag |= 0x1u;
  400. }
  401. if (flag){
  402. if (flag&0x1u){
  403. printf(" unknown cmd. only the following cmds supported.\n");
  404. }
  405. printf(" pipe temp\n");
  406. printf(" :show temperature of Pipe.\n");
  407. printf(" pipe getcoe\n");
  408. printf(" :show current coefficient of Pipe.\n");
  409. printf(" pipe setcoe [VAL]\n");
  410. printf(" :set PipeCoe = [VAL].\n");
  411. printf(" pipe gaincoe [G]\n");
  412. printf(" :set PipeCoe = PipeCoe*[G].\n");
  413. printf(" pipe udskew\n");
  414. printf(" :show diff tof skew.\n");
  415. printf(" pipe var\n");
  416. printf(" :show dtof variance.\n");
  417. }
  418. }
  419. void TestUdskew(uint8_t print_flag) {
  420. uint8_t ch_num;
  421. uint16_t i, j;
  422. float TmpFloat[MUX_CH_NUM];
  423. uint32_t Tu32;
  424. uint8_t ch;
  425. uint32_t cnt_int;
  426. set_tof_state(0);
  427. us_delay(20000); // 20ms
  428. set_tof_state(TOF_ST_TEST);
  429. ch_num = GetChNum();
  430. for(i = 0; i < ch_num; i++) {
  431. ch = TdcItf.mux_ch_no[i];
  432. set_mux_ch(ch);
  433. us_delay(1); // max transition time type value is 75ns and max value is 250ns, 1us > 250ns
  434. TmpFloat[i] = 0;
  435. for (j = 0; j < 512; j++) {
  436. cnt_int = get_rtc_cnt_int();
  437. cnt_int++;
  438. set_rtc_cnt_int(cnt_int);
  439. set_tdc_int_step(0x00);
  440. Tu32 = (cnt_int&0x00000001u) ? TDC_CFG_FIRE_DOWN : TDC_CFG_FIRE_UP;
  441. tdc_start_tof(TDC_CFG_DO_CKENA | TDC_CFG_DO_CKDIS | TDC_CFG_DO_WREG | Tu32);
  442. while(get_tdc_int_step()!=0xFFu){
  443. // wait until TDC interrupt ISR done
  444. }
  445. TmpFloat[i] += get_diff_tof();
  446. if (print_flag) {
  447. if ((j&0x3Fu)==0x00u){
  448. printf(".");
  449. }
  450. }
  451. us_delay(10000); // must insert delay, otherwise TdcPathSkew a little small
  452. }
  453. TdcItf.path_skew[ch] += TmpFloat[i]*(1.0f/512);
  454. }
  455. extern float DiffToFAvg128;
  456. DiffToFAvg128 = 0;
  457. if (print_flag) {
  458. for (i = 0; i < ch_num; i++) {
  459. ch = TdcItf.mux_ch_no[i];
  460. printf("\nCh%d new PathSkew between up and down is %.3fns.\n", ch, TdcItf.path_skew[ch]);
  461. }
  462. }
  463. DiffToFAvg = 0;
  464. set_tof_state(0);
  465. us_delay(20000); // 20ms
  466. set_tof_state(TOF_ST_METER);
  467. }
  468. void Cmd_Test(uint8_t argc, char **argv)
  469. {
  470. uint16_t flag;
  471. uint16_t i, j;
  472. uint8_t OldOfst;
  473. float TmpFloat;
  474. float PreToF;
  475. float Delta;
  476. uint8_t NewOfst;
  477. flag = 0;
  478. if (argc>=2){
  479. if (strcmp(argv[1], "help")==0) {
  480. flag |= 0x8000u;
  481. } else if (strcmp(argv[1], "fwofst")==0) {
  482. set_tof_state (0);
  483. us_delay(20000); // 20ms
  484. set_tof_state(TOF_ST_TEST);
  485. OldOfst = get_tdc_fw_ofst();
  486. printf("CmpOfst | First_PW | Hit_PW | Ratio | RspDly\n");
  487. set_tdc_fw_ofst(5); // 10mV
  488. i = 0;
  489. j = 0;
  490. PreToF = 0;
  491. while(1){
  492. // up Tof
  493. set_tdc_int_step(0x80);
  494. tdc_start_tof(TDC_CFG_DO_CKENA | TDC_CFG_DO_WREG | TDC_CFG_FIRE_UP);
  495. while(get_tdc_int_step()==0x80){
  496. // wait until TDC interrupt ISR done
  497. }
  498. tdc_read_tof(TDC_CFG_FIRE_UP);
  499. // down Tof
  500. set_tdc_int_step(0x80);
  501. tdc_start_tof(TDC_CFG_FIRE_DOWN);
  502. while(get_tdc_int_step()==0x80){
  503. // wait until TDC interrupt ISR done
  504. }
  505. tdc_read_tof(TDC_CFG_FIRE_DOWN | TDC_CFG_DO_CKDIS);
  506. // check data
  507. TmpFloat = (250.0f/65536/2)*(TdcDToF[0] + TdcUToF[0]);
  508. Delta = TmpFloat - PreToF;
  509. if (-50<Delta && Delta<50){
  510. j++;
  511. } else if (950<Delta && Delta<1050){
  512. i++;
  513. j=0;
  514. PreToF = TmpFloat;
  515. printf("-------------------------\n");
  516. } else {
  517. if (llabs((long long)TdcUToF[0] - TdcDToF[0])<(10*65536/250)){
  518. PreToF = TmpFloat;
  519. }
  520. j=0;
  521. printf("-------------------------\n");
  522. }
  523. NewOfst = get_tdc_fw_ofst();
  524. printf("U %3dmV 0x%04x 0x%04x %3d%% %6.3fns\n", NewOfst<<1,
  525. TdcUPwFw, TdcUPwHw, TdcUPwFw*100/TdcUPwHw, (250.0f/65536)*TdcUToF[0]);
  526. printf("D %3dmV 0x%04x 0x%04x %3d%% %6.3fns %2d.%-2d\n", NewOfst<<1,
  527. TdcDPwFw, TdcDPwHw, TdcDPwFw*100/TdcDPwHw, (250.0f/65536)*TdcDToF[0], i, j);
  528. NewOfst++;
  529. set_tdc_fw_ofst(NewOfst);
  530. if (NewOfst>40){ // over 80mv
  531. break;
  532. }
  533. }
  534. set_tdc_fw_ofst(OldOfst);
  535. printf("Current Offst is %3dmV\n", OldOfst*2);
  536. set_tof_state(0);
  537. us_delay(20000); // 20ms
  538. set_tof_state(TOF_ST_METER);
  539. } else if (strcmp(argv[1], "udskew")==0) {
  540. TestUdskew(1);
  541. } else {
  542. flag |= 0x1u;
  543. }
  544. } else {
  545. flag |= 0x1u;
  546. }
  547. if (flag){
  548. if (flag&0x1u){
  549. printf(" unknown cmd. only the following cmds supported.\n");
  550. }
  551. printf(" test fwofst <ch>\n");
  552. printf(" :scan first wave with series of offset voltages.\n");
  553. printf(" test udskew\n");
  554. printf(" :test up and down path delay skew.\n");
  555. }
  556. }
  557. float RefFlow=2000;
  558. void Cmd_Calib(uint8_t argc, char **argv)
  559. {
  560. uint16_t flag;
  561. float TmpFloat;
  562. flag = 0;
  563. if (argc>=2){
  564. if (strcmp(argv[1], "help")==0) {
  565. flag |= 0x8000u;
  566. } else if (strcmp(argv[1], "enter")==0) {
  567. set_tof_state(TOF_ST_CALIB);
  568. } else if (strcmp(argv[1], "exit")==0) {
  569. set_tof_state(TOF_ST_METER);
  570. } else if (strcmp(argv[1], "setref")==0 && argc>=3) {
  571. str2float(argv[2], &TmpFloat);
  572. if (TmpFloat>=100){
  573. RefFlow = TmpFloat;
  574. printf("set new reference flow to %.1fml\n", RefFlow);
  575. if (argc>=4 && strcmp(argv[3], "reprint")==0 && CalibTime>CALIB_TIME_LTH){
  576. printf("reprint last one data with new reference.\n");
  577. uint32_t flag = get_tof_flag();
  578. flag |= TOF_FLAG_CALIB_FALL | TOF_FLAG_CALIB_DONE;
  579. set_tof_flag(flag);
  580. }
  581. } else {
  582. printf("FAIL, <setref> must not less than 100ml\n");
  583. }
  584. } else {
  585. flag |= 0x1u;
  586. }
  587. } else {
  588. flag |= 0x1u;
  589. }
  590. if (flag){
  591. if (flag&0x1u){
  592. printf(" unknown cmd. only the following cmds supported.\n");
  593. }
  594. printf(" calib enter\n");
  595. printf(" :enter calibration mode.\n");
  596. printf(" calib exit\n");
  597. printf(" :exit calibration mode.\n");
  598. printf(" calib setref <ml> [reprint]\n");
  599. printf(" :set reference flow.\n");
  600. }
  601. }
  602. void Cmd_Clr(uint8_t argc, char **argv) {
  603. printf("clear cumulative flow:%dml %dml %dml -> 0ml\n",
  604. (uint32_t)CumFlow, (uint32_t)FwCumFlow, (uint32_t)BwCumFlow);
  605. CumFlow = 0;
  606. FwCumFlow = 0;
  607. BwCumFlow = 0;
  608. }
  609. void Cmd_Mux(uint8_t argc, char **argv)
  610. {
  611. uint16_t flag;
  612. uint32_t value;
  613. uint32_t tmp;
  614. uint8_t i;
  615. flag = 0;
  616. if (argc == 2) {
  617. if (strcmp(argv[1], "help") == 0) {
  618. flag |= 0x8000u;
  619. } else if (strcmp(argv[1], "no") == 0) {
  620. printf("max no = %d %d %d %d\n", TdcItf.mux_ch_no[0], TdcItf.mux_ch_no[1],
  621. TdcItf.mux_ch_no[2], TdcItf.mux_ch_no[3]);
  622. } else {
  623. flag |= 0x1u;
  624. }
  625. } else if (argc == 3) {
  626. str2int(argv[2], &value);
  627. if (strcmp(argv[1], "addr") == 0) {
  628. set_mux_ch(value);
  629. TdcItf.ch_bit_map = (0x00000001 << value);
  630. } else if (strcmp(argv[1], "switch") == 0) {
  631. if (strcmp(argv[2], "on") == 0) {
  632. TdcItf.mux_switch= 1;
  633. TdcItf.ch_bit_map = 0;
  634. for (i = 0; i < GetChNum(); i++) {
  635. TdcItf.ch_bit_map |= (0x00000001 << TdcItf.mux_ch_no[i]);
  636. }
  637. } else if (strcmp(argv[2], "off") == 0) {
  638. TdcItf.mux_switch = 0;
  639. TdcItf.ch_bit_map = (0x00000001 << get_mux_ch());
  640. } else {
  641. flag |= 0x1u;
  642. }
  643. } else {
  644. flag |= 0x1u;
  645. }
  646. } else if (argc == 6) {
  647. if (strcmp(argv[1], "no") == 0) {
  648. str2int(argv[2], &tmp);
  649. TdcItf.mux_ch_no[0] = (uint8_t)tmp;
  650. str2int(argv[3], &tmp);
  651. TdcItf.mux_ch_no[1] = (uint8_t)tmp;
  652. str2int(argv[4], &tmp);
  653. TdcItf.mux_ch_no[2] = (uint8_t)tmp;
  654. str2int(argv[5], &tmp);
  655. TdcItf.mux_ch_no[3] = (uint8_t)tmp;
  656. TdcItf.ch_bit_map = 0;
  657. for (i = 0; i < GetChNum(); i++) {
  658. TdcItf.ch_bit_map |= (0x00000001 << TdcItf.mux_ch_no[i]);
  659. }
  660. }
  661. } else {
  662. flag |= 0x1u;
  663. }
  664. if (flag) {
  665. if (flag&0x1u) {
  666. printf(" unknown cmd. only the following cmds supported.\n");
  667. }
  668. printf(" mux addr [value]\n");
  669. printf(" :set mux addr value.\n");
  670. printf(" mux switch <on/off>\n");
  671. printf(" :auto switch mux ch on or off.\n");
  672. printf(" mux no [<ch0_no> <ch1_no> <ch2_no> <ch3_no>]\n");
  673. printf(" :get/set mux ch no.\n");
  674. }
  675. }
  676. void nb_help(uint8_t argc, char **argv);
  677. Shell_Cmd_t nb_cmds[] = {
  678. {"help", "nb command help", nb_help},
  679. {"on", "nb module power on", NbPowerOnCmd},
  680. {"off", "nb module power off", NbPowerOffCmd},
  681. {"at", "test interface", NbAtCmd},
  682. {"ati", "request product identification information", NbAtiCmd},
  683. {"ate", "set cmd echo mode, format: nb ate <0/1>", NbAteCmd},
  684. {"cgatt", "query PS attach/detach", NbCgattCmd},
  685. {"cfun", "query/set ue function, format: nb cfun [0/1]", NbCfunCmd},
  686. {"ncsearfcn", "clean freq which ue saved", NbNcsearfcnCmd},
  687. {"cgsn", "query imei", NbCgsnCmd},
  688. {"cimi", "query imsi", NbCimiCmd},
  689. {"csq", "get signal strength indication", NbCsqCmd},
  690. {"cgpaddr", "show pdp addr", NbCgpaddrCmd},
  691. {"cereg", "query EPS network reg state", NbCeregCmd},
  692. {"nccid", "query iccid", NbNccidCmd},
  693. {"nuestats", "query rsrp/rsrq/rssi/snr", NbNuestatsCmd},
  694. {"cmee", "report UE error", NbCmeeCmd},
  695. {"nnmi", "set new message indication", NbNnmiCmd},
  696. {"ncdp", "query and set server", NbNcdpCmd},
  697. {"nmgs", "send message", NbNmgsCmd},
  698. {"closeautocon", "close auto connect", NbCloseAutoCon},
  699. {"nrb", "soft reboot", NbNrb},
  700. {"cedrxs", "extended discontinuous reception", NbCedrxs},
  701. {"cpsms", "set power save model", NbCpsms},
  702. {"showrun", "show nb run info", NbShowrunCmd},
  703. {"upload", "nb upload from shell cmd", NbUploadCmd},
  704. {NULL, NULL, NULL}
  705. };
  706. void nb_help(uint8_t argc, char **argv) {
  707. uint16_t i;
  708. for (i = 0; nb_cmds[i].name != NULL; i++) {
  709. printf(" nb %s\n", nb_cmds[i].name);
  710. printf(" :%s.\n", nb_cmds[i].help);
  711. }
  712. }
  713. void Cmd_Nb(uint8_t argc, char **argv)
  714. {
  715. uint16_t flag;
  716. uint16_t i;
  717. flag = 0;
  718. if (argc >= 2) {
  719. for (i = 0; nb_cmds[i].name != NULL; i++) {
  720. if (strcmp(argv[1], nb_cmds[i].name) == 0) {
  721. NbIntStep = 0x80;
  722. NbClrRxBuf();
  723. nb_cmds[i].func(argc, argv);
  724. return;
  725. }
  726. }
  727. flag |= 0x1u;
  728. }else {
  729. flag |= 0x1u;
  730. }
  731. if (flag) {
  732. if (flag&0x1u) {
  733. printf(" unknown cmd. only the following cmds supported.\n");
  734. }
  735. nb_help(argc, argv);
  736. }
  737. }
  738. void Cmd_Ir(uint8_t argc, char **argv) {
  739. uint16_t flag = 0;
  740. if (argc == 2) {
  741. if (strcmp(argv[1], "help") == 0) {
  742. flag |= 0x8000u;
  743. } else {
  744. flag |= 0x1u;
  745. }
  746. } else if (argc == 3) {
  747. if (strcmp(argv[1], "mode") == 0) {
  748. if (strcmp(argv[2], "check") == 0) {
  749. Finsh_Uart_Mode |= CHECK_ITF_ON;
  750. } else if (strcmp(argv[2], "shell") == 0) {
  751. Finsh_Uart_Mode &= ~CHECK_ITF_ON;
  752. } else {
  753. flag |= 0x1u;
  754. }
  755. } else {
  756. flag |= 0x1u;
  757. }
  758. } else {
  759. flag |= 0x1u;
  760. }
  761. if (flag) {
  762. if (flag&0x1u) {
  763. printf(" unknown cmd. only the following cmds supported.\n");
  764. }
  765. printf(" ir mode <check/shell>\n");
  766. printf(" :switch ir work mode, check mode or shell mode.\n");
  767. }
  768. }
  769. //add by yw 20260126
  770. uint16_t ParamAddr(uint8_t argc, char **argv) {
  771. Param_t *param;
  772. GetParam(&param);
  773. if (argc == 2) {
  774. printf("param addr = ");
  775. for(int i = 0; i < DEV_ID_LEN; i ++){
  776. printf("%2X",param->dev_id[i]);
  777. }
  778. printf("\n");
  779. return 0;
  780. } else if (argc == 3) {
  781. StrToHexBuf((char *)&param->dev_id[0], argv[2], 6);
  782. return 0;
  783. }
  784. return 0x1u;
  785. }
  786. uint16_t ParamVer(uint8_t argc, char **argv) {
  787. Param_t *param;
  788. uint32_t tmp;
  789. GetParam(&param);
  790. if (argc == 2) {
  791. printf("param ver type = %d\n", param->ver_type);
  792. printf("param ver operator = %d\n", param->ver_operator);
  793. printf("param ver module = %d\n", param->ver_module);
  794. printf("param ver firmware = %d\n", param->ver_firmware);
  795. return 0;
  796. } else if (argc == 6) {
  797. str2int(argv[2], &tmp);
  798. param->ver_type = (uint8_t)tmp;
  799. str2int(argv[3], &tmp);
  800. param->ver_operator = (uint8_t)tmp;
  801. str2int(argv[4], &tmp);
  802. param->ver_module = (uint8_t)tmp;
  803. str2int(argv[5], &tmp);
  804. param->ver_firmware = (uint8_t)tmp;
  805. return 0;
  806. }
  807. return 0x1u;
  808. }
  809. uint16_t ParamPipe(uint8_t argc, char **argv) {
  810. Param_t *param;
  811. uint32_t tmp;
  812. GetParam(&param);
  813. if (argc == 2) {
  814. printf("param pipe diameter = %d\n", param->diameter);
  815. printf("param pipe channel num = %d\n", param->chan_num);
  816. printf("param pipe pressure sensor = %d\n", param->pressure_sensor);
  817. return 0;
  818. } else if (argc == 5) {
  819. str2int(argv[2], &tmp);
  820. param->diameter = (uint16_t)tmp;
  821. str2int(argv[3], &tmp);
  822. param->chan_num = (uint8_t)tmp;
  823. TdcItf.ch_num = (uint8_t)tmp;
  824. str2int(argv[4], &tmp);
  825. param->pressure_sensor = (uint8_t)tmp;
  826. return 0;
  827. }
  828. return 0x1u;
  829. }
  830. uint16_t ParamSettle(uint8_t argc, char **argv) {
  831. Param_t *param;
  832. uint32_t tmp;
  833. GetParam(&param);
  834. if (argc == 2) {
  835. printf("param settle day = %d\n", param->settlement_day);
  836. return 0;
  837. } else if (argc == 3) {
  838. str2int(argv[2], &tmp);
  839. param->settlement_day = (uint8_t)tmp;
  840. return 0;
  841. }
  842. return 0x1u;
  843. }
  844. uint16_t ParamReport(uint8_t argc, char **argv) {
  845. Param_t *param;
  846. uint32_t tmp;
  847. GetParam(&param);
  848. if (argc == 2) {
  849. printf("param report hour = %d\n", param->report_base_hour);
  850. printf("param report minute = %d\n", param->report_base_min);
  851. printf("param report second = %d\n", param->report_base_sec);
  852. printf("param report interval = %d\n", param->report_interval);
  853. return 0;
  854. } else if (argc == 6) {
  855. str2int(argv[2], &tmp);
  856. param->report_base_hour = (uint8_t)tmp;
  857. str2int(argv[3], &tmp);
  858. param->report_base_min = (uint8_t)tmp;
  859. str2int(argv[4], &tmp);
  860. param->report_base_sec = (uint8_t)tmp;
  861. str2int(argv[5], &tmp);
  862. param->report_interval = (uint16_t)tmp;
  863. return 0;
  864. }
  865. return 0x1u;
  866. }
  867. uint16_t ParamAlarmThres(uint8_t argc, char **argv) {
  868. Param_t *param;
  869. uint32_t tmp;
  870. float float_tmp;
  871. GetParam(&param);
  872. if (argc == 2) {
  873. printf("param high temperature alarm threshold = %d\n", param->high_temp_alarm_thres);
  874. printf("param low temperature alarm threshold = %d\n", param->low_temp_alarm_thres);
  875. printf("param large flow alarm threshold = %d\n", param->large_flow_alarm_thres);
  876. printf("param leak flow alarm threshold = %d\n", param->leak_flow_alarm_thres);
  877. printf("param high pressure alarm threshold = %d\n", param->high_press_alarm_thres);
  878. printf("param low pressure alarm threshold = %d\n", param->low_press_alarm_thres);
  879. return 0;
  880. } else if (argc == 8) {
  881. str2float(argv[2], &float_tmp);
  882. param->high_temp_alarm_thres = (int16_t)float_tmp;
  883. str2float(argv[3], &float_tmp);
  884. param->low_temp_alarm_thres = (int16_t)float_tmp;
  885. str2int(argv[4], &tmp);
  886. param->large_flow_alarm_thres = (uint32_t)tmp;
  887. str2int(argv[5], &tmp);
  888. param->leak_flow_alarm_thres = (uint32_t)tmp;
  889. str2int(argv[6], &tmp);
  890. param->high_press_alarm_thres = (uint16_t)tmp;
  891. str2int(argv[7], &tmp);
  892. param->low_press_alarm_thres = (uint16_t)tmp;
  893. return 0;
  894. }
  895. return 0x1u;
  896. }
  897. uint16_t ParamCheck(uint8_t argc, char **argv) {
  898. Param_t *param;
  899. uint32_t tmp;
  900. uint32_t i;
  901. GetParam(&param);
  902. if (argc == 3) {
  903. if (strcmp(argv[2], "q") == 0) {
  904. //modified by yuewei 20260317 change q_value to q
  905. //printf("check q value = %d\n", param->q_value);
  906. printf("check q value = %d\n", param->q);
  907. return 0;
  908. }
  909. } else if (argc == 4) {
  910. if (strcmp(argv[2], "spdlvl") == 0) {
  911. str2int(argv[3], &tmp);
  912. for (i = 0; i < CHECK_POINT_NUM; i++) {
  913. printf("check spdlvl[%d][%d] = %d\n", tmp, i, param->check_spdLvl_c[tmp].spd_lvl[i]);
  914. }
  915. return 0;
  916. } else if (strcmp(argv[2], "basec") == 0) {
  917. str2int(argv[3], &tmp);
  918. for (i = 0; i < CHECK_POINT_NUM; i++) {
  919. printf("check base c value[%d][%d] = %d\n", tmp, i, param->check_spdLvl_c[tmp].base_c[i]);
  920. }
  921. return 0;
  922. } else if (strcmp(argv[2], "curc") == 0) {
  923. str2int(argv[3], &tmp);
  924. for (i = 0; i < CHECK_POINT_NUM; i++) {
  925. printf("check current c value[%d][%d] = %d\n", tmp, i, param->check_spdLvl_c[tmp].cur_c[i]);
  926. }
  927. return 0;
  928. }
  929. }
  930. return 0x1u;
  931. }
  932. uint16_t Param_Server(uint8_t argc, char **argv) {
  933. Param_t *param;
  934. GetParam(&param);
  935. if (argc == 2) {
  936. printf("main server ip = %d.%d.%d.%d\n", param->main_server_ip[0],
  937. param->main_server_ip[1], param->main_server_ip[2], param->main_server_ip[3]);
  938. printf("main server port = %d\n", param->main_server_port);
  939. printf("sub server ip = %d.%d.%d.%d\n", param->sub_server_ip[0],
  940. param->sub_server_ip[1], param->sub_server_ip[2], param->sub_server_ip[3]);
  941. printf("sub server port = %d\n", param->sub_server_port);
  942. return 0;
  943. }
  944. return 0x1u;
  945. }
  946. uint16_t Param_Dma(uint8_t argc, char **argv) {
  947. Param_t *param;
  948. GetParam(&param);
  949. if (argc == 2) {
  950. printf("dma report start h = %d m = %d s = %d\n", param->dma_report_start[0],
  951. param->dma_report_start[1], param->dma_report_start[2]);
  952. printf("dma report end h = %d m = %d s = %d\n", param->dma_report_end[0],
  953. param->dma_report_end[1], param->dma_report_end[2]);
  954. printf("dma report interval = %d\n", param->dma_interval);
  955. double base_read = (double)((param->total_positive_water[3] << 24) |
  956. (param->total_positive_water[2] << 16) |
  957. (param->total_positive_water[1] << 8) |
  958. param->total_positive_water[0]);
  959. base_read /= 100;
  960. printf("total positive water = %.6fm^3\n", base_read);
  961. return 0;
  962. }
  963. return 0x1u;
  964. }
  965. void Cmd_Param(uint8_t argc, char **argv)
  966. {
  967. uint16_t flag;
  968. flag = 0;
  969. if (strcmp(argv[1], "help") == 0) {
  970. flag |= 0x8000u;
  971. } else if (strcmp(argv[1], "addr") == 0) {//add by yw 20260126
  972. flag = ParamAddr(argc, argv);
  973. } else if (strcmp(argv[1], "ver") == 0) {
  974. flag = ParamVer(argc, argv);
  975. } else if (strcmp(argv[1], "pipe") == 0) {
  976. flag = ParamPipe(argc, argv);
  977. } else if (strcmp(argv[1], "settle") == 0) {
  978. flag = ParamSettle(argc, argv);
  979. } else if (strcmp(argv[1], "report") == 0) {
  980. flag = ParamReport(argc, argv);
  981. } else if (strcmp(argv[1], "alarmthres") == 0) {
  982. flag = ParamAlarmThres(argc, argv);
  983. } else if (strcmp(argv[1], "check") == 0) {
  984. flag = ParamCheck(argc, argv);
  985. } else if (strcmp(argv[1], "server") == 0) {
  986. flag = Param_Server(argc, argv);
  987. } else if (strcmp(argv[1], "dma") == 0) {
  988. flag = Param_Dma(argc, argv);
  989. } else if (strcmp(argv[1], "erase") == 0) {
  990. McuFlash_Unlock();
  991. McuFlash_EraseSegment(FLASH_ADDR_SAVEPARAM, 512);
  992. McuFlash_Lock();
  993. } else if (strcmp(argv[1], "reset") == 0) {
  994. ParamInit();
  995. } else {
  996. flag |= 0x1u;
  997. }
  998. if (flag) {
  999. if (flag&0x1u) {
  1000. printf(" unknown cmd. only the following cmds supported.\n");
  1001. }
  1002. printf(" param addr [<addr>]\n");//add by yw 20260126
  1003. printf(" :get/set addr param.\n");//add by yw 20260126
  1004. printf(" param ver [<type> <opt> <module> <firmware>]\n");
  1005. printf(" :get/set ver param.\n");
  1006. printf(" param pipe [<diameter> <channel num> <pressure sensor>]\n");
  1007. printf(" :get/set pipe param.\n");
  1008. printf(" param settle [<day>]\n");
  1009. printf(" :get/set settle day param.\n");
  1010. printf(" param report [<hour> <minute> <second> <interval>]\n");
  1011. printf(" :get/set report param.\n");
  1012. printf(" param alarmthres [<high temp> <low temp> <large flow> <leak flow> <high press> <low press>]\n");
  1013. printf(" :get/set alarm threshold param.\n");
  1014. printf(" param check <spdlvl> <index>/<basec> <index>/<curc> <index>/q\n");
  1015. printf(" :print check param, index: 0-2.\n");
  1016. printf(" param server\n");
  1017. printf(" :get nb server ip/port.\n");
  1018. printf(" param dma\n");
  1019. printf(" :get dma param.\n");
  1020. printf(" param erase\n");
  1021. printf(" :erase mcu flash param.\n");
  1022. printf(" param reset\n");
  1023. printf(" :reset param.\n");
  1024. }
  1025. }
  1026. //add by yw 20260127 start
  1027. void print_month_bill(uint8_t year, uint8_t month) {
  1028. bill_t month_bill;
  1029. if (read_month_bill((year % 2000), month, &month_bill)) {
  1030. return;
  1031. }
  1032. printf("month bill flag = %d, year = %d, month = %d, day = %d, forward used = %d, backward used = %d\n",
  1033. month_bill.flag, month_bill.date[0], month_bill.date[1], month_bill.date[2],
  1034. month_bill.fw_used, month_bill.bw_used);
  1035. }
  1036. void print_day_bill(uint8_t month, uint8_t day) {
  1037. bill_t day_bill;
  1038. if (read_day_bill(month, day, &day_bill)) {
  1039. return;
  1040. }
  1041. printf("day bill flag = %d, year = %d, month = %d, day = %d, forward used = %d, backward used = %d\n",
  1042. day_bill.flag, day_bill.date[0], day_bill.date[1], day_bill.date[2],
  1043. day_bill.fw_used, day_bill.bw_used);
  1044. }
  1045. void print_hour_bill(uint8_t day, uint8_t hour) {
  1046. hour_bill_t bill;
  1047. uint32_t fw_used;
  1048. uint32_t bw_used;
  1049. uint32_t fr;
  1050. if (read_hour_bill(day, hour, &bill)) {
  1051. return;
  1052. }
  1053. printf("hour bill flag = %d, year = %d, month = %d, day = %d hour = %d\n",
  1054. bill.flag, bill.date[0], bill.date[1], bill.date[2], bill.date[3]);
  1055. fw_used = bill.fw_used[0] | (bill.fw_used[1] << 8) | (bill.fw_used[2] << 16);
  1056. bw_used = bill.bw_used[0] | (bill.bw_used[1] << 8) | (bill.bw_used[2] << 16);
  1057. fr = bill.flow_rate[0] | (bill.flow_rate[1] << 8) | (bill.flow_rate[2] << 16);
  1058. printf("forward used = %d, backward used = %d, flow rate = %d\n", fw_used, bw_used, fr);
  1059. }
  1060. void print_5m_bill(uint8_t day, uint8_t hour) {
  1061. hour_bill_t bill;
  1062. uint32_t fw_used;
  1063. uint32_t bw_used;
  1064. uint32_t fr;
  1065. uint32_t i;
  1066. for (i = 0; i < 12; i++) {
  1067. read_five_min_bill(day, hour, i * 5, &bill);
  1068. printf("five minute bill flag = %d, year = %d, month = %d, day = %d hour = %d\n",
  1069. bill.flag, bill.date[0], bill.date[1], bill.date[2], bill.date[3]);
  1070. fw_used = bill.fw_used[0] | (bill.fw_used[1] << 8) | (bill.fw_used[2] << 16);
  1071. bw_used = bill.bw_used[0] | (bill.bw_used[1] << 8) | (bill.bw_used[2] << 16);
  1072. fr = bill.flow_rate[0] | (bill.flow_rate[1] << 8) | (bill.flow_rate[2] << 16);
  1073. printf("minute = %d forward used = %d, backward used = %d, flow rate = %d\n",
  1074. i * 5, fw_used, bw_used, fr);
  1075. }
  1076. }
  1077. uint16_t Bill_Print(uint8_t argc, char **argv) {
  1078. uint32_t day;
  1079. uint32_t month;
  1080. uint32_t year;
  1081. uint32_t hour;
  1082. if (strcmp(argv[1], "hour") == 0) {
  1083. str2int(argv[2], &day);
  1084. str2int(argv[3], &hour);
  1085. if (day >= 1 && day <= 31 && hour < 24) {
  1086. print_hour_bill(day, hour);
  1087. return 0;
  1088. }
  1089. } else if (strcmp(argv[1], "day") == 0) {
  1090. str2int(argv[2], &month);
  1091. str2int(argv[3], &day);
  1092. if (month >= 1 && month <= 12 && day >= 1 && day <= 31) {
  1093. print_day_bill(month, day);
  1094. return 0;
  1095. }
  1096. } else if (strcmp(argv[1], "month") == 0) {
  1097. str2int(argv[2], &year);
  1098. str2int(argv[3], &month);
  1099. if (month >= 1 && month <= 12) {
  1100. print_month_bill(year, month);
  1101. return 0;
  1102. }
  1103. } else if (strcmp(argv[1], "5m") == 0) {
  1104. str2int(argv[2], &day);
  1105. str2int(argv[3], &hour);
  1106. if (day > 0 && day <= 31 && hour < 24) {
  1107. print_5m_bill(day, hour);
  1108. return 0;
  1109. }
  1110. }
  1111. return 0x1u;
  1112. }
  1113. void Cmd_Bill(uint8_t argc, char **argv) {
  1114. uint16_t flag = 0;
  1115. if (argc == 2) {
  1116. if (strcmp(argv[1], "help") == 0) {
  1117. flag |= 0x8000u;
  1118. } else {
  1119. flag |= 0x1u;
  1120. }
  1121. } else if (argc == 4) {
  1122. flag = Bill_Print(argc, argv);
  1123. } else {
  1124. flag |= 0x1u;
  1125. }
  1126. if (flag) {
  1127. if (flag&0x1u) {
  1128. printf(" unknown cmd. only the following cmds supported.\n");
  1129. }
  1130. printf(" bill month <year> <month>\n");
  1131. printf(" :print month bill.\n");
  1132. printf(" bill day <month> <day>\n");
  1133. printf(" :print day bill.\n");
  1134. printf(" bill hour <day> <hour>\n");
  1135. printf(" :print hour bill.\n");
  1136. printf(" bill 5m <day> <hour>\n");
  1137. printf(" :print 5 minute bill.\n");
  1138. }
  1139. }
  1140. void print_alarm(alarm_t *alarm) {
  1141. uint32_t arg;
  1142. arg = (alarm->arg[3] << 24) | (alarm->arg[2] << 16) | (alarm->arg[1] << 8) | alarm->arg[0];
  1143. printf("y=%d, m=%d, d=%d, h=%d, m=%d, s=%d, err=%d, type = %d, arg = %d\n",
  1144. alarm->time[1], alarm->time[2], alarm->time[3], alarm->time[4],
  1145. alarm->time[5], alarm->time[6], alarm->err_no, alarm->type, arg);
  1146. }
  1147. void Cmd_Alarm(uint8_t argc, char **argv) {
  1148. uint8_t i;
  1149. int8_t j;
  1150. alarm_t alarm;
  1151. uint32_t* status;
  1152. all_alarm_status(&status);
  1153. printf("all alarm status = 0x%08x\n", *status);
  1154. // for (i = 0; i < ERR_END; i++) {
  1155. // for (j = 1; j >= 0; j--) {
  1156. // if (read_alarm(i, j, &alarm) == 0 && alarm.flag == 1) {
  1157. // print_alarm(&alarm);
  1158. // }
  1159. // }
  1160. // }
  1161. uint8_t num=get_alarm_num();
  1162. for(i=0;i<num;i++){
  1163. read_alarm(i,&alarm);
  1164. print_alarm(&alarm);
  1165. }
  1166. }
  1167. //add by yw 20260127 end
  1168. uint16_t ShellFlag = 0;
  1169. static char ChHold;
  1170. static char ChBuf[SHELL_CMDLEN_MAX];
  1171. static uint8_t ChIdx = 0;
  1172. uint8_t ArgVld = 0;
  1173. uint8_t ArgNum;
  1174. char *ArgPtr[SHELL_ARGNUM_MAX];
  1175. void shell_help(uint8_t argc, char **argv);
  1176. Shell_Cmd_t shell_cmds[] = {
  1177. {"help", "show cmds list", shell_help},
  1178. {"ver", "show version", Cmd_Ver},
  1179. {"reset", "MCU soft reset", Cmd_Reset},
  1180. {"plot", "send values to PC for plotting, format: plot <on/off>", Cmd_Plot},
  1181. {"adc", "get MCU temperature and voltage", Cmd_Adc},
  1182. {"date", "show date", Cmd_Date},
  1183. {"time", "show time", Cmd_Time},
  1184. {"upgrade", "upgrade MCU by ymodem, type 'upgrade help' for more", Cmd_Upgrade},
  1185. {"saveparam", "save all current parameters to flash", Cmd_SaveParam},
  1186. {"pipe", "series of pipe cmds, type 'pipe help' for more", Cmd_Pipe},
  1187. {"test", "series of test cmds, type 'test help' for more", Cmd_Test},
  1188. {"calib", "series of calibration cmds, type 'calib help' for more", Cmd_Calib},
  1189. {"clr", "clear cumulative flow", Cmd_Clr},
  1190. {"mux", "set mux addr", Cmd_Mux},
  1191. {"nb", "series of nb cmds, type 'nb help' for more", Cmd_Nb},
  1192. {"ir", "switch ir work mode, format: ir mode <check/shell>", Cmd_Ir},
  1193. {"param", "set/get param, type 'param help' for more", Cmd_Param},
  1194. {"bill", "show hour/day/month bill, type 'bill help' for more", Cmd_Bill},//add by yw 20260127
  1195. {"alarm", "show alarm", Cmd_Alarm},//add by yw 20260127
  1196. {NULL, NULL, NULL}
  1197. };
  1198. void shell_help(uint8_t argc, char **argv)
  1199. {
  1200. uint16_t i;
  1201. printf(" [commands] [description]\n");
  1202. printf("--------------------------------------------------\n");
  1203. for (i = 0; shell_cmds[i].name != NULL; i++) {
  1204. printf(" %-10s :%s.\n", shell_cmds[i].name, shell_cmds[i].help);
  1205. }
  1206. printf("\n");
  1207. }
  1208. void CmdToArg(uint8_t ChLen)
  1209. {
  1210. uint8_t Idx;
  1211. char PreCh, ch;
  1212. ArgNum = 0;
  1213. PreCh = ' ';
  1214. for(Idx=0; Idx<ChLen; Idx++){
  1215. ch = ChBuf[Idx];
  1216. if (ch==' '){
  1217. ChBuf[Idx] = '\0';
  1218. } else if (PreCh==' '){
  1219. ArgPtr[ArgNum++] = &ChBuf[Idx];
  1220. if (ArgNum>=SHELL_ARGNUM_MAX){
  1221. break;
  1222. }
  1223. }
  1224. PreCh = ch;
  1225. }
  1226. }
  1227. // call the following function within ISR
  1228. void ShellRxCh(uint8_t ch)
  1229. {
  1230. // OS style for newline
  1231. // Windows: "\r\n" or "\13\10"
  1232. // Unix : '\n' or '\10'
  1233. // Mac : '\r' or '\13'
  1234. if (ChHold=='\r' && ch=='\n'){
  1235. // ignore it, because '\n' or '\r' is handled
  1236. }else if (ch=='\r' || ch=='\n'){
  1237. ChBuf[ChIdx] = '\0';
  1238. ShellFlag |= SHELL_FLAG_ARG_VLD;
  1239. }else if (ch=='\b' && ChIdx>0){
  1240. ShellFlag |= SHELL_FLAG_DEL_CH;
  1241. }else if (ch>=32 && ch<=126 && ChIdx<(SHELL_CMDLEN_MAX-1)){
  1242. ChBuf[ChIdx] = ch;
  1243. ShellFlag |= SHELL_FLAG_ECHO_CH;
  1244. }
  1245. ChHold = ch;
  1246. }
  1247. void ShellCmdAnalyze(uint8_t argc, char **argv)
  1248. {
  1249. uint16_t i;
  1250. if (argc==0){
  1251. return;
  1252. }
  1253. for (i = 0; shell_cmds[i].name != NULL; i++) {
  1254. if (strcmp(argv[0], shell_cmds[i].name) == 0) {
  1255. shell_cmds[i].func(argc, argv);
  1256. return;
  1257. }
  1258. }
  1259. printf("Unknown command. Type 'help' for list.\n");
  1260. }
  1261. // call the following function outside ISR
  1262. void ShellHandler(void)
  1263. {
  1264. if (ShellFlag & SHELL_FLAG_ECHO_CH){
  1265. ShellFlag &= ~SHELL_FLAG_ECHO_CH;
  1266. print_ch(ChBuf[ChIdx]);
  1267. ChIdx++;
  1268. } else if (ShellFlag & SHELL_FLAG_ARG_VLD){
  1269. ShellFlag &= ~SHELL_FLAG_ARG_VLD;
  1270. CmdToArg(ChIdx);
  1271. ChIdx = 0;
  1272. printf("\n");
  1273. ShellCmdAnalyze(ArgNum, ArgPtr);
  1274. print_str("cmd>");
  1275. } else if (ShellFlag & SHELL_FLAG_DEL_CH){
  1276. ShellFlag &= ~SHELL_FLAG_DEL_CH;
  1277. print_str("\b \b"); // delete ch
  1278. ChIdx--;
  1279. }
  1280. }