env.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /*
  2. * @file env.c
  3. *
  4. * @brief 环境变量
  5. * @details config\roadinfo
  6. *
  7. * @copyright (c) 2006-2021, Huali Development Team
  8. *
  9. * (c) Copyright 2021, Shandong Huali electromechanical Co., Ltd..
  10. * This is protected by international copyright laws. Knowledge of the
  11. * source code may not be used to write a similar product. This file may
  12. * only be used in accordance with a license and should not be redistributed
  13. * in any way. We appreciate your understanding and fairness.
  14. *
  15. * Change Logs:
  16. * @date @author @note
  17. * 2021-10-16 Simon the first version
  18. */
  19. #ifndef ENV_C_
  20. #define ENV_C_
  21. #include "rtthread.h"
  22. #include "env.h"
  23. #include "stdint.h"
  24. #include "stdbool.h"
  25. #include "sys/socket.h"
  26. #include "netdev.h"
  27. #include "finsh.h"
  28. #define DBG_TAG "env"
  29. #define DBG_LVL DBG_INFO
  30. #include <rtdbg.h>
  31. /*********************************************************************************************************
  32. * FLASH CFG
  33. *********************************************************************************************************/
  34. #define FLASH_SAVED 0xf0f0
  35. #define FLASH_CFG_ADDR ((uint32_t)0x08100000) /* Base @ of Sector 12, 16 Kbytes */
  36. #define FLASH_ROADINFO_ADDR ((uint32_t)0x08110000) /* Base @ of Sector 16, 64 Kbytes */
  37. Cfg_t Cfg;
  38. Set_t Set;
  39. IN_t I;
  40. OUT_t O;
  41. Status_t S;
  42. uint8_t FLASH_Write(uint32_t startAddr, const uint8_t *pBuffer, uint32_t size)
  43. {
  44. stm32_flash_erase(startAddr, size);
  45. stm32_flash_write(startAddr, pBuffer, size);
  46. return 1;
  47. }
  48. uint16_t FLASH_ReadHalfWord(uint32_t addr)
  49. {
  50. return *((uint16_t*) addr);
  51. }
  52. /**
  53. * @brief 保存配置到Flash
  54. * @param
  55. * @return
  56. */
  57. uint8_t Flash_SaveCfg(void) {
  58. uint8_t ret = 1;
  59. LOG_I("Flash_SaveCfg Save cfg to flash start\r\n");
  60. ret = FLASH_Write(FLASH_CFG_ADDR, (uint8_t *)(&Cfg), sizeof(Cfg_t));
  61. LOG_I("Flash_SaveCfg Save cfg to flash end: %d\r\n", ret);
  62. return ret;
  63. }
  64. /**
  65. * @brief 初始化配置
  66. * @param
  67. * @return
  68. */
  69. int FlashLoadCfg(void) {
  70. LOG_I("FlashLoadCfg init 0x%x:0x%x", FLASH_CFG_ADDR, (*((uint8_t *) FLASH_CFG_ADDR)));
  71. if((*((uint16_t *) FLASH_CFG_ADDR)) == FLASH_SAVED){
  72. // 从flash读取配置
  73. memcpy((uint8_t *)&Cfg, (uint8_t *) FLASH_CFG_ADDR, sizeof(Cfg_t));
  74. LOG_I("Read cfg from flash");
  75. }
  76. else
  77. {
  78. Cfg_Init();
  79. Flash_SaveCfg(); //增加初始化时,保存flash的值
  80. //如果flash里面没有配置,则初始化默认配置
  81. LOG_I("Read cfg from default cfg");
  82. }
  83. if(Cfg.BtyType == CFG_BATTERY_TYPE_48V){
  84. Cfg.VoltFull = 5600; //100% 5200 bug8 5200
  85. Cfg.VoltHigh = 5400; //80% 5000 bug8 5100
  86. Cfg.VoltMid = 5200; //60% 4800 bug8 5000
  87. Cfg.VoltLow = 5000; //40% 4700 bug8 4900
  88. Cfg.VoltWarn = 4800; //20% 4600 bug8 4800
  89. Cfg.VoltStop = 4700; //0% 4500 bug8 4700
  90. }else{
  91. Cfg.VoltFull = 2600;
  92. Cfg.VoltHigh = 2500;
  93. Cfg.VoltMid = 2400;
  94. Cfg.VoltLow = 2350;
  95. Cfg.VoltWarn = 2300;
  96. Cfg.VoltStop = 2250;
  97. }
  98. Cfg.StartAct = ACT_LEFT;
  99. // struct netdev *netdev = RT_NULL;
  100. //
  101. // netdev = netdev_get_by_name("e0");
  102. // if(netdev)
  103. // {
  104. // netdev_set_gw(netdev, (ip_addr_t *)&Cfg.gateway);
  105. // netdev_set_ipaddr(netdev, (ip_addr_t *)&Cfg.ipaddr);
  106. // netdev_set_netmask(netdev, (ip_addr_t *)&Cfg.netmask);
  107. // }
  108. return 0;
  109. }
  110. INIT_ENV_EXPORT(FlashLoadCfg);
  111. static int Net_Init(void)
  112. {
  113. struct netdev *netdev = RT_NULL;
  114. while(!netdev)
  115. {
  116. netdev = netdev_get_by_name("e0");
  117. rt_thread_mdelay(100);
  118. }
  119. netdev_set_gw(netdev, (ip_addr_t *)&Cfg.gateway);
  120. netdev_set_ipaddr(netdev, (ip_addr_t *)&Cfg.ipaddr);
  121. netdev_set_netmask(netdev, (ip_addr_t *)&Cfg.netmask);
  122. return RT_EOK;
  123. }
  124. INIT_APP_EXPORT(Net_Init);
  125. void Cfg_Init(void) {
  126. Cfg.AgvId = 55;
  127. Cfg.SpdFctr = 50;
  128. Cfg.Speed = 60;
  129. Cfg.SpdMxDft = 10;
  130. Cfg.SpdNear = 10; //Bug0018,之前为7
  131. Cfg.SpdMan = 20;
  132. Cfg.SpdRota = 10;
  133. Cfg.MaxRpm = 3000;
  134. Cfg.RfidType = CFG_RFID_TYPE_HS;
  135. // Cfg.CargoType = CFG_CARGO_TYPE_LIFT;
  136. Cfg.CargoType = CFG_CARGO_TYPE_LIFT;
  137. Cfg.ObsType = CFG_OBS_TYPE_KL;
  138. Cfg.BtyType = CFG_BATTERY_TYPE_48V;
  139. Cfg.NavSP = 1;
  140. Cfg.NavSI = 5;
  141. Cfg.NavSD = 5;
  142. Cfg.NavWP = 25;
  143. Cfg.DftWP = 7;
  144. Cfg.MtsAglAcy = 30;
  145. Cfg.FWlkAcc = 2000;
  146. Cfg.FWlkDcc = 2000;
  147. Cfg.BWlkAcc = 10;
  148. Cfg.BWlkDcc = 10;
  149. Cfg.StrMcType = CFG_StrMcType_SenChuang;
  150. Cfg.WlkMcType = CFG_WlkMcType_SenChuang;
  151. if(Cfg.StrMcType == CFG_StrMcType_Motec){
  152. Cfg.FStrPlsDeg = 964;
  153. Cfg.BStrPlsDeg = 964;
  154. Cfg.RoteAngle = -713;
  155. }else{
  156. // Cfg.FStrPlsDeg = 458; //5.5*10000*30/3600-458
  157. // Cfg.BStrPlsDeg = 458;
  158. Cfg.FStrPlsDeg = 420; //5*10000*30.25/3600=416
  159. Cfg.BStrPlsDeg = 420;
  160. Cfg.RoteAngle = 599;
  161. }
  162. Cfg.FZeroAng = 200;
  163. Cfg.BZeroAng = 200;
  164. Cfg.ipaddr = 0x866fa8c0;
  165. Cfg.netmask = 0x00ffffff;
  166. Cfg.gateway = 0x016fa8c0;
  167. Cfg.stop_dist = 20;
  168. Cfg.reduce_dist = 100;
  169. Cfg.Saved = FLASH_SAVED;
  170. }
  171. void Stat_Init(void) {
  172. S.AgvId = Cfg.AgvId;
  173. S.LogSwMain = 1;
  174. S.LogSwGuide = 1;
  175. S.LogSwDriver = 1;
  176. //S.LogSwCan = 1;
  177. S.Led0Status = LIGHT_STATUS_TOGGLE_1S;
  178. S.FR = FR_FORWARD;
  179. S.Status = STATUS_INIT;
  180. S.Point = NULL_POINT;
  181. S.Station = NULL_POINT;
  182. S.TgtAction = ACT_NULL;
  183. S.DRAction = ACT_NULL;
  184. S.TgtStation = NULL_POINT;
  185. S.LiftStatus = LIFT_STATUS_CENTER;
  186. S.CargoStatus = CARGO_STATUS_INIT;
  187. S.IdleSecond = IDLE_TIMEOUT;
  188. S.BatteryVolt = Cfg.VoltFull;
  189. S.BatteryStatus = BATTERY_STATUS_FULL;
  190. S.BPos = -20000000;
  191. S.FPos = -20000000;
  192. S.FMgsOffset = MgsNA;
  193. S.BMgsOffset = MgsNA;
  194. S.LMgsOffset = MgsNA;
  195. S.RMgsOffset = MgsNA;
  196. S.TaskId = "";
  197. S.OBSArea = OBS_AREA_ON;
  198. S.near_time_out = 160;
  199. S.motor_err = 0;//Bug107
  200. // S.RoadNum = 2;
  201. }
  202. INIT_ENV_EXPORT(Stat_Init);
  203. void Set_Init(void) {
  204. SetSpeed(Cfg.Speed);
  205. Set.RpmNear = Cfg.SpdNear * Cfg.SpdFctr;
  206. Set.RpmManual = Cfg.SpdMan * Cfg.SpdFctr;
  207. Set.RpmRotate = Cfg.SpdRota * Cfg.SpdFctr;
  208. Set.Branch = BRANCH_CENTER;
  209. Set.RotateAct = ACT_NULL;
  210. Set.FWlkRpm = 0;
  211. Set.BWlkRpm = 0;
  212. Set.FAngle = AngleNA;
  213. Set.BAngle = AngleNA;
  214. Set.LiftRpmUp = 300;
  215. Set.LiftRpmDown = -300;
  216. Set.LiftPos = PosNA;
  217. Set.LiftUpPos = 4500000;
  218. Set.LiftDownPos = 300000;
  219. Set.FWlkAAcc = 500; //300
  220. Set.FWlkADcc = 800; //2000
  221. Set.FWlkMAcc = 1000;
  222. Set.FWlkMDcc = 1000;
  223. Set.StationDcc = 0;
  224. // Set.FWlkAAcc = 2000;
  225. // Set.FWlkADcc = 700;
  226. // Set.FWlkMAcc = 2000;
  227. // Set.FWlkMDcc = 1000;
  228. //dmklift
  229. Set.LiftRpm = 0;
  230. Set.ChargeStation = 1008003; //BUG4
  231. Set.TsjStation = 2003011; //BUG4
  232. //专为唐山修改,2排11列与3排11列不起作用
  233. Set.TsjPoint = Set.TsjStation % 1000000;
  234. }
  235. void SetSpeed(uint16_t speed) {
  236. Set.Speed = speed;
  237. Set.RpmNear = Cfg.SpdNear * Cfg.SpdFctr;
  238. Set.RpmManual = Cfg.SpdMan * Cfg.SpdFctr;
  239. Set.RpmRotate = Cfg.SpdRota * Cfg.SpdFctr;
  240. Set.SpeedDrift = (Set.Speed <= Cfg.SpdMxDft)?Set.Speed:Cfg.SpdMxDft;
  241. Set.DRRpmNav = Set.RpmNav = Set.Speed * Cfg.SpdFctr;
  242. Set.DRRpmDft = Set.RpmDft = Set.SpeedDrift * Cfg.SpdFctr;
  243. }
  244. void Cfg_Cmd(rt_uint8_t argc, char **argv)
  245. {
  246. int rc = 0;
  247. const char* help_info[] =
  248. {
  249. [0] = "config param [value] - config param(eg. id) with value, query param value if [value] is null",
  250. [1] = " config id - config agv id",
  251. [2] = " config ip - set ip address",
  252. [3] = " config netmask - set net mask",
  253. [4] = " config gateway - set gateway",
  254. [5] = " config speed - set wheel speed",
  255. [6] = " config roterpm - set rote rpm speed",
  256. [7] = " config maxrpm - set max rpm speed",
  257. [8] = " config reset - set config to factory",
  258. [9] = " config chargetag - set config charge station tag number",
  259. [10] = " config lifttag - set config lift station tag number",
  260. [11] = " config tfmini - set config tfmini reduce and stop dist",
  261. };
  262. if (argc < 2)
  263. {
  264. printf("Usage:\n");
  265. for (int i = 0; i < sizeof(help_info) / sizeof(char*); i++)
  266. {
  267. printf("%s\n", help_info[i]);
  268. }
  269. printf("\n");
  270. }
  271. else
  272. {
  273. const char *operator = argv[1];
  274. ip_addr_t ipaddr;
  275. struct netdev *netdev = RT_NULL;
  276. netdev = netdev_get_by_name("e0");
  277. if(!strcmp(operator, "reset"))
  278. {
  279. Cfg_Init();
  280. rc = 1;
  281. }
  282. else if (!strcmp(operator, "chargetag"))
  283. {
  284. if(argc == 3)
  285. {
  286. rc = sscanf(argv[2], "%u", &Set.ChargeStation);
  287. }
  288. else
  289. {
  290. printf("%s: %08u\n", operator, Set.ChargeStation);
  291. }
  292. }
  293. else if (!strcmp(operator, "lifttag"))
  294. {
  295. if(argc == 3)
  296. {
  297. uint32_t lift_tag = 0;
  298. rc = sscanf(argv[2], "%u", &lift_tag);
  299. if(rc == 1)
  300. {
  301. Set.TsjStation = lift_tag ; //BUG4
  302. }
  303. }
  304. else
  305. {
  306. printf("%s: %08u\n", operator, Set.TsjStation); ////BUG4
  307. }
  308. }
  309. else if (!strcmp(operator, "netmask"))
  310. {
  311. if(argc == 3)
  312. {
  313. rc = inet_aton((const char *)argv[2], &ipaddr);
  314. if(rc)
  315. {
  316. Cfg.netmask = ipaddr.addr;
  317. if(netdev)
  318. netdev_set_netmask(netdev, &ipaddr);
  319. }
  320. }
  321. else
  322. {
  323. printf("%s: %s\n", operator, inet_ntoa(Cfg.netmask));
  324. }
  325. }
  326. else if (!strcmp(operator, "gateway"))
  327. {
  328. if(argc == 3)
  329. {
  330. rc = inet_aton((const char *)argv[2], &ipaddr);
  331. if(rc)
  332. {
  333. Cfg.gateway = ipaddr.addr;
  334. if(netdev)
  335. netdev_set_gw(netdev, &ipaddr);
  336. }
  337. }
  338. else
  339. {
  340. printf("%s: %s\n", operator, inet_ntoa(Cfg.gateway));
  341. }
  342. }
  343. else if (!strcmp(operator, "speed_factor"))
  344. {
  345. if(argc == 3)
  346. {
  347. rc = sscanf(argv[2], "%hu", &Cfg.SpdFctr);
  348. }
  349. else
  350. {
  351. printf("%s: %hu\n", operator, Cfg.SpdFctr);
  352. }
  353. }
  354. else if (!strcmp(operator, "speed"))
  355. {
  356. if(argc == 3)
  357. {
  358. rc = sscanf(argv[2], "%hu", &Cfg.Speed);
  359. }
  360. else
  361. {
  362. printf("%s: %hu\n", operator, Cfg.Speed);
  363. }
  364. }
  365. else if (!strcmp(operator, "maxrpm"))
  366. {
  367. if(argc == 3)
  368. {
  369. rc = sscanf(argv[2], "%hu", &Cfg.MaxRpm);
  370. }
  371. else
  372. {
  373. printf("%s: %hu\n", operator, Cfg.MaxRpm);
  374. }
  375. }
  376. else if (!strcmp(operator, "roterpm"))
  377. {
  378. if(argc == 3)
  379. {
  380. rc = sscanf(argv[2], "%hu", &Cfg.SpdRota);
  381. }
  382. else
  383. {
  384. printf("%s: %hu\n", operator, Cfg.SpdRota);
  385. }
  386. }
  387. else if (!strcmp(operator, "ip"))
  388. {
  389. if(argc == 3)
  390. {
  391. rc = inet_aton((const char *)argv[2], &ipaddr);
  392. if(rc)
  393. {
  394. if(netdev)
  395. {
  396. netdev_set_ipaddr(netdev, &ipaddr);
  397. }
  398. Cfg.ipaddr = ipaddr.addr;
  399. }
  400. }
  401. else
  402. {
  403. printf("ip address: %s\n", inet_ntoa(Cfg.ipaddr));
  404. }
  405. }
  406. else if (!strcmp(operator, "id"))
  407. {
  408. if(argc == 3)
  409. {
  410. rc = sscanf(argv[2], "%hu", &Cfg.AgvId);
  411. }
  412. else
  413. {
  414. printf("agv id: %hu\n", Cfg.AgvId);
  415. }
  416. }
  417. else if (!strcmp(operator, "tfmini"))
  418. {
  419. if(argc == 4)
  420. {
  421. rc = sscanf(argv[2], "%hu", &Cfg.reduce_dist);
  422. rc = sscanf(argv[3], "%hu", &Cfg.stop_dist);
  423. }
  424. else
  425. {
  426. printf("%s: %hu %hu\n", operator, Cfg.reduce_dist,Cfg.stop_dist);
  427. }
  428. }
  429. else
  430. {
  431. printf("Usage:\n");
  432. for (int i = 0; i < sizeof(help_info) / sizeof(char*); i++)
  433. {
  434. printf("%s\n", help_info[i]);
  435. }
  436. printf("\n");
  437. }
  438. if(rc)
  439. {
  440. Flash_SaveCfg();
  441. printf("config ok!\n");
  442. }
  443. }
  444. }
  445. MSH_CMD_EXPORT_ALIAS(Cfg_Cmd, config, config terminal parameter);
  446. #endif /* ENV_C_ */