浏览代码

2020.12.14 / Jerry Wang

Actions:
1. Merge branch 'master' into DD360Audi

Files:
1. As follow commit history

Image version: V1.01.XX.XXXX.XX
Image checksum: XXXXXXXX
Jerry_Wang 4 年之前
父节点
当前提交
2b076ccfb5
共有 100 个文件被更改,包括 3345 次插入666 次删除
  1. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/bin_usb8801/usb8801.ko
  2. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/.mlan.mod.o.cmd
  3. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/.usb8xxx.mod.o.cmd
  4. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11d.o.cmd
  5. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n.o.cmd
  6. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n_aggr.o.cmd
  7. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n_rxreorder.o.cmd
  8. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_cfp.o.cmd
  9. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_cmdevt.o.cmd
  10. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_init.o.cmd
  11. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_join.o.cmd
  12. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_misc.o.cmd
  13. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_module.o.cmd
  14. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_scan.o.cmd
  15. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_shim.o.cmd
  16. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_cmd.o.cmd
  17. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_cmdresp.o.cmd
  18. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_event.o.cmd
  19. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_ioctl.o.cmd
  20. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_rx.o.cmd
  21. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_tx.o.cmd
  22. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_txrx.o.cmd
  23. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_cmdevent.o.cmd
  24. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_ioctl.o.cmd
  25. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_txrx.o.cmd
  26. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_usb.o.cmd
  27. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_wmm.o.cmd
  28. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_cfg80211.o.cmd
  29. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_cfgvendor.o.cmd
  30. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_debug.o.cmd
  31. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_eth_ioctl.o.cmd
  32. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_ioctl.o.cmd
  33. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_main.o.cmd
  34. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_proc.o.cmd
  35. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_shim.o.cmd
  36. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_sta_cfg80211.o.cmd
  37. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_uap.o.cmd
  38. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_uap_cfg80211.o.cmd
  39. 0 0
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_usb.o.cmd
  40. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_cfg80211.o
  41. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_cfgvendor.o
  42. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_eth_ioctl.o
  43. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_ioctl.o
  44. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_main.o
  45. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_shim.o
  46. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_sta_cfg80211.o
  47. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_uap.o
  48. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_usb.o
  49. 76 76
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.mod.c
  50. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.mod.o
  51. 二进制
      EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.o
  52. 12 0
      EVSE/Modularization/Infypwr_PsuCommObj.c
  53. 2 0
      EVSE/Modularization/Infypwr_PsuCommObj.h
  54. 150 52
      EVSE/Modularization/Module_4g.c
  55. 25 9
      EVSE/Modularization/Module_Upgrade.c
  56. 43 5
      EVSE/Modularization/Module_Wifi.c
  57. 3 0
      EVSE/Modularization/WebService.c
  58. 90 48
      EVSE/Modularization/ocpp20/MessageHandler.c
  59. 1 1
      EVSE/Modularization/ocpp20/Module_OcppBackend20.c
  60. 40 17
      EVSE/Modularization/ocppfiles/MessageHandler.c
  61. 11 3
      EVSE/Modularization/ocppfiles/Module_OcppBackend.c
  62. 1 0
      EVSE/Modularization/ocppfiles/Module_OcppBackend.h
  63. 2 0
      EVSE/Projects/AW-CCS/Apps/Module_InternalComm.c
  64. 1242 143
      EVSE/Projects/AW-CCS/Apps/main.c
  65. 9 1
      EVSE/Projects/AW-CCS/Apps/main.h
  66. 二进制
      EVSE/Projects/AW-CCS/Images/FactoryDefaultConfig.bin
  67. 二进制
      EVSE/Projects/AW-CCS/Images/MLO
  68. 二进制
      EVSE/Projects/AW-CCS/Images/ramdisk.gz
  69. 二进制
      EVSE/Projects/AW-CCS/Images/u-boot-spl.bin
  70. 二进制
      EVSE/Projects/AW-CCS/Images/u-boot.img
  71. 二进制
      EVSE/Projects/AW-CCS/Images/zImage
  72. 1 0
      EVSE/Projects/AW-Regular/Apps/Module_FactoryConfig.c
  73. 14 18
      EVSE/Projects/AW-Regular/Apps/main.c
  74. 二进制
      EVSE/Projects/AW-Regular/Images/ramdisk.gz
  75. 二进制
      EVSE/Projects/DD360Audi/Images/root/DoComm
  76. 二进制
      EVSE/Projects/DD360Audi/Images/root/Module_EvComm
  77. 二进制
      EVSE/Projects/DD360Audi/Images/root/Module_EventLogging
  78. 二进制
      EVSE/Projects/DD360Audi/Images/root/Module_InternalComm
  79. 二进制
      EVSE/Projects/DD360Audi/Images/root/main
  80. 1 0
      EVSE/Projects/DO360/Apps/FactoryConfig.c
  81. 15 2
      EVSE/Projects/DO360/Apps/Makefile
  82. 620 26
      EVSE/Projects/DO360/Apps/Module_EvComm.c
  83. 43 0
      EVSE/Projects/DO360/Apps/Module_EvComm.h
  84. 39 0
      EVSE/Projects/DO360/Apps/Module_EventLogging.c
  85. 555 24
      EVSE/Projects/DO360/Apps/main.c
  86. 二进制
      EVSE/Projects/DO360/Images/FactoryDefaultConfig.bin
  87. 二进制
      EVSE/Projects/DO360/Images/ramdisk.gz
  88. 68 126
      EVSE/Projects/DS60-120/Apps/Module_EvComm.c
  89. 13 0
      EVSE/Projects/DS60-120/Apps/Module_EvComm.h
  90. 56 3
      EVSE/Projects/DS60-120/Apps/Module_EventLogging.c
  91. 8 3
      EVSE/Projects/DS60-120/Apps/Module_InternalComm.c
  92. 3 2
      EVSE/Projects/DS60-120/Apps/Module_LcmControl.c
  93. 12 22
      EVSE/Projects/DS60-120/Apps/Module_PsuComm.c
  94. 1 1
      EVSE/Projects/DS60-120/Apps/ReadCmdline.c
  95. 164 65
      EVSE/Projects/DS60-120/Apps/main.c
  96. 1 0
      EVSE/Projects/Noodoe/Apps/Module_FactoryConfig.c
  97. 14 18
      EVSE/Projects/Noodoe/Apps/main.c
  98. 二进制
      EVSE/Projects/Noodoe/Images/ramdisk.gz
  99. 1 1
      EVSE/Projects/define.h
  100. 9 0
      EVSE/rootfs/etc/logrotate.d/evse

二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/bin_usb8801/usb8801.ko


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/.mlan.mod.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/.usb8xxx.mod.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11d.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n_aggr.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_11n_rxreorder.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_cfp.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_cmdevt.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_init.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_join.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_misc.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_module.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_scan.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_shim.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_cmd.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_cmdresp.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_event.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_ioctl.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_rx.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_sta_tx.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_txrx.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_cmdevent.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_ioctl.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_uap_txrx.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_usb.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlan/.mlan_wmm.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_cfg80211.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_cfgvendor.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_debug.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_eth_ioctl.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_ioctl.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_main.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_proc.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_shim.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_sta_cfg80211.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_uap.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_uap_cfg80211.o.cmd


文件差异内容过多而无法显示
+ 0 - 0
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/.moal_usb.o.cmd


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_cfg80211.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_cfgvendor.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_eth_ioctl.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_ioctl.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_main.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_shim.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_sta_cfg80211.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_uap.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/mlinux/moal_usb.o


+ 76 - 76
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.mod.c

@@ -18,43 +18,43 @@ static const struct modversion_info ____versions[]
 __used
 __attribute__((section("__versions"))) = {
 	{ 0x4140f67e, __VMLINUX_SYMBOL_STR(module_layout) },
-	{ 0x285b8abf, __VMLINUX_SYMBOL_STR(register_netdevice) },
+	{ 0x2052671b, __VMLINUX_SYMBOL_STR(register_netdevice) },
 	{ 0xab12aa54, __VMLINUX_SYMBOL_STR(kmalloc_caches) },
 	{ 0x12da5bb2, __VMLINUX_SYMBOL_STR(__kmalloc) },
-	{ 0x6754ad2f, __VMLINUX_SYMBOL_STR(cfg80211_cqm_rssi_notify) },
+	{ 0x11c68eb6, __VMLINUX_SYMBOL_STR(cfg80211_cqm_rssi_notify) },
 	{ 0xe4689576, __VMLINUX_SYMBOL_STR(ktime_get_with_offset) },
-	{ 0x5618227e, __VMLINUX_SYMBOL_STR(init_dummy_netdev) },
-	{ 0x7b97f6a0, __VMLINUX_SYMBOL_STR(wiphy_free) },
-	{ 0xeb059379, __VMLINUX_SYMBOL_STR(cfg80211_unlink_bss) },
+	{ 0xd4198c32, __VMLINUX_SYMBOL_STR(init_dummy_netdev) },
+	{ 0x2aae5faa, __VMLINUX_SYMBOL_STR(wiphy_free) },
+	{ 0x40364bd8, __VMLINUX_SYMBOL_STR(cfg80211_unlink_bss) },
 	{ 0xd6ee688f, __VMLINUX_SYMBOL_STR(vmalloc) },
 	{ 0x349cba85, __VMLINUX_SYMBOL_STR(strchr) },
 	{ 0xc780bf09, __VMLINUX_SYMBOL_STR(single_open) },
 	{ 0x8d095815, __VMLINUX_SYMBOL_STR(param_ops_int) },
 	{ 0x5c2e3421, __VMLINUX_SYMBOL_STR(del_timer) },
-	{ 0xab08ab20, __VMLINUX_SYMBOL_STR(napi_disable) },
+	{ 0xc01d2e1f, __VMLINUX_SYMBOL_STR(napi_disable) },
 	{ 0x97255bdf, __VMLINUX_SYMBOL_STR(strlen) },
 	{ 0x43a53735, __VMLINUX_SYMBOL_STR(__alloc_workqueue_key) },
 	{ 0x9c64fbd, __VMLINUX_SYMBOL_STR(ieee80211_frequency_to_channel) },
-	{ 0x8ed34bee, __VMLINUX_SYMBOL_STR(cfg80211_inform_bss_data) },
+	{ 0x89d126c2, __VMLINUX_SYMBOL_STR(cfg80211_inform_bss_data) },
 	{ 0xf68285c0, __VMLINUX_SYMBOL_STR(register_inetaddr_notifier) },
 	{ 0xcab8b85f, __VMLINUX_SYMBOL_STR(usb_init_urb) },
 	{ 0x510d4a93, __VMLINUX_SYMBOL_STR(single_release) },
 	{ 0xa8cde9a7, __VMLINUX_SYMBOL_STR(remove_wait_queue) },
 	{ 0xc7a4fbed, __VMLINUX_SYMBOL_STR(rtnl_lock) },
-	{ 0x82044242, __VMLINUX_SYMBOL_STR(cfg80211_report_wowlan_wakeup) },
+	{ 0xc99af5b5, __VMLINUX_SYMBOL_STR(cfg80211_report_wowlan_wakeup) },
 	{ 0x7ab88a45, __VMLINUX_SYMBOL_STR(system_freezing_cnt) },
-	{ 0xb23f2b6b, __VMLINUX_SYMBOL_STR(netif_carrier_on) },
+	{ 0x11847dba, __VMLINUX_SYMBOL_STR(netif_carrier_on) },
 	{ 0xf7802486, __VMLINUX_SYMBOL_STR(__aeabi_uidivmod) },
 	{ 0x4fe38dbd, __VMLINUX_SYMBOL_STR(down_interruptible) },
 	{ 0x32e16817, __VMLINUX_SYMBOL_STR(seq_printf) },
-	{ 0x9f8200ea, __VMLINUX_SYMBOL_STR(netif_carrier_off) },
+	{ 0xa59ea267, __VMLINUX_SYMBOL_STR(netif_carrier_off) },
 	{ 0xe379931f, __VMLINUX_SYMBOL_STR(usb_kill_urb) },
 	{ 0xec84960, __VMLINUX_SYMBOL_STR(remove_proc_entry) },
 	{ 0x480a98c8, __VMLINUX_SYMBOL_STR(mlan_unregister) },
-	{ 0xa18644d5, __VMLINUX_SYMBOL_STR(cfg80211_rx_mgmt) },
+	{ 0x82c72e85, __VMLINUX_SYMBOL_STR(cfg80211_rx_mgmt) },
 	{ 0xad902b91, __VMLINUX_SYMBOL_STR(filp_close) },
 	{ 0xe8663ae6, __VMLINUX_SYMBOL_STR(ieee80211_channel_to_frequency) },
-	{ 0xd93c8d8f, __VMLINUX_SYMBOL_STR(__dev_kfree_skb_any) },
+	{ 0x8e2595d2, __VMLINUX_SYMBOL_STR(__dev_kfree_skb_any) },
 	{ 0x5ee52022, __VMLINUX_SYMBOL_STR(init_timer_key) },
 	{ 0x28cc25db, __VMLINUX_SYMBOL_STR(arm_copy_from_user) },
 	{ 0x62b72b0d, __VMLINUX_SYMBOL_STR(mutex_unlock) },
@@ -62,20 +62,20 @@ __attribute__((section("__versions"))) = {
 	{ 0x999e8297, __VMLINUX_SYMBOL_STR(vfree) },
 	{ 0xedd6593b, __VMLINUX_SYMBOL_STR(usb_disable_autosuspend) },
 	{ 0x91715312, __VMLINUX_SYMBOL_STR(sprintf) },
-	{ 0x2cc60db2, __VMLINUX_SYMBOL_STR(skb_realloc_headroom) },
+	{ 0xc0827f2a, __VMLINUX_SYMBOL_STR(skb_realloc_headroom) },
 	{ 0xea3eb848, __VMLINUX_SYMBOL_STR(mlan_init_fw) },
 	{ 0xf4c91ed, __VMLINUX_SYMBOL_STR(ns_to_timespec) },
 	{ 0xdb2a8837, __VMLINUX_SYMBOL_STR(mlan_register) },
 	{ 0x2557ed51, __VMLINUX_SYMBOL_STR(seq_read) },
 	{ 0x937bdb02, __VMLINUX_SYMBOL_STR(kthread_create_on_node) },
-	{ 0xc9d1e535, __VMLINUX_SYMBOL_STR(netif_napi_del) },
+	{ 0x696463c4, __VMLINUX_SYMBOL_STR(netif_napi_del) },
 	{ 0x7d11c268, __VMLINUX_SYMBOL_STR(jiffies) },
 	{ 0xf4fa543b, __VMLINUX_SYMBOL_STR(arm_copy_to_user) },
 	{ 0x454efc7d, __VMLINUX_SYMBOL_STR(mlan_ioctl) },
 	{ 0xe2d5255a, __VMLINUX_SYMBOL_STR(strcmp) },
-	{ 0xb3c729e7, __VMLINUX_SYMBOL_STR(cfg80211_mgmt_tx_status) },
-	{ 0xcd774a1f, __VMLINUX_SYMBOL_STR(__netdev_alloc_skb) },
-	{ 0xbf3e1d3b, __VMLINUX_SYMBOL_STR(netif_rx) },
+	{ 0x53941399, __VMLINUX_SYMBOL_STR(cfg80211_mgmt_tx_status) },
+	{ 0x838db647, __VMLINUX_SYMBOL_STR(__netdev_alloc_skb) },
+	{ 0xd2c8b3ae, __VMLINUX_SYMBOL_STR(netif_rx) },
 	{ 0x63b87fc5, __VMLINUX_SYMBOL_STR(__init_waitqueue_head) },
 	{ 0xffd5a395, __VMLINUX_SYMBOL_STR(default_wake_function) },
 	{ 0x8736e3ea, __VMLINUX_SYMBOL_STR(PDE_DATA) },
@@ -83,76 +83,76 @@ __attribute__((section("__versions"))) = {
 	{ 0x21a972af, __VMLINUX_SYMBOL_STR(param_ops_charp) },
 	{ 0xfa2a45e, __VMLINUX_SYMBOL_STR(__memzero) },
 	{ 0x9abfcf74, __VMLINUX_SYMBOL_STR(mlan_select_wmm_queue) },
-	{ 0x92f22ad9, __VMLINUX_SYMBOL_STR(cfg80211_vendor_cmd_reply) },
-	{ 0x67f26ddf, __VMLINUX_SYMBOL_STR(cfg80211_pmksa_candidate_notify) },
+	{ 0x29ef1f11, __VMLINUX_SYMBOL_STR(cfg80211_vendor_cmd_reply) },
+	{ 0x9faa2ad5, __VMLINUX_SYMBOL_STR(cfg80211_pmksa_candidate_notify) },
 	{ 0x5f754e5a, __VMLINUX_SYMBOL_STR(memset) },
-	{ 0xd48cdd0e, __VMLINUX_SYMBOL_STR(netif_rx_ni) },
+	{ 0x688c4916, __VMLINUX_SYMBOL_STR(netif_rx_ni) },
 	{ 0x50832c67, __VMLINUX_SYMBOL_STR(mlan_set_init_param) },
 	{ 0x32dba0a3, __VMLINUX_SYMBOL_STR(proc_mkdir) },
-	{ 0xea4bf07, __VMLINUX_SYMBOL_STR(__ieee80211_get_channel) },
-	{ 0x4869a43f, __VMLINUX_SYMBOL_STR(netif_tx_wake_queue) },
-	{ 0x5f8f547c, __VMLINUX_SYMBOL_STR(netif_tx_stop_all_queues) },
+	{ 0x3735b3df, __VMLINUX_SYMBOL_STR(__ieee80211_get_channel) },
+	{ 0xe6c87111, __VMLINUX_SYMBOL_STR(netif_tx_wake_queue) },
+	{ 0xe44692b2, __VMLINUX_SYMBOL_STR(netif_tx_stop_all_queues) },
 	{ 0x11089ac7, __VMLINUX_SYMBOL_STR(_ctype) },
-	{ 0xa5ec60cd, __VMLINUX_SYMBOL_STR(cfg80211_get_bss) },
+	{ 0xab2be86a, __VMLINUX_SYMBOL_STR(cfg80211_get_bss) },
 	{ 0xac552ccc, __VMLINUX_SYMBOL_STR(freezing_slow_path) },
 	{ 0xf82657e3, __VMLINUX_SYMBOL_STR(usb_deregister) },
 	{ 0x27e1a049, __VMLINUX_SYMBOL_STR(printk) },
 	{ 0x5140c217, __VMLINUX_SYMBOL_STR(mlan_is_main_process_running) },
 	{ 0x71c90087, __VMLINUX_SYMBOL_STR(memcmp) },
-	{ 0x41ad9521, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_stopped_rtnl) },
-	{ 0x8426546e, __VMLINUX_SYMBOL_STR(netlink_kernel_release) },
+	{ 0xafbe212b, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_stopped_rtnl) },
+	{ 0x1dd670bd, __VMLINUX_SYMBOL_STR(netlink_kernel_release) },
 	{ 0xf83fc2f9, __VMLINUX_SYMBOL_STR(of_property_read_string) },
 	{ 0x7c1372e8, __VMLINUX_SYMBOL_STR(panic) },
-	{ 0xa7f3883e, __VMLINUX_SYMBOL_STR(free_netdev) },
-	{ 0x3c486d56, __VMLINUX_SYMBOL_STR(wiphy_unregister) },
+	{ 0x60a08b4e, __VMLINUX_SYMBOL_STR(free_netdev) },
+	{ 0x9209e116, __VMLINUX_SYMBOL_STR(wiphy_unregister) },
 	{ 0x328a05f1, __VMLINUX_SYMBOL_STR(strncpy) },
-	{ 0x14f684f7, __VMLINUX_SYMBOL_STR(register_netdev) },
-	{ 0x29803f8c, __VMLINUX_SYMBOL_STR(nla_put) },
-	{ 0xef332296, __VMLINUX_SYMBOL_STR(cfg80211_del_sta_sinfo) },
+	{ 0x6845d13, __VMLINUX_SYMBOL_STR(register_netdev) },
+	{ 0x79b61777, __VMLINUX_SYMBOL_STR(nla_put) },
+	{ 0x68bf3e15, __VMLINUX_SYMBOL_STR(cfg80211_del_sta_sinfo) },
 	{ 0x84b183ae, __VMLINUX_SYMBOL_STR(strncmp) },
 	{ 0xbf8ba54a, __VMLINUX_SYMBOL_STR(vprintk) },
 	{ 0xe16b893b, __VMLINUX_SYMBOL_STR(mutex_lock) },
 	{ 0x8c03d20c, __VMLINUX_SYMBOL_STR(destroy_workqueue) },
-	{ 0x89879d6b, __VMLINUX_SYMBOL_STR(dev_close) },
-	{ 0x96939687, __VMLINUX_SYMBOL_STR(cfg80211_michael_mic_failure) },
-	{ 0xa7063f4, __VMLINUX_SYMBOL_STR(wiphy_apply_custom_regulatory) },
+	{ 0x2d7a7572, __VMLINUX_SYMBOL_STR(dev_close) },
+	{ 0x631302e3, __VMLINUX_SYMBOL_STR(cfg80211_michael_mic_failure) },
+	{ 0xb6c5a378, __VMLINUX_SYMBOL_STR(wiphy_apply_custom_regulatory) },
 	{ 0x1e6d26a8, __VMLINUX_SYMBOL_STR(strstr) },
 	{ 0xa38caae0, __VMLINUX_SYMBOL_STR(mod_timer) },
-	{ 0xc178dfb1, __VMLINUX_SYMBOL_STR(netif_napi_add) },
+	{ 0xb3e84eb3, __VMLINUX_SYMBOL_STR(netif_napi_add) },
 	{ 0xa735db59, __VMLINUX_SYMBOL_STR(prandom_u32) },
 	{ 0x8e865d3c, __VMLINUX_SYMBOL_STR(arm_delay_ops) },
 	{ 0x43b0c9c3, __VMLINUX_SYMBOL_STR(preempt_schedule) },
 	{ 0x7250096a, __VMLINUX_SYMBOL_STR(request_firmware_nowait) },
 	{ 0xe7372bf2, __VMLINUX_SYMBOL_STR(up_write) },
-	{ 0x4a48f39, __VMLINUX_SYMBOL_STR(cfg80211_ibss_joined) },
-	{ 0x2f2e2e46, __VMLINUX_SYMBOL_STR(init_net) },
+	{ 0x54799d21, __VMLINUX_SYMBOL_STR(cfg80211_ibss_joined) },
+	{ 0x6aa7c4ef, __VMLINUX_SYMBOL_STR(init_net) },
 	{ 0x42160169, __VMLINUX_SYMBOL_STR(flush_workqueue) },
 	{ 0x622598b1, __VMLINUX_SYMBOL_STR(init_wait_entry) },
 	{ 0xc5257d42, __VMLINUX_SYMBOL_STR(mlan_dnld_fw) },
 	{ 0xd2a7fc04, __VMLINUX_SYMBOL_STR(mlan_write_data_async_complete) },
 	{ 0x61651be, __VMLINUX_SYMBOL_STR(strcat) },
-	{ 0x2c4783ea, __VMLINUX_SYMBOL_STR(__cfg80211_send_event_skb) },
+	{ 0xe41f3ba2, __VMLINUX_SYMBOL_STR(__cfg80211_send_event_skb) },
 	{ 0x899379ef, __VMLINUX_SYMBOL_STR(ieee80211_bss_get_ie) },
-	{ 0x4671ab14, __VMLINUX_SYMBOL_STR(cfg80211_tdls_oper_request) },
+	{ 0x60f7565c, __VMLINUX_SYMBOL_STR(cfg80211_tdls_oper_request) },
 	{ 0x15effa63, __VMLINUX_SYMBOL_STR(module_put) },
-	{ 0xa48f19b2, __VMLINUX_SYMBOL_STR(netif_device_attach) },
+	{ 0x1e5b5674, __VMLINUX_SYMBOL_STR(netif_device_attach) },
 	{ 0x9f984513, __VMLINUX_SYMBOL_STR(strrchr) },
 	{ 0x57533985, __VMLINUX_SYMBOL_STR(usb_submit_urb) },
 	{ 0x79314209, __VMLINUX_SYMBOL_STR(kmem_cache_alloc) },
-	{ 0x62f292a, __VMLINUX_SYMBOL_STR(cfg80211_ch_switch_notify) },
-	{ 0x54e14b53, __VMLINUX_SYMBOL_STR(cfg80211_roamed) },
-	{ 0xaedcda75, __VMLINUX_SYMBOL_STR(netif_device_detach) },
-	{ 0xa05f3b19, __VMLINUX_SYMBOL_STR(cfg80211_put_bss) },
-	{ 0x3b1b8bc1, __VMLINUX_SYMBOL_STR(__alloc_skb) },
+	{ 0x69316e8f, __VMLINUX_SYMBOL_STR(cfg80211_ch_switch_notify) },
+	{ 0x8cfb7809, __VMLINUX_SYMBOL_STR(cfg80211_roamed) },
+	{ 0xefe674a1, __VMLINUX_SYMBOL_STR(netif_device_detach) },
+	{ 0xa6eee309, __VMLINUX_SYMBOL_STR(cfg80211_put_bss) },
+	{ 0x96dab80a, __VMLINUX_SYMBOL_STR(__alloc_skb) },
 	{ 0x602a9a72, __VMLINUX_SYMBOL_STR(usb_get_dev) },
 	{ 0xfe029963, __VMLINUX_SYMBOL_STR(unregister_inetaddr_notifier) },
 	{ 0x12a38747, __VMLINUX_SYMBOL_STR(usleep_range) },
-	{ 0x8fee115b, __VMLINUX_SYMBOL_STR(__cfg80211_alloc_event_skb) },
+	{ 0xb9f0f588, __VMLINUX_SYMBOL_STR(__cfg80211_alloc_event_skb) },
 	{ 0xc2acc033, __VMLINUX_SYMBOL_STR(hex_dump_to_buffer) },
-	{ 0xcbeb8460, __VMLINUX_SYMBOL_STR(__cfg80211_alloc_reply_skb) },
-	{ 0xb45f6934, __VMLINUX_SYMBOL_STR(wiphy_register) },
-	{ 0xa55064ad, __VMLINUX_SYMBOL_STR(netlink_broadcast) },
-	{ 0x57132b3a, __VMLINUX_SYMBOL_STR(__napi_schedule) },
+	{ 0x4d56840f, __VMLINUX_SYMBOL_STR(__cfg80211_alloc_reply_skb) },
+	{ 0xf0e53244, __VMLINUX_SYMBOL_STR(wiphy_register) },
+	{ 0x36a234cf, __VMLINUX_SYMBOL_STR(netlink_broadcast) },
+	{ 0x2c3a86c5, __VMLINUX_SYMBOL_STR(__napi_schedule) },
 	{ 0x4f391d0e, __VMLINUX_SYMBOL_STR(nla_parse) },
 	{ 0x35a240f5, __VMLINUX_SYMBOL_STR(usb_reset_device) },
 	{ 0x87ef33de, __VMLINUX_SYMBOL_STR(usb_bulk_msg) },
@@ -161,20 +161,20 @@ __attribute__((section("__versions"))) = {
 	{ 0x1000e51, __VMLINUX_SYMBOL_STR(schedule) },
 	{ 0x2aa0e4fc, __VMLINUX_SYMBOL_STR(strncasecmp) },
 	{ 0xaccabc6a, __VMLINUX_SYMBOL_STR(in4_pton) },
-	{ 0x259c5e0a, __VMLINUX_SYMBOL_STR(cfg80211_ready_on_channel) },
-	{ 0xcd02ac6c, __VMLINUX_SYMBOL_STR(cfg80211_connect_bss) },
+	{ 0xa21dfc0f, __VMLINUX_SYMBOL_STR(cfg80211_ready_on_channel) },
+	{ 0x7d77604d, __VMLINUX_SYMBOL_STR(cfg80211_connect_bss) },
 	{ 0x6b2dc060, __VMLINUX_SYMBOL_STR(dump_stack) },
-	{ 0x3201b343, __VMLINUX_SYMBOL_STR(wiphy_new_nm) },
-	{ 0x5ce44700, __VMLINUX_SYMBOL_STR(alloc_netdev_mqs) },
-	{ 0xa004a247, __VMLINUX_SYMBOL_STR(napi_complete_done) },
+	{ 0xb273e660, __VMLINUX_SYMBOL_STR(wiphy_new_nm) },
+	{ 0x44dbe219, __VMLINUX_SYMBOL_STR(alloc_netdev_mqs) },
+	{ 0x1a1906a7, __VMLINUX_SYMBOL_STR(napi_complete_done) },
 	{ 0x4482cdb, __VMLINUX_SYMBOL_STR(__refrigerator) },
-	{ 0xe23431e6, __VMLINUX_SYMBOL_STR(eth_type_trans) },
-	{ 0xbe7531a2, __VMLINUX_SYMBOL_STR(vfs_mkdir) },
-	{ 0x820c9e6b, __VMLINUX_SYMBOL_STR(wake_up_process) },
-	{ 0xcbf2dd16, __VMLINUX_SYMBOL_STR(ether_setup) },
-	{ 0xd8755d68, __VMLINUX_SYMBOL_STR(cfg80211_disconnected) },
-	{ 0x29f8ba1b, __VMLINUX_SYMBOL_STR(unregister_netdevice_queue) },
-	{ 0x38b9b09c, __VMLINUX_SYMBOL_STR(cfg80211_new_sta) },
+	{ 0xaf6486fa, __VMLINUX_SYMBOL_STR(eth_type_trans) },
+	{ 0x238c12ce, __VMLINUX_SYMBOL_STR(vfs_mkdir) },
+	{ 0x8033106d, __VMLINUX_SYMBOL_STR(wake_up_process) },
+	{ 0x23eea564, __VMLINUX_SYMBOL_STR(ether_setup) },
+	{ 0x581a572d, __VMLINUX_SYMBOL_STR(cfg80211_disconnected) },
+	{ 0xf78b7d06, __VMLINUX_SYMBOL_STR(unregister_netdevice_queue) },
+	{ 0x94e403a9, __VMLINUX_SYMBOL_STR(cfg80211_new_sta) },
 	{ 0xec6f57f1, __VMLINUX_SYMBOL_STR(mlan_send_packet) },
 	{ 0xb9e52429, __VMLINUX_SYMBOL_STR(__wake_up) },
 	{ 0xb3f7646e, __VMLINUX_SYMBOL_STR(kthread_should_stop) },
@@ -182,36 +182,36 @@ __attribute__((section("__versions"))) = {
 	{ 0x4f68e5c9, __VMLINUX_SYMBOL_STR(do_gettimeofday) },
 	{ 0xfc32203f, __VMLINUX_SYMBOL_STR(proc_create_data) },
 	{ 0x422b5c7a, __VMLINUX_SYMBOL_STR(of_find_node_by_name) },
-	{ 0x8555609a, __VMLINUX_SYMBOL_STR(kern_path_create) },
-	{ 0x1314439f, __VMLINUX_SYMBOL_STR(eth_validate_addr) },
-	{ 0xe012ed1d, __VMLINUX_SYMBOL_STR(__netlink_kernel_create) },
+	{ 0x51323aa2, __VMLINUX_SYMBOL_STR(kern_path_create) },
+	{ 0x8ca44468, __VMLINUX_SYMBOL_STR(eth_validate_addr) },
+	{ 0xce758717, __VMLINUX_SYMBOL_STR(__netlink_kernel_create) },
 	{ 0xfe634f58, __VMLINUX_SYMBOL_STR(add_wait_queue) },
 	{ 0x175da391, __VMLINUX_SYMBOL_STR(seq_lseek) },
 	{ 0x37a0cba, __VMLINUX_SYMBOL_STR(kfree) },
-	{ 0x82eb6099, __VMLINUX_SYMBOL_STR(regulatory_hint) },
+	{ 0xafe534fd, __VMLINUX_SYMBOL_STR(regulatory_hint) },
 	{ 0x9d669763, __VMLINUX_SYMBOL_STR(memcpy) },
-	{ 0x928991ce, __VMLINUX_SYMBOL_STR(dev_alloc_name) },
+	{ 0x6f257e9, __VMLINUX_SYMBOL_STR(dev_alloc_name) },
 	{ 0x364b3fff, __VMLINUX_SYMBOL_STR(up) },
 	{ 0xfb1d1a56, __VMLINUX_SYMBOL_STR(usb_register_driver) },
 	{ 0xd6feee80, __VMLINUX_SYMBOL_STR(request_firmware) },
 	{ 0x8893fa5d, __VMLINUX_SYMBOL_STR(finish_wait) },
 	{ 0x492b3824, __VMLINUX_SYMBOL_STR(pm_runtime_set_autosuspend_delay) },
-	{ 0x8f649e49, __VMLINUX_SYMBOL_STR(cfg80211_remain_on_channel_expired) },
-	{ 0xe9e09fb8, __VMLINUX_SYMBOL_STR(unregister_netdev) },
+	{ 0xc380d559, __VMLINUX_SYMBOL_STR(cfg80211_remain_on_channel_expired) },
+	{ 0xed83406e, __VMLINUX_SYMBOL_STR(unregister_netdev) },
 	{ 0x4d4a817b, __VMLINUX_SYMBOL_STR(mlan_rx_process) },
 	{ 0x335e2953, __VMLINUX_SYMBOL_STR(mlan_recv) },
 	{ 0xb2d48a2e, __VMLINUX_SYMBOL_STR(queue_work_on) },
 	{ 0xb81960ca, __VMLINUX_SYMBOL_STR(snprintf) },
 	{ 0x99bb8806, __VMLINUX_SYMBOL_STR(memmove) },
 	{ 0x2d9fe31b, __VMLINUX_SYMBOL_STR(mlan_shutdown_fw) },
-	{ 0x4ee49a43, __VMLINUX_SYMBOL_STR(consume_skb) },
+	{ 0xe7eac33, __VMLINUX_SYMBOL_STR(consume_skb) },
 	{ 0xb00b22ef, __VMLINUX_SYMBOL_STR(param_ops_ushort) },
-	{ 0x475ac098, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_stopped) },
-	{ 0x734dfd3a, __VMLINUX_SYMBOL_STR(dev_set_name) },
+	{ 0x7ff3f893, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_stopped) },
+	{ 0xec1aea67, __VMLINUX_SYMBOL_STR(dev_set_name) },
 	{ 0x85670f1d, __VMLINUX_SYMBOL_STR(rtnl_is_locked) },
-	{ 0xfc758c79, __VMLINUX_SYMBOL_STR(cfg80211_scan_done) },
+	{ 0x8c118a58, __VMLINUX_SYMBOL_STR(cfg80211_scan_done) },
 	{ 0x5fe4f31a, __VMLINUX_SYMBOL_STR(of_property_read_variable_u32_array) },
-	{ 0xbb4a80f5, __VMLINUX_SYMBOL_STR(skb_put) },
+	{ 0xafd79b08, __VMLINUX_SYMBOL_STR(skb_put) },
 	{ 0x739dde3a, __VMLINUX_SYMBOL_STR(param_ops_uint) },
 	{ 0xb3985af5, __VMLINUX_SYMBOL_STR(usb_free_urb) },
 	{ 0xc828361c, __VMLINUX_SYMBOL_STR(release_firmware) },
@@ -222,8 +222,8 @@ __attribute__((section("__versions"))) = {
 	{ 0xc040edf2, __VMLINUX_SYMBOL_STR(usb_alloc_urb) },
 	{ 0xe914e41e, __VMLINUX_SYMBOL_STR(strcpy) },
 	{ 0xfe380057, __VMLINUX_SYMBOL_STR(filp_open) },
-	{ 0xeaa78680, __VMLINUX_SYMBOL_STR(alloc_etherdev_mqs) },
-	{ 0x8f293d1a, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_results) },
+	{ 0xa8003fd3, __VMLINUX_SYMBOL_STR(alloc_etherdev_mqs) },
+	{ 0xe56df8f9, __VMLINUX_SYMBOL_STR(cfg80211_sched_scan_results) },
 	{ 0x2b7f61f6, __VMLINUX_SYMBOL_STR(mlan_main_process) },
 };
 

二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.mod.o


二进制
EVSE/GPL/USB-8801-U16-X86-W14.68.36.p131-C4X14616_B0-MGPL/wlan_src/usb8xxx.o


+ 12 - 0
EVSE/Modularization/Infypwr_PsuCommObj.c

@@ -360,6 +360,7 @@ void ReceiveDataFromCanBus()
 				}
 					break;
 
+				case MODULE_CAP:
 				case INFYPWR_GROUP_SHIFT | MODULE_CAP:
 				{
 					if (!colFinished)
@@ -769,6 +770,17 @@ void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switc
 	SendCmdToPsu(cmd, data, sizeof(data));
 }
 
+void SetDipSwitchMode()
+{
+	byte data[8];
+	uint cmd = INFYPWR_CMD | DIP_SWITCH_MODE;
+
+	memset(data, 0x00, ARRAY_SIZE(data));
+	data[0] = 0x01;
+
+	cmd |= INFYPWR_BROADCAST | INFYPWR_DEFAULT;
+	SendCmdToPsu(cmd, data, sizeof(data));
+}
 /**********************************************************************************/
 /***                                                                            ***/
 /***                                   Get                                      ***/

+ 2 - 0
EVSE/Modularization/Infypwr_PsuCommObj.h

@@ -93,6 +93,7 @@ enum PSU_SET_CMD
 	SLEEP_MODE =  	            0x00990000,		// 當 SWITCH POWER 打開時,可透過該指令讓模塊休眠 (風扇會停)
     SWITCH_POWER = 	            0x009A0000,		// 打開,則模塊依照設定的輸出功率輸出
 	PRESENT_OUT_VOL = 			0x009B0000,
+	DIP_SWITCH_MODE	=			0x009F0000,		// 設定所有模塊的地址為撥碼方式
 	/*Ver : 9.06 used*/
 	TEST_PRESENT_OUT = 			0x180100E5,
 	/*Upgrade*/
@@ -147,6 +148,7 @@ void FlashLed(byte group, byte value);
 void PresentOutputVol(byte group, int voltage, int current);
 void FanNoiseInfo(byte group, byte value);
 void SetWalkInConfig(byte group, byte enable, byte sec);
+void SetDipSwitchMode();
 
 /*Ver : 9.06 used*/
 void SetDirModulePresentOutput(byte group, int voltage, int current, byte _switch, byte _interRelay);

+ 150 - 52
EVSE/Modularization/Module_4g.c

@@ -2,9 +2,9 @@
  *  Module_4g.c
  *
  *  Created on: 2019-11-29
- *  Update on: 2020-09-16
+ *  Update on: 2020-11-26
  *  Author: Eason Yang
- *  Version: V0.06
+ *  Version: V0.07
  */
 
 #include    <sys/types.h>
@@ -80,7 +80,7 @@ void substr(char *dest, const char* src, unsigned int start, unsigned int cnt);
 
 char *portName[3] 				= {"/dev/ttyUSB2", "/dev/ttyUSB2", "/dev/ttyACM2"};
 char *valid_Internet[2] 		= {"8.8.8.8", "180.76.76.76"};
-char *Version_And_Date[2]		= {"V0.06","2020-09-16"};
+char *Version_And_Date[2]		= {"V0.07","2020-11-26"};
 pid_t	pid;
 
 struct dongle_info
@@ -303,7 +303,7 @@ int isReadInfo(void)
 	int uart;
 	char rx[512];
 	char tmp[512];
-	char Lenght;
+	char Length;
 	int modeStatus;
 
 	if((uart = openPort(portName[Dongle.Model])) != FAIL)
@@ -315,20 +315,36 @@ int isReadInfo(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Length = at_command(uart, "ate0\r", rx);
+				if(Length > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
 				// Read Manufacturer
 				//==============================
-				Lenght = at_command(uart, "at+gmi\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+gmi\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,"OK"));
 					memset(rx, 0, sizeof rx);
-					trim_s(tmp,Lenght);
-					strcpy(Dongle.MANUFACTURER, tmp);
+					trim_s(tmp,Length);
+
+					if(strstr(tmp, "atgmi") != NULL)
+					{
+						substr(tmp, tmp, 5, strlen(tmp)-5);
+					}
+
+					strncpy(Dongle.MANUFACTURER, tmp, strlen(tmp));
 				}
 				else
 					result = FAIL;
@@ -336,13 +352,19 @@ int isReadInfo(void)
 				//==============================
 				// Read Model
 				//==============================
-				Lenght = at_command(uart, "at+gmm\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+gmm\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,"OK"));
 					memset(rx, 0, sizeof rx);
-					trim_s(tmp,Lenght);
+					trim_s(tmp,Length);
+
+					if(strstr(tmp, "atgmm") != NULL)
+					{
+						substr(tmp, tmp, 5, strlen(tmp)-5);
+					}
+
 					strncpy(Dongle.MODELNAME, tmp, strlen(tmp));
 				}
 				else
@@ -351,13 +373,19 @@ int isReadInfo(void)
 				//==============================
 				// Read Revision
 				//==============================
-				Lenght = at_command(uart, "at+gmr\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+gmr\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx, "OK"));
 					memset(rx, 0, sizeof rx);
-					trim_s(tmp,Lenght);
+					trim_s(tmp,Length);
+
+					if(strstr(tmp, "atgmr") != NULL)
+					{
+						substr(tmp, tmp, 5, strlen(tmp)-5);
+					}
+
 					strncpy(Dongle.REVISION, tmp, strlen(tmp));
 				}
 				else
@@ -366,13 +394,19 @@ int isReadInfo(void)
 				//==============================
 				// Read IMEI
 				//==============================
-				Lenght = at_command(uart, "at+gsn\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+gsn\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx, "OK"));
 					memset(rx, 0, sizeof rx);
-					trim_s(tmp,Lenght);
+					trim_s(tmp,Length);
+
+					if(strstr(tmp, "atgsn") != NULL)
+					{
+						substr(tmp, tmp, 5, strlen(tmp)-5);
+					}
+
 					strncpy(Dongle.IMEI, tmp, strlen(tmp));
 				}
 				else
@@ -381,8 +415,8 @@ int isReadInfo(void)
 				//==============================
 				// Read CSQ
 				//==============================
-				Lenght = at_command(uart, "at+csq\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+csq\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,","));
@@ -395,8 +429,8 @@ int isReadInfo(void)
 				//==============================
 				// Read Mode
 				//==============================
-				Lenght = at_command(uart, "at+qcfg= \"nwscanmode\"\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+qcfg= \"nwscanmode\"\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,"OK"));
@@ -429,14 +463,24 @@ int isReadInfo(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Length = at_command(uart, "ate0\r", rx);
+				if(Length > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
 				// Read Manufacturer
 				//==============================
-				Lenght = at_command(uart, "at+cgmi\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cgmi\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,"OK"));
@@ -449,8 +493,8 @@ int isReadInfo(void)
 				//==============================
 				// Read Model
 				//==============================
-				Lenght = at_command(uart, "at+cgmm\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cgmm\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,"OK"));
@@ -463,8 +507,8 @@ int isReadInfo(void)
 				//==============================
 				// Read Revision
 				//==============================
-				Lenght = at_command(uart, "at+cgmr\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cgmr\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx, "OK"));
@@ -477,13 +521,13 @@ int isReadInfo(void)
 				//==============================
 				// Read IMEI
 				//==============================
-				Lenght = at_command(uart, "at+cgsn\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cgsn\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx, "OK"));
 					memset(rx, 0, sizeof rx);
-					trim_s(tmp,Lenght);
+					trim_s(tmp,Length);
 					strncpy(Dongle.IMEI, tmp, strlen(tmp));
 				}
 				else
@@ -492,8 +536,8 @@ int isReadInfo(void)
 				//==============================
 				// Read CSQ
 				//==============================
-				Lenght = at_command(uart, "at+csq\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+csq\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					memcpy(tmp, rx, strcspn(rx,","));
@@ -528,7 +572,7 @@ int isReadSimInfo(void)
 	int uart;
 	char rx[512];
 	char tmp[512];
-	char Lenght;
+	char Length;
 
 	if((uart = openPort(portName[Dongle.Model])) != FAIL)
 	{
@@ -539,17 +583,27 @@ int isReadSimInfo(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Length = at_command(uart, "ate0\r", rx);
+				if(Length > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
 				// Read IMSI
 				//==============================
-				Lenght = at_command(uart, "at+cimi\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cimi\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
-					if (strstr(rx, "ERROR"))
+					if(strstr(rx, "ERROR"))
 					{
 						memset(Dongle.IMSI, 0, sizeof Dongle.IMSI);
 						result = FAIL;
@@ -557,8 +611,14 @@ int isReadSimInfo(void)
 					else
 					{
 						memcpy(tmp, rx, strcspn(rx, "OK"));
-						trim_s(tmp, Lenght);
+						trim_s(tmp, Length);
 						memset(rx, 0, sizeof rx);
+
+						if(strstr(tmp, "atcimi") != NULL)
+						{
+							substr(tmp, tmp, 6, strlen(tmp)-6);
+						}
+
 						strncpy(Dongle.IMSI, tmp, strlen(tmp));
 					}
 				}
@@ -568,11 +628,11 @@ int isReadSimInfo(void)
 				//==============================
 				// Read CCID
 				//==============================
-				Lenght = at_command(uart, "at+qccid\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+qccid\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
-					if (strstr(rx, "ERROR"))
+					if(strstr(rx, "ERROR"))
 					{
 						memset(Dongle.ICCID, 0, sizeof Dongle.ICCID);
 						result = FAIL;
@@ -592,14 +652,24 @@ int isReadSimInfo(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Length = at_command(uart, "ate0\r", rx);
+				if(Length > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
 				// Read IMSI
 				//==============================
-				Lenght = at_command(uart, "at+cimi\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+cimi\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					if(strstr(rx, "ERROR"))
@@ -611,8 +681,14 @@ int isReadSimInfo(void)
 					{
 						memcpy(tmp, rx, strcspn(rx,"OK"));
 						memset(rx, 0, sizeof rx);
-						trim_s(tmp,Lenght);
-						strncpy(Dongle.IMSI , tmp, strlen(tmp));
+						trim_s(tmp,Length);
+
+						if(strstr(tmp, "atcimi") != NULL)
+						{
+							substr(tmp, tmp, 6, strlen(tmp)-6);
+						}
+
+						strncpy(Dongle.IMSI, tmp, strlen(tmp));
 					}
 				}
 				else
@@ -621,8 +697,8 @@ int isReadSimInfo(void)
 				//==============================
 				// Read CCID
 				//==============================
-				Lenght = at_command(uart, "at+ccid\r", rx);
-				if(Lenght > 0)
+				Length = at_command(uart, "at+ccid\r", rx);
+				if(Length > 0)
 				{
 					memset(tmp, 0, sizeof tmp);
 					if(strstr(rx, "ERROR"))
@@ -675,7 +751,17 @@ int CheckSignalRssi(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Lenght = at_command(uart, "ate0\r", rx);
+				if(Lenght > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
@@ -699,7 +785,17 @@ int CheckSignalRssi(void)
 				//==============================
 				// Set don't echo command
 				//==============================
-				if(at_command(uart, "ate0\r", rx) <= 0)
+				Lenght = at_command(uart, "ate0\r", rx);
+				if(Lenght > 0)
+				{
+					if(strstr(rx, "ERROR"))
+					{
+						result = FAIL;
+					}
+					else
+					{}
+				}
+				else
 					result = FAIL;
 
 				//==============================
@@ -944,11 +1040,13 @@ int at_command(int uart, char* cmd, char* rx)
 {
 	int len;
 	//sleep(2); //required to make flush work, for some reason
+	//DEBUG_INFO("cmd : %s \n", cmd);
 	tcflush(uart,TCIOFLUSH);
 	if(write(uart, cmd, strlen(cmd)) >= sizeof(cmd))
 	{
 		usleep(500000);
 		len = read(uart, rx, 512);
+		//DEBUG_INFO("rx : %s \n", rx);
 	}
 	else
 	{

+ 25 - 9
EVSE/Modularization/Module_Upgrade.c

@@ -160,7 +160,7 @@ int Upgrade_Flash(unsigned int Type,char *SourcePath,char *ModelName)
     fd = open(SourcePath, O_RDONLY);
     if(fd < 0)
     {
-        DEBUG_ERROR("UpdateRootfs NG - can not open rootfs\n");
+        DEBUG_ERROR("UpdateRootfs NG - can not open image file %s\n", SourcePath);
         return result;
     }
 
@@ -671,7 +671,7 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
     fd = open(SourcePath, O_RDONLY);
     if(fd < 0)
     {
-        DEBUG_ERROR("UpdateRootfs NG - can not open rootfs\n");
+        DEBUG_ERROR("UpdateRootfs NG - can not open image file %s\n", SourcePath);
         return result;
     }
 
@@ -735,13 +735,29 @@ int Upgrade_UART(int uartfdOrd,unsigned int Type,unsigned char TargetAddr,char *
                         if(CNT_Fail>=10)
                         {
                             uart_update_abord(uartfd, TargetAddr);
-                            DEBUG_ERROR("UART upgrade retry > limits, aboard upgrade.\n");
-                            printf("UART upgrade retry > limits, aboard upgrade.\n");
+                            DEBUG_ERROR("UART upgrade transfer retry > limits, aboard upgrade.\n");
                         }
-                        else if(uart_update_finish(uartfd, TargetAddr)==PASS)
+                        else
                         {
-                            result = PASS;
-                            printf("UART upgrade success.\n");
+                        	do
+                        	{
+                        		if(uart_update_finish(uartfd, TargetAddr)==PASS)
+                        			break;
+                        		else
+                        			DEBUG_WARN("Upgrade finish fail, retry %d \n", ++CNT_Fail);
+                        	}while(CNT_Fail<10);
+
+                        	if(CNT_Fail>=10)
+                        	{
+                        		uart_update_abord(uartfd, TargetAddr);
+                        		DEBUG_ERROR("UART upgrade finish retry > limits, aboard upgrade.\n");
+                        	}
+                        	else
+                        	{
+                        		result = PASS;
+                        		printf("UART upgrade success.\n");
+                        	}
+
                         }
                     }
                     else
@@ -930,7 +946,7 @@ int Upgrade_CAN(int canfd,unsigned int Type,unsigned char TargetAddr,char *Sourc
     fd = open(SourcePath, O_RDONLY);
     if(fd < 0)
     {
-        DEBUG_ERROR("UpdateRootfs NG - can not open rootfs\n");
+        DEBUG_ERROR("UpdateRootfs NG - can not open image file %s\n", SourcePath);
         return result;
     }
 
@@ -1034,7 +1050,7 @@ int Check_CCS_image_header(unsigned int Type,char *SourcePath,char *ModelName)
     fd = open(SourcePath, O_RDONLY);
     if(fd < 0)
     {
-        DEBUG_ERROR("Update CCS NG - can not open upgrade image\n");
+        DEBUG_ERROR("Update CCS NG - can not open upgrade image %s\n", SourcePath);
         return FAIL;
     }
 

+ 43 - 5
EVSE/Modularization/Module_Wifi.c

@@ -261,7 +261,7 @@ int isValidCheckSum(uint8_t *message);
 char *Support_InterfaceSTA[2]	= {"mlan0", "wlan0"};
 char *Support_InterfaceAP[1]	= {"uap0"};
 char *valid_Internet[2]			= {"8.8.8.8", "180.76.76.76"};
-char *Version_And_Date[2]		= {"V0.14","2020-11-19"};
+char *Version_And_Date[2]		= {"V0.15","2020-11-26"};
 int protocol_Version [] 		= {0,7,0};
 
 int StoreLogMsg(const char *fmt, ...)
@@ -419,8 +419,7 @@ int InitShareMemory()
 		DEBUG_ERROR("shmat ShmPsuData NG \n");
 		#endif
 		result = FAIL;
-	 }
-	memset(ShmPsuData,0,sizeof(struct PsuData));
+	}
 
     return result;
 }
@@ -892,6 +891,8 @@ int setWPAconf()
 			system(cmdBuf);
 			sprintf(cmdBuf, "echo wpa_key_mgmt=WPA-PSK >> /etc/hostapd.conf");
 			system(cmdBuf);
+			sprintf(cmdBuf, "echo wpa_pairwise=CCMP >> /etc/hostapd.conf");
+			system(cmdBuf);
 			sprintf(cmdBuf, "hostapd /etc/hostapd.conf -B");
 			system(cmdBuf);
 
@@ -4686,6 +4687,33 @@ void proc_killConnection()
 	memset(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiGatewayAddress, 0, sizeof ShmSysConfigAndInfo->SysConfig.AthInterface.WifiGatewayAddress);
 }
 
+unsigned int isKernelSupportNAT()
+{
+	unsigned int result = NO;
+	unsigned int version = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[512];
+
+	// Get IP address & net mask
+	strcpy(cmd, "uname -v");
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		if(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			sscanf(buf, "#%d", &version);
+			DEBUG_INFO("Kernel version: %d\n", result);
+
+			if(version >= 30)
+				result = YES;
+		}
+	}
+	pclose(fp);
+
+	return result;
+}
+
 //==========================================
 // Main loop
 //==========================================
@@ -4763,8 +4791,18 @@ int main(void)
 	// Install WIFI module driver
 	//=============================================
 	#ifdef UBLOX
-		system("insmod /lib/modules/mlan.ko");
-		system("insmod /lib/modules/usb8801.ko");
+		if(isKernelSupportNAT() == YES)
+		{
+			system("insmod /lib/modules/mlan_nat.ko");
+			system("insmod /lib/modules/usb8801_nat.ko");
+		}
+		else
+		{
+			system("insmod /lib/modules/mlan.ko");
+			system("insmod /lib/modules/usb8801.ko");
+		}
+
+		system("echo 1 > /proc/sys/net/ipv4/ip_forward");
 		sleep(5);
 		system("ifconfig mlan0 up");
 		system("ifconfig uap0 up");

+ 3 - 0
EVSE/Modularization/WebService.c

@@ -1446,6 +1446,7 @@ int main(int argc, char *argv[]) {
 		struct json_object *DDConnector2FwRevArr= json_object_new_array();
 		struct json_object *DDIntensity[4];
 		struct json_object *DDIntensityArr= json_object_new_array();
+		struct json_object *Relay2ModuleFwRev;
 
 		//charging
 		struct json_object *MaxChargingEnergy;
@@ -1674,6 +1675,7 @@ int main(int argc, char *argv[]) {
 				json_object_array_add(DDConnector2FwRevArr,DDConnector2FwRev[i]);
 				json_object_array_add(DDIntensityArr,DDIntensity[i]);
 			}
+			Relay2ModuleFwRev = json_object_new_string((char *)&ShmSysConfigAndInfo->SysInfo.Relay2ModuleFwRev);
 		}
 
 		//charging
@@ -2118,6 +2120,7 @@ int main(int argc, char *argv[]) {
 			json_object_object_add(jobj1,"DDConnector1FwRev",DDConnector1FwRevArr);
 			json_object_object_add(jobj1,"DDConnector2FwRev",DDConnector2FwRevArr);
 			json_object_object_add(jobj1,"DDIntensity",DDIntensityArr);
+			json_object_object_add(jobj1,"Relay2ModuleFwRev",Relay2ModuleFwRev);
 		}
 
 		printf("%s\n", json_object_to_json_string(jobj1));

+ 90 - 48
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -1,5 +1,6 @@
 #include "Module_OcppBackend20.h"
 #include "define.h"
+//#define TEST_OCPP20
 
 static char *APNAuthenticationEnumTypeStr[] = {
 	MACROSTR(CHAP),
@@ -4744,6 +4745,15 @@ void CheckSystemValue(void)
 	//===============================
 	for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
 	{
+		//==========================================
+		// csu trigger DataTransferReq
+		//==========================================
+		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP20Data->CsMsg.bits[gun_index].DataTransferReq == ON))
+		{
+			sendDataTransferRequest(gun_index);
+			ShmOCPP20Data->CsMsg.bits[gun_index].DataTransferReq = OFF;
+		}
+
 		//===============================
 		// CSU Trigger Smart Charging Profilw
 		//===============================
@@ -5348,15 +5358,6 @@ void CheckSystemValue(void)
 			sendReserveNowConfirmation((char *)ShmOCPP20Data->ReserveNow[gun_index].guid, gun_index);
 			ShmOCPP20Data->CsMsg.bits[gun_index].ReserveNowConf = OFF;
 		}
-
-		//==========================================
-		// csu trigger DataTransferReq
-		//==========================================
-		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP20Data->CsMsg.bits[gun_index].DataTransferReq == ON))
-		{
-			sendDataTransferRequest(gun_index);
-			ShmOCPP20Data->CsMsg.bits[gun_index].DataTransferReq = OFF;
-		}
 	}
 }
 
@@ -7346,7 +7347,7 @@ S_FAULT                 =12
 						currentStatus = ConnectorStatusEnumType_Available; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -7408,7 +7409,7 @@ S_FAULT                 =12
 						currentStatus = ConnectorStatusEnumType_Available; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -7469,7 +7470,7 @@ S_FAULT                 =12
 						currentStatus = ConnectorStatusEnumType_Available; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -7522,7 +7523,7 @@ S_FAULT                 =12
 						currentStatus = ConnectorStatusEnumType_Available; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_PREPARING) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_AUTHORIZING) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 						  ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -7648,7 +7649,6 @@ int sendTransactionEventRequest(int gun_index)
 {
 	mtrace();
 	int result = FAIL;
-	static uint32_t seqNo[CONNECTOR_QUANTITY] = {0};
 	char message[1024*20]={0};
 	char guid[37]={0};
 	char tempdata[128]={0};
@@ -7674,24 +7674,24 @@ int sendTransactionEventRequest(int gun_index)
 		{
 			if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex))
 			{
-				memset(&ShmOCPP20Data->TransactionEvent[index], 0x00, sizeof(struct TransactionEvent_20));
-
 				getNowDatetime(ShmOCPP20Data->TransactionEvent[index].timestamp);
 
-				if((seqNo[index]+1) < INT_MAX)
-					seqNo[index]++;
+				if((ShmOCPP20Data->TransactionEvent[index].seqNo + 1) < INT_MAX)
+					ShmOCPP20Data->TransactionEvent[index].seqNo++;
 				else
-					seqNo[index] = 0;
+					ShmOCPP20Data->TransactionEvent[index].seqNo = 0;
 
-				ShmOCPP20Data->TransactionEvent[index].seqNo = seqNo[index];
 				ShmOCPP20Data->TransactionEvent[index].offline = (!ShmOCPP20Data->OcppConnStatus?TRUE:FALSE);
 
 				ShmOCPP20Data->TransactionEvent[index].evse.id = 0;
 				ShmOCPP20Data->TransactionEvent[index].evse.connectorId = (gun_index + 1);
 
-
 				if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)//S_IDLE
 				{
+					memset(&ShmOCPP20Data->TransactionEvent[index].transactionInfo, 0x00, sizeof(struct TransactionType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].idToken, 0x00, sizeof(struct IdTokenType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].meterValue, 0x00, sizeof(struct MeterValueType));
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Started]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Idle]);
 
@@ -7720,6 +7720,11 @@ int sendTransactionEventRequest(int gun_index)
 				}
 				else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
 				{
+					if(strlen((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId) == 0)
+						random_uuid(ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId);
+
+					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].idToken.idToken, "%s", ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].StartUserId);
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Updated]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Charging]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].triggerReason, "%s", TriggerReasonEnumTypeStr[TriggerReasonEnumType_ChargingStateChanged]);
@@ -7774,16 +7779,13 @@ int sendTransactionEventRequest(int gun_index)
 		{
 			if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
 			{
-				memset(&ShmOCPP20Data->TransactionEvent[index], 0x00, sizeof(struct TransactionEvent_20));
-
 				getNowDatetime(ShmOCPP20Data->TransactionEvent[index].timestamp);
 
-				if((seqNo[index]+1) < INT_MAX)
-					seqNo[index]++;
+				if((ShmOCPP20Data->TransactionEvent[index].seqNo + 1) < INT_MAX)
+					ShmOCPP20Data->TransactionEvent[index].seqNo++;
 				else
-					seqNo[index] = 0;
+					ShmOCPP20Data->TransactionEvent[index].seqNo = 0;
 
-				ShmOCPP20Data->TransactionEvent[index].seqNo = seqNo[index];
 				ShmOCPP20Data->TransactionEvent[index].offline = (!ShmOCPP20Data->OcppConnStatus?TRUE:FALSE);
 
 				ShmOCPP20Data->TransactionEvent[index].evse.id = 0;
@@ -7791,6 +7793,10 @@ int sendTransactionEventRequest(int gun_index)
 
 				if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
 				{
+					memset(&ShmOCPP20Data->TransactionEvent[index].transactionInfo, 0x00, sizeof(struct TransactionType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].idToken, 0x00, sizeof(struct IdTokenType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].meterValue, 0x00, sizeof(struct MeterValueType));
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Started]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Idle]);
 
@@ -7819,6 +7825,11 @@ int sendTransactionEventRequest(int gun_index)
 				}
 				else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
 				{
+					if(strlen((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId) == 0)
+						random_uuid(ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId);
+
+					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].idToken.idToken, "%s", ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].StartUserId);
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Updated]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Charging]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].triggerReason, "%s", TriggerReasonEnumTypeStr[TriggerReasonEnumType_ChargingStateChanged]);
@@ -7872,16 +7883,13 @@ int sendTransactionEventRequest(int gun_index)
 		{
 			if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
 			{
-				memset(&ShmOCPP20Data->TransactionEvent[index], 0x00, sizeof(struct TransactionEvent_20));
-
 				getNowDatetime(ShmOCPP20Data->TransactionEvent[index].timestamp);
 
-				if((seqNo[index]+1) < INT_MAX)
-					seqNo[index]++;
+				if((ShmOCPP20Data->TransactionEvent[index].seqNo + 1) < INT_MAX)
+					ShmOCPP20Data->TransactionEvent[index].seqNo++;
 				else
-					seqNo[index] = 0;
+					ShmOCPP20Data->TransactionEvent[index].seqNo = 0;
 
-				ShmOCPP20Data->TransactionEvent[index].seqNo = seqNo[index];
 				ShmOCPP20Data->TransactionEvent[index].offline = (!ShmOCPP20Data->OcppConnStatus?TRUE:FALSE);
 
 				ShmOCPP20Data->TransactionEvent[index].evse.id = 0;
@@ -7889,6 +7897,10 @@ int sendTransactionEventRequest(int gun_index)
 
 				if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
 				{
+					memset(&ShmOCPP20Data->TransactionEvent[index].transactionInfo, 0x00, sizeof(struct TransactionType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].idToken, 0x00, sizeof(struct IdTokenType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].meterValue, 0x00, sizeof(struct MeterValueType));
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Started]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Idle]);
 
@@ -7917,6 +7929,11 @@ int sendTransactionEventRequest(int gun_index)
 				}
 				else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
 				{
+					if(strlen((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId) == 0)
+						random_uuid(ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId);
+
+					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].idToken.idToken, "%s", ShmSysConfigAndInfo->SysInfo.GbChargingData[index].StartUserId);
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Updated]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Charging]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].triggerReason, "%s", TriggerReasonEnumTypeStr[TriggerReasonEnumType_ChargingStateChanged]);
@@ -7963,16 +7980,13 @@ int sendTransactionEventRequest(int gun_index)
 		{
 			if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.Index == tempIndex)
 			{
-				memset(&ShmOCPP20Data->TransactionEvent[index], 0x00, sizeof(struct TransactionEvent_20));
-
 				getNowDatetime(ShmOCPP20Data->TransactionEvent[index].timestamp);
 
-				if((seqNo[index]+1) < INT_MAX)
-					seqNo[index]++;
+				if((ShmOCPP20Data->TransactionEvent[index].seqNo + 1) < INT_MAX)
+					ShmOCPP20Data->TransactionEvent[index].seqNo++;
 				else
-					seqNo[index] = 0;
+					ShmOCPP20Data->TransactionEvent[index].seqNo = 0;
 
-				ShmOCPP20Data->TransactionEvent[index].seqNo = seqNo[index];
 				ShmOCPP20Data->TransactionEvent[index].offline = (!ShmOCPP20Data->OcppConnStatus?TRUE:FALSE);
 
 				ShmOCPP20Data->TransactionEvent[index].evse.id = 0;
@@ -7980,6 +7994,10 @@ int sendTransactionEventRequest(int gun_index)
 
 				if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_IDLE) //S_IDLE
 				{
+					memset(&ShmOCPP20Data->TransactionEvent[index].transactionInfo, 0x00, sizeof(struct TransactionType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].idToken, 0x00, sizeof(struct IdTokenType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].meterValue, 0x00, sizeof(struct MeterValueType));
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Started]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Idle]);
 
@@ -8008,6 +8026,11 @@ int sendTransactionEventRequest(int gun_index)
 				}
 				else if (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
 				{
+					if(strlen((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId) == 0)
+						random_uuid(ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId);
+
+					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].idToken.idToken, "%s", ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.StartUserId);
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Updated]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Charging]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].triggerReason, "%s", TriggerReasonEnumTypeStr[TriggerReasonEnumType_ChargingStateChanged]);
@@ -8060,16 +8083,13 @@ int sendTransactionEventRequest(int gun_index)
 		{
 			if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
 			{
-				memset(&ShmOCPP20Data->TransactionEvent[index], 0x00, sizeof(struct TransactionEvent_20));
-
 				getNowDatetime(ShmOCPP20Data->TransactionEvent[index].timestamp);
 
-				if((seqNo[index]+1) < INT_MAX)
-					seqNo[index]++;
+				if((ShmOCPP20Data->TransactionEvent[index].seqNo + 1) < INT_MAX)
+					ShmOCPP20Data->TransactionEvent[index].seqNo++;
 				else
-					seqNo[index] = 0;
+					ShmOCPP20Data->TransactionEvent[index].seqNo = 0;
 
-				ShmOCPP20Data->TransactionEvent[index].seqNo = seqNo[index];
 				ShmOCPP20Data->TransactionEvent[index].offline = (!ShmOCPP20Data->OcppConnStatus?TRUE:FALSE);
 
 				ShmOCPP20Data->TransactionEvent[index].evse.id = 0;
@@ -8077,6 +8097,10 @@ int sendTransactionEventRequest(int gun_index)
 
 				if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //SYS_MODE_IDLE
 				{
+					memset(&ShmOCPP20Data->TransactionEvent[index].transactionInfo, 0x00, sizeof(struct TransactionType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].idToken, 0x00, sizeof(struct IdTokenType));
+					memset(&ShmOCPP20Data->TransactionEvent[index].meterValue, 0x00, sizeof(struct MeterValueType));
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Started]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Idle]);
 
@@ -8105,6 +8129,11 @@ int sendTransactionEventRequest(int gun_index)
 				}
 				else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
 				{
+					if(strlen((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId) == 0)
+						random_uuid(ShmOCPP20Data->TransactionEvent[index].transactionInfo.transactionId);
+
+					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].idToken.idToken, "%s", ShmSysConfigAndInfo->SysInfo.AcChargingData[index].StartUserId);
+
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].eventType, "%s", TransactionEventEnumTypeStr[TransactionEventEnumType_Updated]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].transactionInfo.chargingState, "%s", ChargingStateEnumTypeStr[ChargingStateEnumType_Charging]);
 					sprintf((char*)ShmOCPP20Data->TransactionEvent[index].triggerReason, "%s", TriggerReasonEnumTypeStr[TriggerReasonEnumType_ChargingStateChanged]);
@@ -15102,6 +15131,9 @@ int GetOcppServerURL()
 	if((ShmSysConfigAndInfo->SysConfig.OcppServerURL != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0) )
 	{
 		memcpy(urlStr, ShmSysConfigAndInfo->SysConfig.OcppServerURL, ARRAY_SIZE(ShmSysConfigAndInfo->SysConfig.OcppServerURL));
+#ifdef TEST_OCPP20
+		sprintf(urlStr, "ws://172.17.20.19:8080/"); // For test
+#endif
 		if(yuarel_parse(&url, urlStr) != -1)
 		{
 			sprintf(OcppProtocol, "%s", url.scheme);
@@ -15110,7 +15142,16 @@ int GetOcppServerURL()
 			if(url.path == NULL)
 				OcppTempPath[0] = '\0';
 	        else
-			   sprintf(OcppTempPath, "%s", url.path);
+	        {
+	        	if((url.path[strlen(url.path)-1] != '/') && (strlen(url.path) > 0))
+				{
+					sprintf(OcppTempPath, "%s/", url.path);
+				}
+				else
+				{
+					sprintf(OcppTempPath, "%s", url.path);
+				}
+	        }
 
 		    if(url.port == 0)
 		    {
@@ -15190,8 +15231,9 @@ int GetOcppPath()
 	{
 		strcpy(OcppPath,"");
 	}
-
-	//sprintf(OcppPath,"/AWLU770001D1P0D19520001A0"); // For test
+#ifdef TEST_OCPP20
+	sprintf(OcppPath,"/AWLU770001D1P0D19520001A0"); // For test
+#endif
 	return result;
 }
 

+ 1 - 1
EVSE/Modularization/ocpp20/Module_OcppBackend20.c

@@ -431,7 +431,7 @@ void* ConnectWsServer(void* data)  //int ConnectWsServer()
 	ConnInfo.ietf_version_or_minus_one = -1;
 
 	if(use_ssl)
-		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;
+		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK | LCCSCF_ALLOW_EXPIRED;
 
 	wsi_client = lws_client_connect_via_info(&ConnInfo);
 	if (!wsi_client)

+ 40 - 17
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -2313,6 +2313,15 @@ void CheckSystemValue(void)
 
 	for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
 	{
+		//==========================================
+		// csu trigger DataTransferReq
+		//==========================================
+		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
+		{
+			sendDataTransferRequest(gun_index);
+			ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 0;
+		}
+
 		//===============================
 		// CSU Trigger Reset Conf
 		//===============================
@@ -2983,15 +2992,6 @@ void CheckSystemValue(void)
 			sendReserveNowTransactionConfirmation((char *)ShmOCPP16Data->ReserveNow[gun_index].guid, (char *)ShmOCPP16Data->ReserveNow[gun_index].ResponseStatus);
 			ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = 0;
 		}
-
-		//==========================================
-		// csu trigger DataTransferReq
-		//==========================================
-		if(isWebsocketSendable && (server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
-		{
-			sendDataTransferRequest(gun_index);
-			ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 0;
-		}
 	}
 }
 
@@ -3579,7 +3579,7 @@ S_FAULT                 =12
 						currentStatus = 0; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -3640,7 +3640,7 @@ S_FAULT                 =12
 						currentStatus = 0; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -3700,7 +3700,7 @@ S_FAULT                 =12
 						currentStatus = 0; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_AUTHORIZING)&&( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 				          ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 						) //S_PRECHARGE
 				{
@@ -3753,7 +3753,7 @@ S_FAULT                 =12
 						currentStatus = 0; //OCPP Status: Available
 					}
 				}
-				else if ( ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_PREPARING) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
+				else if ( ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_AUTHORIZING) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
 						  ((ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && (ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].GeneralChargingData.SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
 				) //S_PRECHARGE
 
@@ -15088,7 +15088,16 @@ int GetOcppServerURL()
 			if(url.path == NULL)
 				OcppTempPath[0] = '\0';
 			else
-				sprintf(OcppTempPath, "%s", url.path);
+			{
+				if((url.path[strlen(url.path)-1] != '/') && (strlen(url.path) > 0))
+				{
+					sprintf(OcppTempPath, "%s/", url.path);
+				}
+				else
+				{
+					sprintf(OcppTempPath, "%s", url.path);
+				}
+			}
 
 			if(url.port == 0)
 			{
@@ -16210,9 +16219,7 @@ void storeTempStopTransaction(int gun_index)
 	json_object_object_add(StopTransaction, "meterStop", json_object_new_int(ShmOCPP16Data->StopTransaction[gun_index].MeterStop));
 	json_object_object_add(StopTransaction, "transactionId", json_object_new_int(ShmOCPP16Data->StopTransaction[gun_index].TransactionId));
 	json_object_object_add(StopTransaction, "timestamp", json_object_new_string((char*)ShmOCPP16Data->StopTransaction[gun_index].Timestamp));
-
-	if(strlen((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason) > 0)
-		json_object_object_add(StopTransaction, "reason", json_object_new_string((char*)ShmOCPP16Data->StopTransaction[gun_index].StopReason));
+	json_object_object_add(StopTransaction, "reason", json_object_new_string("PowerLoss"));
 
 	for(int idxTrans = 0;idxTrans<ARRAY_SIZE(ShmOCPP16Data->StopTransaction[gun_index].TransactionData);idxTrans++)
 	{
@@ -16389,6 +16396,22 @@ void GetOcppSecurityPassword(uint8_t *data)
 	sprintf((char*)data, "%s", ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationKey].ItemData);
 }
 
+void SetOcppVersion(uint8_t *version)
+{
+	for (uint8_t idx=0; idx<strlen((char*)version); idx++) version[idx] = tolower(version[idx]);
+
+	DEBUG_INFO("ocpp version: %s\n", version);
+	if(strstr((char*)version, "ocpp1.6") != NULL)
+	{
+		ShmSysConfigAndInfo->SysConfig.OcppRunningVer = OCPP_RUNNING_VERSION_16;
+	}
+	else if(strstr((char*)version, "ocpp2.0") != NULL)
+	{
+		ShmSysConfigAndInfo->SysConfig.OcppRunningVer = OCPP_RUNNING_VERSION_20;
+		system("pkill OcppBackend");
+	}
+}
+
 void SetServerSign(int value)
 {
 	server_sign = value;

+ 11 - 3
EVSE/Modularization/ocppfiles/Module_OcppBackend.c

@@ -183,6 +183,7 @@ static int OCPP16Callback(struct lws *wsi, enum lws_callback_reasons reason, voi
 			lws_hdr_copy(wsi, buf, ARRAY_SIZE(buf) - 1, WSI_TOKEN_PROTOCOL);
 			DEBUG_OCPPMESSAGE_INFO("Sec-WebSocket-Protocol: %s\n", buf);
 			DEBUG_OCPPMESSAGE_INFO("----- Handshake: Server response END -----\n");
+			SetOcppVersion((uint8_t*)buf);
 
 			break;
 
@@ -390,7 +391,13 @@ static struct lws_protocols protocols[] =
 		65536,//65536,//10240,
 	},
 	{
-		"ocpp1.6",
+		"ocpp2.0",
+		OCPP16Callback,
+		65536,//65536,//10240,
+		65536,//65536,//10240,
+	},
+	{
+		"ocpp1.6,ocpp2.0",
 		OCPP16Callback,
 		65536,//65536,//10240,
 		65536,//65536,//10240,
@@ -477,11 +484,11 @@ void* ConnectWsServer(void* data)  //int ConnectWsServer()
 
 	ConnInfo.host= addr_port; // ConnInfo.address;//lws_canonical_hostname(context);
 	//ConnInfo.origin="origin";
-	ConnInfo.protocol = protocols[1].name;
+	ConnInfo.protocol = protocols[0].name;
 	ConnInfo.ietf_version_or_minus_one = -1;
 
 	if(use_ssl)
-		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;
+		ConnInfo.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK | LCCSCF_ALLOW_EXPIRED;
 
 	wsi_client = lws_client_connect_via_info(&ConnInfo);
 	if (!wsi_client)
@@ -1357,6 +1364,7 @@ int main(void)
 	struct stat stats;
 
 	DEBUG_INFO("Module_OcppBackend task initialization...\n");
+	//lws_set_log_level(LLL_PARSER | LLL_HEADER | LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG | LLL_EXT | LLL_CLIENT | LLL_LATENCY  , NULL);
 
 	if(ProcessShareMemory()== FAIL)
 	{

+ 1 - 0
EVSE/Modularization/ocppfiles/Module_OcppBackend.h

@@ -109,6 +109,7 @@ extern void SetHeartBeatWithNOResponse(void);
 extern uint8_t GetOcppSecurityProfile();
 extern void GetOcppChargerBoxId(uint8_t *data);
 extern void GetOcppSecurityPassword(uint8_t *data);
+extern void SetOcppVersion(uint8_t *version);
 
 extern int InitShareMemory();
 extern int ProcessShareMemory();

+ 2 - 0
EVSE/Projects/AW-CCS/Apps/Module_InternalComm.c

@@ -771,6 +771,8 @@ unsigned char Query_AC_MCU_Status(unsigned char fd, unsigned char targetAddr, Ac
 			Ret_Buf->pp_state = rx[17];
 			Ret_Buf->rating_current = rx[18];
 			Ret_Buf->rotatory_switch = (rx[19] & 0x0F);
+			Ret_Buf->socket_e.isSocketEMode = (rx[20] & 0x01);
+			Ret_Buf->socket_e.isSocketEPinOn = ((rx[20]>>1) & 0x01);
 
 			result = PASS;
 		}

文件差异内容过多而无法显示
+ 1242 - 143
EVSE/Projects/AW-CCS/Apps/main.c


+ 9 - 1
EVSE/Projects/AW-CCS/Apps/main.h

@@ -178,7 +178,8 @@ enum EV_READY_STATE
 enum CHARGING_MODE
 {
 	CHARGING_MODE_BS=0,
-	CHARGING_MODE_HLC
+	CHARGING_MODE_HLC,
+	CHARGING_MODE_SOCKETE
 };
 
 
@@ -337,6 +338,12 @@ typedef struct PRESENTOUTPUTCURRENT
 	double L3N_L31[2];
 }Presentoutputcurrent;
 
+typedef struct SOCKET_E
+{
+	unsigned char isSocketEMode:1;
+	unsigned char isSocketEPinOn:1;
+}Socket_E;
+
 typedef struct AC_PRIMARY_MCU
 {
 	unsigned char cp_state;
@@ -351,6 +358,7 @@ typedef struct AC_PRIMARY_MCU
 	unsigned char rating_current;
 	unsigned char rotatory_switch;
 	Relay	relayState;
+	Socket_E socket_e;
 }Ac_Primary_Mcu;
 
 typedef struct AC_PRIMARY_MCU_ALARM

二进制
EVSE/Projects/AW-CCS/Images/FactoryDefaultConfig.bin


二进制
EVSE/Projects/AW-CCS/Images/MLO


二进制
EVSE/Projects/AW-CCS/Images/ramdisk.gz


二进制
EVSE/Projects/AW-CCS/Images/u-boot-spl.bin


二进制
EVSE/Projects/AW-CCS/Images/u-boot.img


二进制
EVSE/Projects/AW-CCS/Images/zImage


+ 1 - 0
EVSE/Projects/AW-Regular/Apps/Module_FactoryConfig.c

@@ -312,6 +312,7 @@ int main(int argc, char *argv[])
 	SysConfig.AthInterface.WifiDhcpClient = 0;	// 0: Enable	1: Disable
 
 	strcpy((char*)SysConfig.TelecomInterface.TelcomApn, "");
+	SysConfig.TelecomInterface.TelcomEnabled = 1; 	//0: disable, 1: enable
 	SysConfig.TelecomInterface.TelcomSimStatus = 0;	// SIM card status
 	SysConfig.TelecomInterface.TelcomModemMode = 0;	//0: No services	1: CDMA		2: GSM/GPRS	3: WCDMA	4: GSM/WCDMA	5: TD_SCDMA		6: Unknown
 

+ 14 - 18
EVSE/Projects/AW-Regular/Apps/main.c

@@ -937,20 +937,17 @@ void InitEthernet()
 	//unsigned int address;
 
 	//Init Eth0 for internet
-	if(isInterfaceUp("eth0")==PASS)
-	{
-		memset(tmpbuf,0,256);
-		sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
-		system(tmpbuf);
-		memset(tmpbuf,0,256);
-		sprintf(tmpbuf,"route add default gw %s eth0 &",
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
-		system(tmpbuf);
-		system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &");
-		system("ifconfig lo up &");
-	}
+	memset(tmpbuf,0,256);
+	sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
+	system(tmpbuf);
+	memset(tmpbuf,0,256);
+	sprintf(tmpbuf,"route add default gw %s eth0 &",
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
+	system(tmpbuf);
+	system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &");
+	system("ifconfig lo up &");
 
 	if(isInterfaceUp("eth1")==PASS)
 	{
@@ -1273,7 +1270,7 @@ void get_firmware_version(unsigned char gun_index)
 	strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev, ShmCharger->gun_info[gun_index].ver.Version_FW);
 
 	// Get CSU root file system version
-	sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "V0.61.00.0000.00");
+	sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "V0.62.00.0000.00");
 
 	// Get AC connector type from model name
 	for(uint8_t idx=0;idx<3;idx++)
@@ -2582,9 +2579,8 @@ int main(void)
 						{
 							case START_METHOD_RFID:
 								if((ShmOCPP16Data->SpMsg.bits.AuthorizeConf) ||
-								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)) ||
-								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST) && (strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") == 0)) ||
-								   (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_NOCHARGE))
+								   (!ShmOCPP16Data->OcppConnStatus && ((ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE) || (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_NOCHARGE))) ||
+								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST) && (strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") == 0)))
 								{
 									DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status: %s \n", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
 

二进制
EVSE/Projects/AW-Regular/Images/ramdisk.gz


二进制
EVSE/Projects/DD360Audi/Images/root/DoComm


二进制
EVSE/Projects/DD360Audi/Images/root/Module_EvComm


二进制
EVSE/Projects/DD360Audi/Images/root/Module_EventLogging


二进制
EVSE/Projects/DD360Audi/Images/root/Module_InternalComm


二进制
EVSE/Projects/DD360Audi/Images/root/main


+ 1 - 0
EVSE/Projects/DO360/Apps/FactoryConfig.c

@@ -123,6 +123,7 @@ int main(int argc,char *argv[])
 	SysConfig.Ccs2PlugInTimes = 0;
 	SysConfig.ChademoPlugInTimes = 0;
 	SysConfig.BillingData.isBilling = 0;
+	SysConfig.BillingData.Currency = 50;
 	SysConfig.isAPP = 1;
 	SysConfig.isQRCode = 1;
 	SysConfig.isRFID = 1;

+ 15 - 2
EVSE/Projects/DO360/Apps/Makefile

@@ -10,7 +10,7 @@ Lib_Module_RFID = "-L../../../Modularization" -lModule_RFID
 Lib_Module_Upgrade = "-L../../../Modularization" -lModule_Upgrade
 Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 
-all: CopyFile apps
+all: CopyFile apps Clean
 #apps: Module_CSU Module_EvComm Module_EventLogging Module_InternalComm Module_LcmControl Module_PrimaryComm Module_PsuComm 
 # ReadCmdline kill.sh
 apps: MainTask EvCommTask EventLoggingTask InternalCommTask LcmControlTask PrimaryCommTask PsuCommTask ReadCmdlineTask UnsafetyOutputTool FactoryConfigApp OtherTools
@@ -95,6 +95,19 @@ CopyFile:
 	rm -rfv ../Images/root
 	mkdir -p ../Images/root
 
+Clean: CleanObj CleanExecute
 
+CleanObj:
+	rm -f *.o
 
-	
+CleanExecute:
+	rm -f main
+	rm -f Module_EvComm
+	rm -f Module_EventLogging
+	rm -f Module_InternalComm
+	rm -f Module_LcmControl
+	rm -f Module_PrimaryComm
+	rm -f Module_PsuComm
+	rm -f ReadCmdline
+	rm -f FactoryConfig
+	rm -f UnsafetyOutputTask

+ 620 - 26
EVSE/Projects/DO360/Apps/Module_EvComm.c

@@ -53,6 +53,8 @@
 
 struct SysConfigAndInfo				*ShmSysConfigAndInfo;
 
+//struct WARNING_CODE_INFO            LastWarningInfo[GENERAL_GUN_QUANTITY];
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -974,22 +976,52 @@ void DispenserStatusResponse(int socket, struct PACKET_STRUCTURE *packet, unsign
 	send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
 }
 
+struct ChargingCapabilityResponse ConnectorCapability[GENERAL_GUN_QUANTITY];
+
 void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 {
 	struct PACKET_STRUCTURE sendBuffer;
 	unsigned short voltage = 0, current = 0, power = 0;
+	unsigned char currency = 0;
+	unsigned int price = 0, cost = 0, account = 0;
 
 	memset(&sendBuffer, 0x00, sizeof(sendBuffer));
 	voltage = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.MaximumChargingVoltage;
 	current = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.AvailableChargingCurrent;
 	power = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.AvailableChargingPower;
 
-	PRINTF_FUNC("Connector %d Capability Voltage: %d, Current: %d, Power: %d", packet->Header.id, (int)(voltage), (int)(current), (int)(power));
+	currency = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Currency;
+	price = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].UserPrice;
+	cost = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].TotalCost;
+	account = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].AccountBalance;
+
+	if(ConnectorCapability[packet->Header.id - 1].MaxOuputVoltage != voltage ||
+        ConnectorCapability[packet->Header.id - 1].MaxOuputCurrent != current ||
+        ConnectorCapability[packet->Header.id - 1].MaxOuputPower != power)
+	{
+	    PRINTF_FUNC("Connector %d Capability Voltage: %d, Current: %d, Power: %d", packet->Header.id, (int)(voltage), (int)(current), (int)(power));
+	}
+
+	if(ConnectorCapability[packet->Header.id - 1].Currency != currency ||
+        ConnectorCapability[packet->Header.id - 1].UserPrice != price ||
+        ConnectorCapability[packet->Header.id - 1].TotalCost != cost ||
+        ConnectorCapability[packet->Header.id - 1].AccountBalance != account)
+	{
+	    PRINTF_FUNC("Connector %d Currency: %d, UserPrice: %d, Cost: %d, Account: %d", packet->Header.id, (int)(currency), (int)(price), (int)(cost), (int)(account));
+	}
+
+	ConnectorCapability[packet->Header.id - 1].MaxOuputVoltage = voltage;
+	ConnectorCapability[packet->Header.id - 1].MaxOuputCurrent = current;
+	ConnectorCapability[packet->Header.id - 1].MaxOuputPower = power;
+	ConnectorCapability[packet->Header.id - 1].Currency = currency;
+	ConnectorCapability[packet->Header.id - 1].UserPrice = price;
+	ConnectorCapability[packet->Header.id - 1].TotalCost = cost;
+	ConnectorCapability[packet->Header.id - 1].AccountBalance = account;
 
 	sendBuffer.Header.se = packet->Header.se;
 	sendBuffer.Header.id = packet->Header.id;
 	sendBuffer.Header.op = _Header_Response;
-	sendBuffer.Header.len = 8;
+	sendBuffer.Header.len = 21;
 	sendBuffer.Payload.reg = _Reg_Charging_Capability;
 	sendBuffer.Payload.data[0] = _R_OK;
 	sendBuffer.Payload.data[1] = ((voltage >> 8) & 0xFF);
@@ -998,6 +1030,19 @@ void ChargingCapabilityResponse(int socket, struct PACKET_STRUCTURE *packet)
 	sendBuffer.Payload.data[4] = (current & 0xFF);
 	sendBuffer.Payload.data[5] = ((power >> 8) & 0xFF);
 	sendBuffer.Payload.data[6] = (power & 0xFF);
+	sendBuffer.Payload.data[7] = currency;
+	sendBuffer.Payload.data[8] = ((price >> 24) & 0xFF);
+	sendBuffer.Payload.data[9] = ((price >> 16) & 0xFF);
+	sendBuffer.Payload.data[10] = ((price >> 8) & 0xFF);
+	sendBuffer.Payload.data[11] = (price & 0xFF);
+    sendBuffer.Payload.data[12] = ((cost >> 24) & 0xFF);
+    sendBuffer.Payload.data[13] = ((cost >> 16) & 0xFF);
+    sendBuffer.Payload.data[14] = ((cost >> 8) & 0xFF);
+    sendBuffer.Payload.data[15] = (cost & 0xFF);
+    sendBuffer.Payload.data[16] = ((account >> 24) & 0xFF);
+    sendBuffer.Payload.data[17] = ((account >> 16) & 0xFF);
+    sendBuffer.Payload.data[18] = ((account >> 8) & 0xFF);
+    sendBuffer.Payload.data[19] = (account & 0xFF);
 
 	send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
 }
@@ -1017,6 +1062,22 @@ void ChargingTargetResponse(int socket, struct PACKET_STRUCTURE *packet, unsigne
 	send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
 }
 
+void FirmwareUpgradeResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Software_Update;
+    sendBuffer.Payload.data[0] = _R_OK;
+    sendBuffer.Payload.data[1] = result;
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
 void PlugInStatusResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
 {
 	struct PACKET_STRUCTURE sendBuffer;
@@ -1079,6 +1140,218 @@ void ChargingPermissionResponse(int socket, struct PACKET_STRUCTURE *packet, uns
 	send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
 }
 
+void AddMiscCommand(struct PACKET_STRUCTURE *packet, struct MISC_COMMAND *misc)
+{
+    packet->Payload.data[packet->Header.len - 1 + 0] = ((misc->Command >> 8) & 0xFF);
+    packet->Payload.data[packet->Header.len - 1 + 1] = ((misc->Command >> 0) & 0xFF);
+    packet->Payload.data[packet->Header.len - 1 + 2] = ((misc->Value >> 24) & 0xFF);
+    packet->Payload.data[packet->Header.len - 1 + 3] = ((misc->Value >> 16) & 0xFF);
+    packet->Payload.data[packet->Header.len - 1 + 4] = ((misc->Value >>  8) & 0xFF);
+    packet->Payload.data[packet->Header.len - 1 + 5] = ((misc->Value >>  0) & 0xFF);
+    packet->Header.len += 6;
+}
+
+void MiscControlResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Misc_Control;
+    sendBuffer.Payload.data[0] = result;
+
+    if(result == _R_OK)
+    {
+        struct MISC_COMMAND misc;
+
+        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.AvailabilityRequest)
+        {
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.AvailabilityRequest = false;
+            misc.Command = _MiscCmd_ChangeOperative;
+            misc.Value = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.IsAvailable;
+
+            PRINTF_FUNC("Announce Connector %d Availability: %d", packet->Header.id, misc.Value);
+            AddMiscCommand(&sendBuffer, &misc);
+        }
+
+        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.RemoteStartRequest)
+        {
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.RemoteStartRequest = false;
+            misc.Command = _MiscCmd_RemoteStart;
+            misc.Value = true;
+
+            PRINTF_FUNC("Announce Connector %d Remote Start: %d", packet->Header.id, misc.Value);
+            AddMiscCommand(&sendBuffer, &misc);
+        }
+
+        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.AccountBalanceRequest)
+        {
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.AccountBalanceRequest = false;
+            misc.Command = _MiscCmd_AccountBalance;
+            misc.Value = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].AccountBalance;
+
+            PRINTF_FUNC("Announce Connector %d Account Balance: %d", packet->Header.id, (misc.Value));
+            AddMiscCommand(&sendBuffer, &misc);
+        }
+
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].ConnectorID[0] == packet->Header.id)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.ConnectorTimeoutConfigRequest)
+            {
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.ConnectorTimeoutConfigRequest = false;
+                misc.Command = _MiscCmd_ConnectorTimeout;
+                misc.Value = ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout;
+
+                PRINTF_FUNC("Announce Dispenser %d Connection Timeout: %d", dispenserIndex + 1, misc.Value);
+                AddMiscCommand(&sendBuffer, &misc);
+            }
+
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.DefaultPriceConfigRequest)
+            {
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.DefaultPriceConfigRequest = false;
+                misc.Command = _MiscCmd_DefaultPrice;
+                misc.Value = ShmSysConfigAndInfo->SysInfo.DispenserInfo.DefaultPrice;
+
+                PRINTF_FUNC("Announce Dispenser %d Default Price: %d", dispenserIndex + 1, misc.Value);
+                AddMiscCommand(&sendBuffer, &misc);
+            }
+
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.CurrencyConfigRequest)
+            {
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.CurrencyConfigRequest = false;
+                misc.Command = _MiscCmd_Currency;
+                misc.Value = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Currency;
+
+                PRINTF_FUNC("Announce Dispenser %d Currency Index: %d", dispenserIndex + 1, misc.Value);
+                AddMiscCommand(&sendBuffer, &misc);
+            }
+
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.HardwareRebootRequest)
+            {
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.HardwareRebootRequest = false;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.HardwareRebootConfirm = true;
+                misc.Command = _MiscCmd_HardwareReboot;
+                misc.Value = true;
+
+                PRINTF_FUNC("Announce Dispenser %d Hardware Reboot: %d", dispenserIndex + 1, misc.Value);
+                AddMiscCommand(&sendBuffer, &misc);
+            }
+
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.SoftwareResetRequest)
+            {
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.SoftwareResetRequest = false;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.SoftwareResetConfirm = true;
+                misc.Command = _MiscCmd_SoftwareRestart;
+                misc.Value = true;
+
+                PRINTF_FUNC("Announce Dispenser %d Software Reset: %d", dispenserIndex + 1, misc.Value);
+                AddMiscCommand(&sendBuffer, &misc);
+            }
+        }
+    }
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
+void WriteCsuVersionResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Report_Csu_Version;
+    sendBuffer.Payload.data[0] = result;
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
+void WriteOtherVersionResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Report_Other_Version;
+    sendBuffer.Payload.data[0] = result;
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
+void WriteChargingInfoResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Charging_Info;
+    sendBuffer.Payload.data[0] = result;
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
+void ChargerSystemIdResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_Charger_System_Id;
+    sendBuffer.Payload.data[0] = result;
+    if(result == _R_OK)
+    {
+        int strLen = 0;
+        strLen = strlen((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
+        memcpy(&sendBuffer.Payload.data[sendBuffer.Header.len - 1], (char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, strLen);
+        sendBuffer.Header.len += strLen + 1;
+
+        char TimeSync[32];
+        struct timeb  SeqEndTime;
+        struct tm *tm;
+        ftime(&SeqEndTime);
+        SeqEndTime.time = time(NULL);
+        tm=localtime(&SeqEndTime.time);
+        memset(TimeSync, 0x00, 32);
+
+        sprintf(TimeSync, "%04d-%02d-%02d %02d:%02d:%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+        strLen = strlen(TimeSync);
+        memcpy(&sendBuffer.Payload.data[sendBuffer.Header.len - 1], TimeSync, strLen);
+        sendBuffer.Header.len += strLen + 1;
+        //PRINTF_FUNC("Dispenser %d Read System Id: %s", dispenserIndex + 1, ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
+    }
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
+void WriteWaitPlugInResponse(int socket, struct PACKET_STRUCTURE *packet, unsigned char result)
+{
+    struct PACKET_STRUCTURE sendBuffer;
+
+    memset(&sendBuffer, 0x00, sizeof(sendBuffer));
+    sendBuffer.Header.se = packet->Header.se;
+    sendBuffer.Header.id = packet->Header.id;
+    sendBuffer.Header.op = _Header_Response;
+    sendBuffer.Header.len = 2;
+    sendBuffer.Payload.reg = _Reg_WaitPlugIn;
+    sendBuffer.Payload.data[0] = result;
+
+    send(socket, &sendBuffer, sendBuffer.Header.len + 4, 0);
+}
+
 BOOL FindConnectorID(unsigned char dispenserIndex, unsigned char id)
 {
 	BOOL find = false;
@@ -1251,8 +1524,35 @@ BOOL DispenserStatusCodeHandler(struct PACKET_STRUCTURE *packet, unsigned char d
 			memcpy(&ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCode[i][0],
 				&packet->Payload.data[i * 6], 6);
 		}
-
-		PRINTF_FUNC("Dispenser %d, Status Code Len: %d", packet->Header.id, ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCount);
+/*
+		BOOL needUpdate = FALSE;
+		// check is there new status code
+		for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCount; i++)
+		{
+		    if(strcmp(&ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCode[i][0],
+		            &LastWarningInfo[packet->Header.id - 1].WarningCode[i][0]) == 0)
+		    {
+		        needUpdate = TRUE;
+		        break;
+		    }
+		}
+		if(needUpdate)
+		{
+		    memcpy(&LastWarningInfo[packet->Header.id - 1], &ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo, sizeof(struct WARNING_CODE_INFO));
+		}
+*/
+		char strDispenserStatus[128];
+		sprintf(strDispenserStatus, "Dispenser id %d, Status Code Len: %d", packet->Header.id, ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCount);
+		if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCount > 0)
+		{
+		    for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCount; i++)
+		    {
+		        char strTemp[16];
+		        sprintf(strTemp, ", %s", ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].WarningInfo.WarningCode[i]);
+		        strcat(strDispenserStatus, strTemp);
+		    }
+		}
+		PRINTF_FUNC(strDispenserStatus);
 	}
 	else
 	{
@@ -1283,8 +1583,6 @@ unsigned long GetTimeoutValue(struct timeval _sour_time)
     return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
 }
 
-struct timeval _ConnectorCapabilityTime[CONNECTOR_QUANTITY];
-
 BOOL ConnectorChargingTargetHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
 {
 	BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
@@ -1296,12 +1594,6 @@ BOOL ConnectorChargingTargetHandler(struct PACKET_STRUCTURE *packet, unsigned ch
 		voltage = (float)((packet->Payload.data[0] << 8) + packet->Payload.data[1]) / 10;
 		current = (float)((packet->Payload.data[2] << 8) + packet->Payload.data[3]) / 10;
 
-//        if(GetTimeoutValue(_ConnectorCapabilityTime[packet->Header.id - 1]) / 1000 >= 2000)
-//        {
-//            gettimeofday(&_ConnectorCapabilityTime[packet->Header.id - 1], NULL);
-//            ShowSocketData(packet);
-//        }
-
 		if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.SystemStatus == S_CHARGING)
 		{
 			if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.EvBatterytargetVoltage != voltage ||
@@ -1334,6 +1626,11 @@ BOOL ConnectorChargingTargetHandler(struct PACKET_STRUCTURE *packet, unsigned ch
 	return done;
 }
 
+unsigned char FirmwareUpgradeHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    return _R_NoUpgrade;
+}
+
 BOOL ConnectorPlugInHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
 {
 	BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
@@ -1405,8 +1702,8 @@ unsigned char UserIDHandler(struct PACKET_STRUCTURE *packet, unsigned char dispe
 	}
 	else if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].AuthorizeStatus == _AuthorizeStatus_Pass)
 	{
-	    PRINTF_FUNC("Dispenser id %d user id %s authorizing ok", dispenserIndex + 1, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].UserId);
-	    authorize = _DAS_Allowed;
+        PRINTF_FUNC("Dispenser id %d user id %s authorizing ok", dispenserIndex + 1, ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].UserId);
+        authorize = _DAS_Allowed;
 	}
 	else
 	{
@@ -1425,11 +1722,27 @@ unsigned char ChargingPermissionHandler(struct PACKET_STRUCTURE *packet, unsigne
 	{
 	    switch(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.SystemStatus)
 	    {
+            case S_IDLE:
+                if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Idle ||
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Preparing)
+                {
+                    permission = _DAS_Wait;
+                }
+                else
+                {
+                    permission = _DAS_NotAllowed;
+                    PRINTF_FUNC("Cabinet status idle, not allow dispenser id %d connector id %d charging",
+                                        dispenserIndex + 1, packet->Header.id);
+                    PRINTF_FUNC("RemoteStop or UnlockStop, not allow dispenser index %d connector id %d preparing to charge", dispenserIndex, packet->Header.id);
+                }
+                break;
+
             case S_PREPARING_FOR_EV:
                 if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.RemoteStopRequest ||
                     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.UnlockStopRequest)
                 {
                     permission = _DAS_NotAllowed;
+                    PRINTF_FUNC("RemoteStop or UnlockStop, not allow dispenser index %d connector id %d preparing to charge", dispenserIndex, packet->Header.id);
                 }
                 else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus >= _CRS_Preparing &&
                     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus <= _CRS_Charging)
@@ -1437,14 +1750,14 @@ unsigned char ChargingPermissionHandler(struct PACKET_STRUCTURE *packet, unsigne
                     if(!ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.PermissionRequest)
                     {
                         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.PermissionRequest = true;
-                        PRINTF_FUNC("Allow dispenser index %d connector id %d start to charge", dispenserIndex, packet->Header.id);
+                        PRINTF_FUNC("Allow dispenser index %d connector id %d start preparing to charge", dispenserIndex, packet->Header.id);
                     }
                     permission = _DAS_Allowed;
                 }
                 else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Terminating)
                 {
                     permission = _DAS_NotAllowed;
-                    PRINTF_FUNC("Allow dispenser index %d connector id %d start to charge", dispenserIndex, packet->Header.id);
+                    PRINTF_FUNC("Dispenser Terminating, Not allow dispenser index %d connector id %d preparing to charge", dispenserIndex, packet->Header.id);
                 }
                 else
                 {
@@ -1457,6 +1770,7 @@ unsigned char ChargingPermissionHandler(struct PACKET_STRUCTURE *packet, unsigne
                     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.UnlockStopRequest)
                 {
                     permission = _DAS_NotAllowed;
+                    PRINTF_FUNC("RemoteStop or UnlockStop, not allow dispenser index %d connector id %d charging", dispenserIndex, packet->Header.id);
                 }
                 else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Preparing ||
                     ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteStatus == _CRS_Charging)
@@ -1470,13 +1784,15 @@ unsigned char ChargingPermissionHandler(struct PACKET_STRUCTURE *packet, unsigne
                 }
                 break;
 
-            case S_IDLE:
             case S_TERMINATING:
             case S_COMPLETE:
             case S_ALARM:
             case S_RESERVATION:
             case S_MAINTAIN:
                 permission = _DAS_NotAllowed;
+                PRINTF_FUNC("Cabinet status(%d) not match, not allow dispenser index %d connector id %d charging",
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].GeneralChargingData.SystemStatus,
+                    dispenserIndex, packet->Header.id);
                 break;
 
             default:
@@ -1500,6 +1816,184 @@ unsigned char ChargingPermissionHandler(struct PACKET_STRUCTURE *packet, unsigne
 	return permission;
 }
 
+BOOL MiscControlHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
+    BOOL done = false;
+
+    if(find)
+    {
+        done = true;
+    }
+
+    return done;
+}
+
+unsigned char DispenserWriteCsuVersionInfoHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    char version[32];
+    BOOL writeVersion = FALSE, showVersion = FALSE;;
+
+    memcpy(version, &packet->Payload.data[0], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuBootLoadFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuBootLoadFwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[32], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuKernelFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuKernelFwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[64], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuRootFsFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuRootFsFwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[96], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuPrimFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuPrimFwRev, version, 32);
+        showVersion = true;
+    }
+
+    if(showVersion)
+    {
+        PRINTF_FUNC("********** Dispenser id %d:   Csu Version information **********", dispenserIndex + 1);
+        PRINTF_FUNC("********** CsuBootLoadRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuBootLoadFwRev);
+        PRINTF_FUNC("********** CsuKernelFwRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuKernelFwRev);
+        PRINTF_FUNC("********** CsuRootFsFwRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuRootFsFwRev);
+        PRINTF_FUNC("**********   CsuPrimFwRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].CsuPrimFwRev);
+    }
+    writeVersion = TRUE;
+
+    return writeVersion;
+}
+
+unsigned char DispenserWriteOtherVersionInfoHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    char version[32];
+    BOOL writeVersion = FALSE, showVersion = FALSE;;
+
+    memcpy(version, &packet->Payload.data[0], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].FanModuleFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].FanModuleFwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[32], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].RelayModuleFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].RelayModuleFwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[64], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector1FwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector1FwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[96], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector2FwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector2FwRev, version, 32);
+        showVersion = true;
+    }
+
+    memcpy(version, &packet->Payload.data[128], 32);
+    if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].LedModuleFwRev, version) != 0)
+    {
+        memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].LedModuleFwRev, version, 32);
+        showVersion = true;
+    }
+
+    if(showVersion)
+    {
+        PRINTF_FUNC("********** Dispenser id %d: Other Version information **********", dispenserIndex + 1);
+        PRINTF_FUNC("********** FanModuleFwRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].FanModuleFwRev);
+        PRINTF_FUNC("********** RelayModuleRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].RelayModuleFwRev);
+        PRINTF_FUNC("**********  Connector1Rev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector1FwRev);
+        PRINTF_FUNC("**********  Connector2Rev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Connector2FwRev);
+        PRINTF_FUNC("********** LedModuleFwRev: %32s ***", ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].LedModuleFwRev);
+    }
+    writeVersion = TRUE;
+
+    return writeVersion;
+}
+
+unsigned char DispenserWriteChargingInfoHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
+
+    if(find)
+    {
+        unsigned short voltage = (packet->Payload.data[0] << 8) + (packet->Payload.data[1]);
+        unsigned short current = (packet->Payload.data[2] << 8) + (packet->Payload.data[3]);
+        unsigned int time = (packet->Payload.data[4] << 24) + (packet->Payload.data[5] << 16) + (packet->Payload.data[6] << 8) + (packet->Payload.data[7]);
+        unsigned char soc = (packet->Payload.data[8]);
+
+        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteChargingVoltage = voltage;
+        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteChargingCurrent = current;
+        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteRemainChargingDuration = time;
+        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].RemoteSoc = soc;
+    }
+    else
+    {
+
+    }
+
+    return find;
+}
+
+unsigned char ReadChargerSystemIdHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    BOOL find = TRUE;
+
+    return find;
+}
+
+unsigned char WriteWaitPlugInHandler(struct PACKET_STRUCTURE *packet, unsigned char dispenserIndex)
+{
+    BOOL find = FindConnectorID(dispenserIndex, packet->Header.id);
+
+    if(find)
+    {
+        unsigned char StartWait = packet->Payload.data[0];
+
+        if(StartWait)
+        {
+            if(!ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.StartWaitPlug)
+            {
+                PRINTF_FUNC("Connector %d Start Wait Plug In", packet->Header.id);
+            }
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.StartWaitPlug = true;
+        }
+        else
+        {
+            if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.StartWaitPlug)
+            {
+                PRINTF_FUNC("Connector %d Stop Wait Plug In", packet->Header.id);
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.NeedCleanAuthorizeInfo = true;
+            }
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[packet->Header.id - 1].Parameter.bits.StartWaitPlug = false;
+        }
+    }
+    else
+    {
+
+    }
+
+    return find;
+}
+
 void DisableConnector(unsigned char dispenserIndex)
 {
 	for(int i = 0; i < ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].ConnectorQuantity; i++)
@@ -1521,11 +2015,6 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 
 	PRINTF_FUNC("IP %s connection(%d) is established, start dispenser process", (inet_ntoa(clientInfo.sin_addr)), index);
 
-	for(int i = 0; i < CONNECTOR_QUANTITY; i++)
-	{
-	    memset(&_ConnectorCapabilityTime[i], 0x00, sizeof(struct timeval));
-	}
-
 	while(1)
 	{
 		if((rxLen = recv(socketFd, &receiveBuffer, sizeof(Packet_Structure), MSG_DONTWAIT )) > 0)
@@ -1555,6 +2044,7 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 	                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[index].DispenserIndex = dispenserIndex;
 	                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[index].Status = _CNS_DispenserMatched;
 	                                PRINTF_FUNC("********** Dispenser id %d check in, model name: %s **********\n", dispenserID, modelName);
+	                                memcpy(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].ModelName, modelName, 64);
 	                                ackResult = _R_OK;
 	                            }
 	                            else
@@ -1600,6 +2090,19 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 						}
 						PRINTF_FUNC("Dispenser ID %d Get Connector ID %s", dispenserID, ackResult == _R_OK ? "OK" : "NG");
 						ConnectorIDResponse(socketFd, &receiveBuffer, ackResult, dispenserIndex);
+
+						if(ackResult == _R_OK)
+						{
+                            if(!ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.DispenserConfigSync)
+                            {
+                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.DispenserConfigSync = true;
+
+                                PRINTF_FUNC("Dispenser ID %d Configuration Need To Synchronize", dispenserID);
+                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.ConnectorTimeoutConfigRequest = 1;
+                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.DefaultPriceConfigRequest = 1;
+                                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[dispenserIndex].Setting.bits.CurrencyConfigRequest = 1;
+                            }
+						}
 					}
 
 					// Reg: 0x03, Power cabinet status
@@ -1641,6 +2144,12 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 					}
 
 					// Reg: 0x07, Software update
+					if(receiveBuffer.Header.op == _Header_Read && receiveBuffer.Payload.reg == _Reg_Software_Update)
+					{
+					    unsigned char NeedUpgrade = FirmwareUpgradeHandler(&receiveBuffer, dispenserIndex);
+
+                        FirmwareUpgradeResponse(socketFd, &receiveBuffer, NeedUpgrade);
+					}
 
 					// Reg: 0x08, Plug-in status
 					if(receiveBuffer.Header.op == _Header_Write && receiveBuffer.Payload.reg == _Reg_Plug_In_Status)
@@ -1677,9 +2186,68 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 					if(receiveBuffer.Header.op == _Header_Read && receiveBuffer.Payload.reg == _Reg_Charging_Permission)
 					{
 					    ack = ChargingPermissionHandler(&receiveBuffer, dispenserIndex);
-
 						ChargingPermissionResponse(socketFd, &receiveBuffer, ack);
 					}
+
+					// Reg: 0x0C, Misc Control
+					if(receiveBuffer.Header.op == _Header_Read && receiveBuffer.Payload.reg == _Reg_Misc_Control)
+					{
+					    if(MiscControlHandler(&receiveBuffer, dispenserIndex))
+					    {
+					        ackResult = _R_OK;
+					    }
+					    MiscControlResponse(socketFd, &receiveBuffer, dispenserIndex, ackResult);
+					}
+
+					// Reg: 0x0D, Report csu version
+					if(receiveBuffer.Header.op == _Header_Write && receiveBuffer.Payload.reg == _Reg_Report_Csu_Version)
+                    {
+					    if(DispenserWriteCsuVersionInfoHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+					    WriteCsuVersionResponse(socketFd, &receiveBuffer, ackResult);
+                    }
+
+					// Reg: 0x0E, Report other version
+                    if(receiveBuffer.Header.op == _Header_Write && receiveBuffer.Payload.reg == _Reg_Report_Other_Version)
+                    {
+                        if(DispenserWriteOtherVersionInfoHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+                        WriteOtherVersionResponse(socketFd, &receiveBuffer, ackResult);
+                    }
+
+                    // Reg: 0x0F, Charging info
+                    if(receiveBuffer.Header.op == _Header_Write && receiveBuffer.Payload.reg == _Reg_Charging_Info)
+                    {
+                        if(DispenserWriteChargingInfoHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+                        WriteChargingInfoResponse(socketFd, &receiveBuffer, ackResult);
+                    }
+
+                    // Reg: 0x10, Charger system id
+                    if(receiveBuffer.Header.op == _Header_Read && receiveBuffer.Payload.reg == _Reg_Charger_System_Id)
+                    {
+                        if(ReadChargerSystemIdHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+                        ChargerSystemIdResponse(socketFd, &receiveBuffer, dispenserIndex, ackResult);
+                    }
+
+                    // Reg: 0x11, Wait plug in
+                    if(receiveBuffer.Header.op == _Header_Write && receiveBuffer.Payload.reg == _Reg_WaitPlugIn)
+                    {
+                        if(WriteWaitPlugInHandler(&receiveBuffer, dispenserIndex))
+                        {
+                            ackResult = _R_OK;
+                        }
+                        WriteWaitPlugInResponse(socketFd, &receiveBuffer, ackResult);
+                    }
 				}
 
 				// clean timeout
@@ -1694,8 +2262,9 @@ void DispenserSocketProcess(int socketFd, struct sockaddr_in clientInfo, unsigne
 
 		if(timeout >= DISPENSER_SOCKET_TIMEOUT)
 		{
-			//timeout
-			PRINTF_FUNC("IP: %s, Socket %d connection timeout", (inet_ntoa(clientInfo.sin_addr)), index);
+            //timeout
+            PRINTF_FUNC("IP: %s, Socket %d connection timeout", (inet_ntoa(clientInfo.sin_addr)), index);
+
 			if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectionInfo[index].Status == _CNS_DispenserMatched)
 			{
 				DisableConnector(dispenserIndex);
@@ -1778,8 +2347,12 @@ void InitDispenserInfo(void)
 	    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.Value = 0;
 	    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AuthorizeStatus = 0;
 	    memset(&ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].WarningInfo, 0x00, sizeof(struct WARNING_CODE_INFO));
+
+	    //memset(&LastWarningInfo[i], 0x00, sizeof(struct WARNING_CODE_INFO));
 	}
 	memset(&ShmSysConfigAndInfo->SysInfo.DispenserInfo, 0x00, sizeof(struct DispenserInfoData));
+
+	ShmSysConfigAndInfo->SysInfo.DispenserInfo.Currency = ShmSysConfigAndInfo->SysConfig.BillingData.Currency;
 }
 
 void tcpSocketServerStart(void)
@@ -1817,7 +2390,28 @@ void tcpSocketServerStart(void)
 	while(1)
 	{
 		clientSockFd = accept(sockFd, (struct sockaddr*) &clientInfo, &addrlen);
-		PRINTF_FUNC("\nClient ip: %s is accepted at port: %d", inet_ntoa(clientInfo.sin_addr), clientInfo.sin_port);
+		/*
+		if((errno == EWOULDBLOCK) || (errno == EAGAIN) || (errno == ENONET) ||
+            (errno == EPROTO) || (errno == ENOPROTOOPT) || (errno == EOPNOTSUPP) ||
+            (errno == ENETDOWN) || (errno == ENETUNREACH) || (errno == EHOSTDOWN) ||
+            (errno == EHOSTUNREACH) || (errno == ECONNABORTED))
+		{
+		    printf("accept error: %s\n", strerror(errno));
+            //exit(EXIT_FAILURE);
+            //break;
+		}
+		else if ( errno == EINTR)
+		{
+		    printf("accept EINTRn");
+		    continue;
+		}
+		else
+		{
+            printf("AccepCb: accept error: %s\n", strerror(errno));
+            //break;
+            //exit(EXIT_FAILURE);
+		}*/
+		PRINTF_FUNC("Client ip: %s is accepted at port: %d", inet_ntoa(clientInfo.sin_addr), clientInfo.sin_port);
 
 		connectIndex = FindFreeChannel();
 		if(connectIndex >= 0)

+ 43 - 0
EVSE/Projects/DO360/Apps/Module_EvComm.h

@@ -52,6 +52,12 @@ enum PAYLOAD_REGISTER
 	_Reg_Connector_State			= 0x09,
 	_Reg_User_ID					= 0x0A,
 	_Reg_Charging_Permission		= 0x0B,
+	_Reg_Misc_Control               = 0x0C,
+	_Reg_Report_Csu_Version         = 0x0D,
+	_Reg_Report_Other_Version       = 0x0E,
+	_Reg_Charging_Info              = 0x0F,
+	_Reg_Charger_System_Id          = 0x10,
+	_Reg_WaitPlugIn                 = 0x11,
 };
 
 enum Response_Result
@@ -60,6 +66,12 @@ enum Response_Result
 	_R_NG	= 0x02,
 };
 
+enum Response_Upgrade
+{
+    _R_NeedUpgrade  = 0x01,
+    _R_NoUpgrade    = 0x02,
+};
+
 enum PlugIn_Status
 {
 	_PIS_UnPlugged	= 0x00,
@@ -130,4 +142,35 @@ enum ConnectionStatus
 	_CNS_DispenserMatched		= 0x02,
 };
 
+struct MISC_COMMAND
+{
+    unsigned short  Command;
+    unsigned int    Value;
+};
+
+enum MiscCommand
+{
+    _MiscCmd_None               = 0x0000,
+    _MiscCmd_ConnectorTimeout   = 0x0001,
+    _MiscCmd_ChangeOperative    = 0x0002,
+    _MiscCmd_DefaultPrice       = 0x0003,
+    _MiscCmd_Currency           = 0x0004,
+    _MiscCmd_AccountBalance     = 0x0005,
+    _MiscCmd_HardwareReboot     = 0x0101,
+    _MiscCmd_SoftwareRestart    = 0x0102,
+    _MiscCmd_RemoteStart        = 0x0103,
+};
+
+struct ChargingCapabilityResponse
+{
+    unsigned char  ResponseResult;          // 1: OK, 2 NG
+    unsigned short MaxOuputVoltage;         // unit = 0.1 volt
+    unsigned short MaxOuputCurrent;         // unit = 0.1 Amp
+    unsigned short MaxOuputPower;           // unit = 0.1 kW
+    unsigned char  Currency;                // currency index
+    unsigned int   UserPrice;               // unit = 0.01 dollar
+    unsigned int   TotalCost;               // unit = 0.01 dollar
+    int            AccountBalance;          // unit = 0.01 dollar
+};
+
 #endif /* MODULE_EVCOMM_H_ */

+ 39 - 0
EVSE/Projects/DO360/Apps/Module_EventLogging.c

@@ -208,6 +208,9 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
 	}
 }
 
+unsigned char MiscRequirement = 0;
+unsigned char VersionInfoRequirement = 0;
+
 int main(void)
 {
 	int ByteCount,BitCount;
@@ -228,6 +231,42 @@ int main(void)
 
 	for(;;)
 	{
+	    if(MiscRequirement != ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.MiscNeedAnnouncement)
+	    {
+	        memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+            memcpy(EventCodeTmp, "B40001", sizeof(EventCodeTmp) - 1);
+
+	        if(ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.MiscNeedAnnouncement)
+	        {
+	            DEBUG_INFO("********** Misc Command Need Announcement **********\n");
+	            AddFaultCodeToBuf(EventCodeTmp);
+	        }
+	        else
+	        {
+	            DEBUG_INFO("********** Misc Command Announced **********\n");
+	            RemoveFaultCodeToBuf(EventCodeTmp);
+	        }
+	        MiscRequirement = ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.MiscNeedAnnouncement;
+	    }
+
+	    if(VersionInfoRequirement != ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.NeedDispenserVerInfo)
+	    {
+            memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+            memcpy(EventCodeTmp, "B40999", sizeof(EventCodeTmp) - 1);
+
+	        if(ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.NeedDispenserVerInfo)
+	        {
+                DEBUG_INFO("********** Need Update Dispenser Version Info **********\n");
+                AddFaultCodeToBuf(EventCodeTmp);
+	        }
+	        else
+	        {
+	            DEBUG_INFO("********** Dispenser Version Info Updated **********\n");
+	            RemoveFaultCodeToBuf(EventCodeTmp);
+	        }
+	        VersionInfoRequirement = ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.NeedDispenserVerInfo;
+	    }
+
 		//check Fault Status
 		for(ByteCount=0;ByteCount<4;ByteCount++)
 		{

+ 555 - 24
EVSE/Projects/DO360/Apps/main.c

@@ -83,6 +83,12 @@
 #define		GUN_COMP_WAIT_TIMEOUT	10
 #define		GUN_PRECHARGING_TIMEOUT	60
 
+#define     REBOOT_TIMEOUT              10
+#define     RESET_TIMEOUT               10
+#define     OCPP_COST_REQ_INTERVAL      5
+#define     DISPENSER_RECONNECTE_TIME   30
+#define     FORCE_BALANCE_TIME          5
+
 char 	*valid_Internet[2] 	  = {"8.8.8.8", "180.76.76.76"};
 unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
 int whileLoopTime = 10000; // 10 ms
@@ -168,7 +174,7 @@ bool isModelNameMatch = true;
 
 //int rfidFd = -1;
 //char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.05.00.0000.00";
+char* fwVersion = "D0.06.00.0000.00";
 
 sqlite3 *localDb;
 bool isDb_ready;
@@ -307,7 +313,7 @@ int StoreLogMsg_1(const char *fmt, ...)
 	}
 	else
 	{
-		sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+		sprintf(Buf,"echo \'%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\' >> /Storage/SystemLog/[%04d.%02d]SystemLog",
 			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
 			buffer,
 			tm->tm_year+1900,tm->tm_mon+1);
@@ -1050,6 +1056,9 @@ int isReachableInternet()
 
 void InitEthernet()
 {
+    system("ifconfig eth0 down");
+    system("ifconfig eth1 down");
+    sleep(2);
 	char tmpbuf[256];
 	// /sbin/ifconfig eth0 192.168.1.10 netmask 255.255.255.0 down
 	system("echo 1 > /sys/class/gpio/gpio110/value");//reset PHY
@@ -3107,6 +3116,43 @@ void PowerCabinetAuthorizingSettingInitial(void)
     ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.StartAuthorize = false;
     ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.AuthorizingCompleted = false;
     ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.AuthorizeTargetIndex = 0;
+    ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.BackendAuthorized = false;
+}
+
+void FouceAnnounceAccountBalance(unsigned char index, unsigned char AuthorizeSrc)
+{
+    switch(AuthorizeSrc)
+    {
+        case _AuthorizeSrc_Local:
+            for(int i = 0; i < 2; i++)
+            {
+                if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].ConnectorID[i] != 0)
+                {
+                    unsigned char ConnectorIndex =  ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].ConnectorID[i] - 1;
+
+                    if(!ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AnnounceBalance)
+                    {
+                        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AnnounceBalance = true;
+
+                        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].AccountBalance = 0;
+                        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AccountBalanceRequest = true;
+                        PRINTF_FUNC("Force Announce Account Balance To Dispenser %d Connector %d", index + 1, ConnectorIndex + 1);
+                    }
+                }
+            }
+
+            break;
+        case _AuthorizeSrc_Remote:
+            if(!ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].Parameter.bits.AnnounceBalance)
+            {
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].Parameter.bits.AnnounceBalance = true;
+
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AccountBalance = 0;
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].Parameter.bits.AccountBalanceRequest = true;
+                PRINTF_FUNC("Force Announce Account Balance To Connector %d", index + 1);
+            }
+            break;
+    }
 }
 
 void AuthorizingSettingInitial(unsigned char index, unsigned char AuthorizeSrc)
@@ -3131,6 +3177,15 @@ void AuthorizingSettingInitial(unsigned char index, unsigned char AuthorizeSrc)
                     {
                         PRINTF_FUNC("*********** Connector id %d AuthorizeReqClean ***********", ConnectorIndex + 1);
                         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AuthorizeRequestType = _AuthorizeSrc_None;
+
+                        if(chargingInfo[ConnectorIndex]->SystemStatus == S_IDLE)
+                        {
+                            PRINTF_FUNC("*********** Connector id %d Clean UserId & UserPrice ***********", ConnectorIndex + 1);
+                            memset(chargingInfo[ConnectorIndex]->StartUserId, 0x00, 32);
+                            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].UserPrice = 0;
+                            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].AccountBalance = -6553500;
+                            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AnnounceBalance = false;
+                        }
                     }
                 }
             }
@@ -3146,6 +3201,15 @@ void AuthorizingSettingInitial(unsigned char index, unsigned char AuthorizeSrc)
             {
                 PRINTF_FUNC("*********** Connector id %d AuthorizeReqClean ***********", index + 1);
                 ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].Parameter.bits.AuthorizeRequestType = _AuthorizeSrc_None;
+
+                if(chargingInfo[index]->SystemStatus == S_IDLE)
+                {
+                    PRINTF_FUNC("*********** Connector id %d Clean UserId & UserPrice ***********", index + 1);
+                    memset(chargingInfo[index]->StartUserId, 0x00, 32);
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].UserPrice = 0;
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AccountBalance = -6553500;
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].Parameter.bits.AnnounceBalance = false;
+                }
             }
             break;
     }
@@ -3197,6 +3261,13 @@ void SetConnectorAuthorizeOK(unsigned char index, unsigned char AuthorizeSrc)
                         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AuthorizeRequestType = _AuthorizeSrc_Local;
                         memcpy(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].GeneralChargingData.StartUserId, ShmSysConfigAndInfo->SysConfig.UserId, 32);
                         PRINTF_FUNC("*********** Connector id %d LocalAuthorize OK ***********", ConnectorIndex + 1);
+
+                        if(!ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.BackendAuthorized)
+                        {
+                            // authorized without backend need to trigger announce AccountBalance
+                            //ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].AccountBalance = 0;
+                            //ShmSysConfigAndInfo->SysInfo.ConnectorInfo[ConnectorIndex].Parameter.bits.AccountBalanceRequest = true;
+                        }
                     }
                 }
             }
@@ -3227,6 +3298,11 @@ void AuthorizeTimeoutProcess(void)
         switch(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[index].AuthorizeStatus)
         {
             case _AuthorizeStatus_Pass:
+                if(GetTimeoutValue(_ConnectorAuthorizing_Time[index]) / uSEC_VAL >= FORCE_BALANCE_TIME)
+                {
+                    FouceAnnounceAccountBalance(index, _AuthorizeSrc_Remote);
+                }
+
                 if(GetTimeoutValue(_ConnectorAuthorizing_Time[index]) / uSEC_VAL >= _connectionTimeout)
                 {
                     PRINTF_FUNC("*********** Connector id %d  Plug In Timeout  ***********\n", index + 1);
@@ -3235,6 +3311,8 @@ void AuthorizeTimeoutProcess(void)
                 break;
 
             case _AuthorizeStatus_Fail:
+                FouceAnnounceAccountBalance(index, _AuthorizeSrc_Remote);
+
                 if(GetTimeoutValue(_ConnectorAuthorizing_Time[index]) / uSEC_VAL >= AUTHORIZE_FAIL_TIMEOUT)
                 {
                     PRINTF_FUNC("*********** Connector id %d Authorized Return ***********", index + 1);
@@ -3250,6 +3328,11 @@ void AuthorizeTimeoutProcess(void)
         switch(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[index].AuthorizeStatus)
         {
             case _AuthorizeStatus_Pass:
+                if(GetTimeoutValue(_DispenserAuthorizing_Time[index]) / uSEC_VAL >= FORCE_BALANCE_TIME)
+                {
+                    FouceAnnounceAccountBalance(index, _AuthorizeSrc_Local);
+                }
+
                 if(GetTimeoutValue(_DispenserAuthorizing_Time[index]) / uSEC_VAL >= _connectionTimeout)
                 {
                     PRINTF_FUNC("*********** Dispenser id %d  Plug In Timeout  ***********\n", index + 1);
@@ -3258,6 +3341,8 @@ void AuthorizeTimeoutProcess(void)
                 break;
 
             case _AuthorizeStatus_Fail:
+                FouceAnnounceAccountBalance(index, _AuthorizeSrc_Local);
+
                 if(GetTimeoutValue(_DispenserAuthorizing_Time[index]) / uSEC_VAL >= AUTHORIZE_FAIL_TIMEOUT)
                 {
                     PRINTF_FUNC("*********** Dispenser id %d Authorized Return ***********", index + 1);
@@ -3371,6 +3456,7 @@ void PowerCabinetAuthorizeProcess(void)
                                 PRINTF_FUNC("*********** %s id %d OCPP Authorize %s ***********",
                                     str_auth_src[ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.AuthorizeSrc], target + 1, accept ? "OK" : "NG");
                                 *AuthorizeStatus = accept ? _AuthorizeStatus_Pass : _AuthorizeStatus_Fail;
+                                ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.BackendAuthorized = true;
                             }
                         }
                         else
@@ -4039,6 +4125,25 @@ void StopGunInfoTimeoutDet(unsigned char gunIndex)
 	}
 }
 
+void TriggerDispenserConnectionTimeoutSetting(void)
+{
+    BOOL trigger = FALSE;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.ConnectorTimeoutConfigRequest = 1;
+            trigger = TRUE;
+        }
+    }
+
+    if(trigger)
+    {
+        PRINTF_FUNC("********** Trigger Dispenser Connector Timeout Value: %d **********\n", ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout);
+    }
+}
+
 void CheckConnectionTimeout(void)
 {
 	if(system("pidof -s OcppBackend > /dev/null") != 0)
@@ -4060,6 +4165,12 @@ void CheckConnectionTimeout(void)
 			_connectionTimeout = CONN_PLUG_TIME_OUT;
 		}
 	}
+
+	if(_connectionTimeout != ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout)
+	{
+	    ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout = _connectionTimeout;
+	    TriggerDispenserConnectionTimeoutSetting();
+	}
 }
 
 void CreateTimeoutFork()
@@ -4336,6 +4447,311 @@ int isReservationExpired(unsigned char gun_index)
 	return result;
 }
 
+struct timeval _Reboot_time;
+
+void TriggerDispenserHardwareReboot(void)
+{
+    BOOL trigger = FALSE;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.HardwareRebootConfirm &&
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.HardwareRebootRequest == 0)
+            {
+                trigger = TRUE;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.HardwareRebootRequest = 1;
+            }
+        }
+    }
+
+    if(trigger)
+    {
+        gettimeofday(&_Reboot_time, NULL);
+        PRINTF_FUNC("********** Trigger Dispenser Hardware Reboot **********");
+    }
+}
+
+BOOL IsDispenserHardwareRebootResponsed(void)
+{
+    BOOL response_ok = TRUE;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            if(!ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.HardwareRebootConfirm)
+            {
+                response_ok = FALSE;
+
+                // 10s for reboot request timeout
+                if((GetTimeoutValue(_Reboot_time) / uSEC_VAL) >= REBOOT_TIMEOUT)
+                {
+                    response_ok = TRUE;
+                    PRINTF_FUNC("Reboot request timeout");
+                }
+            }
+        }
+    }
+
+    return response_ok;
+}
+
+struct timeval _Reset_time;
+
+void TriggerDispenserSoftwareReset(void)
+{
+    BOOL trigger = FALSE;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.SoftwareResetConfirm == 0 &&
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.SoftwareResetRequest == 0)
+            {
+                trigger = TRUE;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.SoftwareResetRequest = 1;
+            }
+        }
+    }
+
+    if(trigger)
+    {
+        gettimeofday(&_Reset_time, NULL);
+        PRINTF_FUNC("********** Trigger Dispenser Software Reset **********");
+    }
+}
+
+BOOL IsDispenserSoftwareResetResponsed(void)
+{
+    BOOL response_ok = TRUE;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            if(!ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.SoftwareResetConfirm)
+            {
+                response_ok = FALSE;
+
+                // 10s for reset request timeout
+                if((GetTimeoutValue(_Reset_time) / uSEC_VAL) >= RESET_TIMEOUT)
+                {
+                    response_ok = TRUE;
+                    PRINTF_FUNC("Reset request timeout");
+                }
+            }
+        }
+    }
+
+    return response_ok;
+}
+
+// the unit of return value: 0.01 dollar
+int TariffParsing(char *StringItem, char *TariffCode)
+{
+    char *ptrSave, *ptrToken;
+    char strSource[128];
+    int fee = 0;
+
+    memcpy(strSource, StringItem, 128);
+
+    ptrToken = strtok_r(strSource, ";", &ptrSave);
+    while(ptrToken != NULL)
+    {
+        char *strTariff = strstr(ptrToken, TariffCode);
+        if(strTariff != NULL)
+        {
+            char *strFee = strstr(strTariff, "$");
+            if(strFee != NULL)
+            {
+                strFee++;
+                float fFee = atof(strFee);
+                fee = (int)(fFee * 100);
+                break;
+            }
+        }
+        ptrToken = strtok_r(NULL, ";", &ptrSave);
+    }
+    return fee;
+}
+
+void DefaultPriceHandler(char *StrDefaultPrice)
+{
+    BOOL trigger = FALSE;
+    unsigned int ConnectionFee = 0, CurrentRate = 0, OccupancyFee = 0;
+
+    PRINTF_FUNC("********** Default Price: %s", StrDefaultPrice);
+    ConnectionFee = TariffParsing(StrDefaultPrice, "Connection Fee");
+    PRINTF_FUNC("**********  Connection Fee: %d.%02d **********", (ConnectionFee / 100), (ConnectionFee % 100));
+    CurrentRate = TariffParsing(StrDefaultPrice, "Current Rate");
+    PRINTF_FUNC("**********    Current Rate: %d.%02d **********", (CurrentRate / 100), (CurrentRate % 100));
+    OccupancyFee = TariffParsing(StrDefaultPrice, "Occupancy Fee");
+    PRINTF_FUNC("**********   Occupancy Fee: %d.%02d **********", (OccupancyFee / 100), (OccupancyFee % 100));
+
+    ShmSysConfigAndInfo->SysInfo.DispenserInfo.DefaultPrice = CurrentRate;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].ConnectorQuantity > 0)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.DefaultPriceConfigRequest == 0)
+            {
+                trigger = TRUE;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.DefaultPriceConfigRequest = 1;
+                ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.CurrencyConfigRequest = 1;
+            }
+        }
+    }
+
+    if(trigger)
+    {
+        PRINTF_FUNC("********** Trigger Dispenser Default Price **********");
+    }
+}
+
+void UserPriceHandler(char *UserId, char *UserPrice)
+{
+    unsigned int ConnectionFee = 0, CurrentRate = 0, OccupancyFee = 0;
+    int AccountBalance = 0;
+
+    ConnectionFee = TariffParsing((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Connection Fee");
+    CurrentRate = TariffParsing((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Current Rate");
+    OccupancyFee = TariffParsing((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Occupancy Fee");
+    AccountBalance = TariffParsing((char *)ShmOCPP16Data->Cost.SetUserPrice.price, "Account Balance");
+
+    PRINTF_FUNC("********** User Id: %s **********", ShmOCPP16Data->Cost.SetUserPrice.idToken);
+    PRINTF_FUNC("********** User Price: %s", ShmOCPP16Data->Cost.SetUserPrice.price);
+    PRINTF_FUNC("**********  Connection Fee: %d.%02d **********", (ConnectionFee / 100), (ConnectionFee % 100));
+    PRINTF_FUNC("**********    Current Rate: %d.%02d **********", (CurrentRate / 100), (CurrentRate % 100));
+    PRINTF_FUNC("**********   Occupancy Fee: %d.%02d **********", (OccupancyFee / 100), (OccupancyFee % 100));
+    PRINTF_FUNC("********** Account Balance: %d.%02d **********", (AccountBalance / 100), (AccountBalance % 100));
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.StartUserId, UserId) == EQUAL)
+        {
+            if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].UserPrice != CurrentRate ||
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance != AccountBalance)
+            {
+                PRINTF_FUNC("********** Connector Id %d User Price %d.%02d, Account Balance %d.%02d **********",
+                    (i + 1), (CurrentRate / 100), (CurrentRate % 100), (AccountBalance / 100), (AccountBalance % 100));
+            }
+
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].UserPrice = CurrentRate;
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance = AccountBalance;
+
+            int DispenserIndex = ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].ParentDispensetIndex;
+
+            if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[DispenserIndex].AuthorizeStatus == _AuthorizeStatus_Pass &&
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.bits.AuthorizeRequestType == _AuthorizeSrc_Local)
+            {
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.bits.AccountBalanceRequest = true;
+            }
+        }
+    }
+}
+
+void RunningFinalCostHandler(void)
+{
+    unsigned int ConnectionFee = 0, SessionFee = 0, OccupancyFee = 0, TotalCost = 0;
+    int AccountBalance = 0;
+
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus >= S_REASSIGN_CHECK &&
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].GeneralChargingData.SystemStatus <= S_COMPLETE)
+        {
+            if(strlen((char *)ShmOCPP16Data->Cost.RunningCost[i].description) > 0)
+            {
+                ConnectionFee = TariffParsing((char *)ShmOCPP16Data->Cost.RunningCost[i].description, "Connection Fee");
+                SessionFee = TariffParsing((char *)ShmOCPP16Data->Cost.RunningCost[i].description, "Session Fee");
+                OccupancyFee = TariffParsing((char *)ShmOCPP16Data->Cost.RunningCost[i].description, "Occupancy Fee");
+                TotalCost = TariffParsing((char *)ShmOCPP16Data->Cost.RunningCost[i].description, "Total Cost");
+                AccountBalance = TariffParsing((char *)ShmOCPP16Data->Cost.RunningCost[i].description, "Account Balance");
+
+                PRINTF_FUNC("********** Connector Id: %d Running Cost **********", (i + 1));
+                PRINTF_FUNC("**********  Connection Fee: %d.%02d **********", (ConnectionFee / 100), (ConnectionFee % 100));
+                PRINTF_FUNC("**********     Session Fee: %d.%02d **********", (SessionFee / 100), (SessionFee % 100));
+                PRINTF_FUNC("**********   Occupancy Fee: %d.%02d **********", (OccupancyFee / 100), (OccupancyFee % 100));
+                PRINTF_FUNC("**********      Total Cost: %d.%02d **********", (TotalCost / 100), (TotalCost % 100));
+                PRINTF_FUNC("********** Account Balance: %d.%02d **********", (AccountBalance / 100), (AccountBalance % 100));
+
+                if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].TotalCost != TotalCost ||
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance != AccountBalance)
+                {
+                    PRINTF_FUNC("********** Connector Id %d Total Cost %d.%02d, Account Balance %d.%02d **********",
+                        (i + 1), (TotalCost / 100), (TotalCost % 100), (AccountBalance / 100), (AccountBalance % 100));
+                }
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].TotalCost = TotalCost;
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance = AccountBalance;
+
+                memset(&ShmOCPP16Data->Cost.RunningCost[i], 0x00, sizeof(struct StrcutRunningFinalCost));
+            }
+
+            if(strlen((char *)ShmOCPP16Data->Cost.FinalCost[i].description) > 0)
+            {
+                ConnectionFee = TariffParsing((char *)ShmOCPP16Data->Cost.FinalCost[i].description, "Connection Fee");
+                SessionFee = TariffParsing((char *)ShmOCPP16Data->Cost.FinalCost[i].description, "Session Fee");
+                OccupancyFee = TariffParsing((char *)ShmOCPP16Data->Cost.FinalCost[i].description, "Occupancy Fee");
+                TotalCost = TariffParsing((char *)ShmOCPP16Data->Cost.FinalCost[i].description, "Total Cost");
+                AccountBalance = TariffParsing((char *)ShmOCPP16Data->Cost.FinalCost[i].description, "Account Balance");
+
+                PRINTF_FUNC("********** Connector Id: %d Final Cost **********", (i + 1));
+                PRINTF_FUNC("**********  Connection Fee: %d.%02d **********", (ConnectionFee / 100), (ConnectionFee % 100));
+                PRINTF_FUNC("**********     Session Fee: %d.%02d **********", (SessionFee / 100), (SessionFee % 100));
+                PRINTF_FUNC("**********   Occupancy Fee: %d.%02d **********", (OccupancyFee / 100), (OccupancyFee % 100));
+                PRINTF_FUNC("**********      Total Cost: %d.%02d **********", (TotalCost / 100), (TotalCost % 100));
+                PRINTF_FUNC("********** Account Balance: %d.%02d **********", (AccountBalance / 100), (AccountBalance % 100));
+
+                if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].TotalCost != TotalCost ||
+                    ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance != AccountBalance)
+                {
+                    PRINTF_FUNC("********** Connector Id %d Total Cost %d.%02d, Account Balance %d.%02d **********",
+                        (i + 1), (TotalCost / 100), (TotalCost % 100), (AccountBalance / 100), (AccountBalance % 100));
+                }
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].TotalCost = TotalCost;
+                ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].AccountBalance = AccountBalance;
+
+                memset(&ShmOCPP16Data->Cost.FinalCost[i], 0x00, sizeof(struct StrcutRunningFinalCost));
+            }
+        }
+    }
+}
+
+struct timeval _Cost_Price_time;
+char MyDefaultPriceString[128];
+struct StrcutSetUserPrice MyUserPrice;
+char MyConnectorRunningCostString[CONNECTOR_QUANTITY][128];
+char MyConnectorFinalCostString[CONNECTOR_QUANTITY][128];
+
+void CheckOcppCostAndPrice(void)
+{
+    // 5s for reboot request timeout
+    if((GetTimeoutValue(_Cost_Price_time) / uSEC_VAL) >= OCPP_COST_REQ_INTERVAL)
+    {
+        gettimeofday(&_Cost_Price_time, NULL);
+
+        if(strcmp(MyDefaultPriceString, (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData) != EQUAL)
+        {
+            DefaultPriceHandler((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData);
+
+            memcpy(MyDefaultPriceString, ShmOCPP16Data->ConfigurationTable.CoreProfile[DefaultPrice].ItemData, 128);
+        }
+
+        if(strlen((char *)ShmOCPP16Data->Cost.SetUserPrice.idToken) > 0 && strlen((char *)ShmOCPP16Data->Cost.SetUserPrice.price) > 0)
+        {
+            UserPriceHandler((char *)ShmOCPP16Data->Cost.SetUserPrice.idToken, (char *)ShmOCPP16Data->Cost.SetUserPrice.price);
+
+            memset(&ShmOCPP16Data->Cost.SetUserPrice, 0x00, sizeof(struct StrcutSetUserPrice));
+        }
+
+        RunningFinalCostHandler();
+    }
+}
+
 //===============================================
 // OCPP
 //===============================================
@@ -4367,28 +4783,47 @@ void CheckOcppStatus()
 			}
 		}
 
-		if (canReset)
+		if(canReset)
 		{
-			ShmOCPP16Data->MsMsg.bits.ResetReq = NO;
-			sprintf((char*)ShmOCPP16Data->Reset.ResponseStatus, "Accepted");
-			if(strcmp((char *)ShmOCPP16Data->Reset.Type, "Hard") == EQUAL)
-			{
-				DEBUG_ERROR_MSG("****** Hard Reboot ****** \n");
-				ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
-				sleep(3);
-				system("reboot -f");
-			}
-			else if (strcmp((char *)ShmOCPP16Data->Reset.Type, "Soft") == EQUAL)
-			{
-				DEBUG_ERROR_MSG("****** Soft Reboot ****** \n");
-				ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
-				sleep(3);
-				system("killall OcppBackend &");
-				KillTask();
-				system("/usr/bin/run_evse_restart.sh");
-			}
+		    if(strcmp((char *)ShmOCPP16Data->Reset.Type, "Hard") == EQUAL)
+		    {
+                //trigger dispenser to hardware reboot
+                TriggerDispenserHardwareReboot();
+
+                if(IsDispenserHardwareRebootResponsed())
+                {
+                    ShmOCPP16Data->MsMsg.bits.ResetReq = NO;
+                    sprintf((char*)ShmOCPP16Data->Reset.ResponseStatus, "Accepted");
+                    DEBUG_ERROR_MSG("****** Hard Reboot ****** \n");
+
+                    ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
+                    sleep(3);
+                    system("reboot -f");
+                }
+		    }
+
+		    if(strcmp((char *)ShmOCPP16Data->Reset.Type, "Soft") == EQUAL)
+		    {
+                //trigger dispenser to software reset
+                TriggerDispenserSoftwareReset();
+
+                if(IsDispenserSoftwareResetResponsed())
+                {
+                    ShmOCPP16Data->MsMsg.bits.ResetReq = NO;
+                    sprintf((char*)ShmOCPP16Data->Reset.ResponseStatus, "Accepted");
+                    DEBUG_ERROR_MSG("****** Soft Reboot ****** \n");
+
+                    ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
+                    sleep(3);
+                    system("killall OcppBackend &");
+                    KillTask();
+                    system("/usr/bin/run_evse_restart.sh");
+                }
+		    }
 		}
 	}
+
+	CheckOcppCostAndPrice();
 }
 
 void OcppStartTransation(byte gunIndex)
@@ -4551,6 +4986,7 @@ void ChkOcppStatus(byte gunIndex)
                 DB_Update_Operactive(localDb, gunIndex, true);
 
             chargingInfo[gunIndex]->IsAvailable = YES;
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gunIndex].Parameter.bits.AvailabilityRequest = 1;
 
 			if (chargingInfo[gunIndex]->SystemStatus == S_IDLE ||
 				chargingInfo[gunIndex]->SystemStatus == S_RESERVATION ||
@@ -4565,6 +5001,7 @@ void ChkOcppStatus(byte gunIndex)
                 DB_Update_Operactive(localDb, gunIndex, false);
 
             chargingInfo[gunIndex]->IsAvailable = NO;
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gunIndex].Parameter.bits.AvailabilityRequest = 1;
 
 			if (chargingInfo[gunIndex]->SystemStatus == S_IDLE ||
 				chargingInfo[gunIndex]->SystemStatus == S_RESERVATION ||
@@ -5282,13 +5719,60 @@ bool GetStartChargingByAlterMode(byte _gun)
 	return result;
 }
 
+void CheckMiscCommandRequirement(void)
+{
+    BOOL NeedAnnouncement = FALSE;
 
+    for(int i = 0; i < CONNECTOR_QUANTITY; i++)
+    {
+        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.bits.AvailabilityRequest ||
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.bits.RemoteStartRequest ||
+            ShmSysConfigAndInfo->SysInfo.ConnectorInfo[i].Parameter.bits.AccountBalanceRequest)
+        {
+            NeedAnnouncement = TRUE;
+        }
 
+        if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.ConnectorTimeoutConfigRequest ||
+            ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.DefaultPriceConfigRequest ||
+            ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.CurrencyConfigRequest ||
+            ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.HardwareRebootRequest ||
+            ShmSysConfigAndInfo->SysInfo.DispenserInfo.Dispenser[i].Setting.bits.SoftwareResetRequest)
+        {
+            NeedAnnouncement = TRUE;
+        }
+    }
+
+    ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.MiscNeedAnnouncement = NeedAnnouncement;
+}
 
+void CheckDispenserVersionUpdateRequirement(void)
+{
 
+}
 
+void DispenserConnectionRetryHandler(void)
+{
+    unsigned short _timeout = 0;
+    unsigned int _price = 0;
+    unsigned char _currency = 0;
 
-struct timeval _dispenserDisconnection_time;
+    PRINTF_FUNC("********** Kill ModuleEvComm Task & Retry To Excute ModuleEvComm **********");
+
+    _timeout = ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout;
+    _price = ShmSysConfigAndInfo->SysInfo.DispenserInfo.DefaultPrice;
+    _currency = ShmSysConfigAndInfo->SysInfo.DispenserInfo.Currency;
+
+    system("killall Module_EvComm");
+    usleep(100000);
+    system("/root/Module_EvComm &");
+    usleep(100000);
+
+    ShmSysConfigAndInfo->SysInfo.DispenserInfo.ConnectorTimeout = _timeout;
+    ShmSysConfigAndInfo->SysInfo.DispenserInfo.DefaultPrice = _price;
+    ShmSysConfigAndInfo->SysInfo.DispenserInfo.Currency = _currency;
+}
+
+struct timeval _dispenserDisconnection_time, _dispenserConnectionRetry_time;
 
 int main(void)
 {
@@ -5475,6 +5959,17 @@ int main(void)
 		{
             if(ShmSysConfigAndInfo->SysInfo.DispenserInfo.DispenserQuantity == 0)
             {
+                if(ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.DispenserDisconnection == 0)
+                {
+                    ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.DispenserDisconnection = 1;
+                    gettimeofday(&_dispenserConnectionRetry_time, NULL);
+                }
+                if((GetTimeoutValue(_dispenserConnectionRetry_time) / uSEC_VAL) >= DISPENSER_RECONNECTE_TIME)
+                {
+                    DispenserConnectionRetryHandler();
+                    gettimeofday(&_dispenserConnectionRetry_time, NULL);
+                }
+
                 if((GetTimeoutValue(_dispenserDisconnection_time) / 1000) >= 1000)
                 {
                     ShmPrimaryMcuData->OutputDrv.bits.SystemLed2Drv = ShmPrimaryMcuData->OutputDrv.bits.SystemLed1Drv ? false : true;
@@ -5484,11 +5979,15 @@ int main(void)
             }
             else
             {
+                ShmSysConfigAndInfo->SysInfo.CabinetSetting.bits.DispenserDisconnection = 0;
                 ShmPrimaryMcuData->OutputDrv.bits.SystemLed1Drv = true;
                 ShmPrimaryMcuData->OutputDrv.bits.SystemLed2Drv = false;
             }
 		}
 
+		CheckMiscCommandRequirement();
+		CheckDispenserVersionUpdateRequirement();
+
 		for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
 		{
 			//CheckGpioInStatus();
@@ -5532,6 +6031,19 @@ int main(void)
 						strcpy((char *)chargingInfo[gun_index]->StopDateTime, "");
 						strcpy((char *)chargingInfo[gun_index]->StartUserId, "");
 						strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "");
+
+						// clean connector infomation
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].RemoteChargingVoltage = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].RemoteChargingCurrent = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].RemoteRemainChargingDuration = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].RemoteSoc = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].UserPrice = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].TotalCost = 0;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].AccountBalance = -6553500;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.AnnounceBalance = false;
+
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.StartWaitPlug = false;
+						ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.NeedCleanAuthorizeInfo = false;
 					}
 					else if (chargingInfo[gun_index]->SystemStatus == S_RESERVATION &&
 							isModeChange(gun_index))
@@ -5547,7 +6059,7 @@ int main(void)
 
 					if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
 					{
-						if (gun_index == ShmSysConfigAndInfo->SysInfo.CurGunSelected)
+						//if (gun_index == ShmSysConfigAndInfo->SysInfo.CurGunSelected)
 						{
 							ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_FIX;
 						}
@@ -5629,6 +6141,25 @@ int main(void)
                                     }
                                     continue;
                                 }
+                                else
+                                {
+                                    if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.NeedCleanAuthorizeInfo)
+                                    {
+                                        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.StartWaitPlug = false;
+                                        ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.NeedCleanAuthorizeInfo = false;
+
+                                        PRINTF_FUNC("Connector %d Stop Wait Plug In", gun_index + 1);
+
+                                        if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.AuthorizeRequestType == _AuthorizeSrc_Local)
+                                        {
+                                            AuthorizingSettingInitial(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].ParentDispensetIndex, _AuthorizeSrc_Local);
+                                        }
+                                        else if(ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.AuthorizeRequestType == _AuthorizeSrc_Remote)
+                                        {
+                                            AuthorizingSettingInitial(gun_index, _AuthorizeSrc_Remote);
+                                        }
+                                    }
+                                }
 
                                 /*
 								// 卡號驗證成功後,等待充電槍插入充電車
@@ -6207,7 +6738,7 @@ int main(void)
 					    }
 					}
 
-					if(chargingInfo[gun_index]->ConnectorPlugIn == NO &&
+					if((chargingInfo[gun_index]->ConnectorPlugIn == NO || ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Enable == false) &&
                         ShmSysConfigAndInfo->SysInfo.ConnectorInfo[gun_index].Parameter.bits.PsuReleasable)
 					{
 						setChargerMode(gun_index, MODE_IDLE);

二进制
EVSE/Projects/DO360/Images/FactoryDefaultConfig.bin


二进制
EVSE/Projects/DO360/Images/ramdisk.gz


+ 68 - 126
EVSE/Projects/DS60-120/Apps/Module_EvComm.c

@@ -54,27 +54,7 @@ struct PsuData 					*ShmPsuData;
 byte gun_count;
 int chargingTime[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
-float _pow_1 = 0;
-float _cur_1 = 0;
-float _pow_2 = 0;
-float _cur_2 = 0;
-
-float _outVol_1 = 0;
-float _outCur_1 = 0;
-float _outVol_2 = 0;
-float _outCur_2 = 0;
-
-float _maxVol_1 = 0;
-float _cap_cur_1 = 0;
-float _cap_pw_1	= 0;
-float _maxVol_2 = 0;
-float _cap_cur_2 = 0;
-float _cap_pw_2	= 0;
-
-float _max_battery_vol_1 = 0;
-float _max_battery_vol_2 = 0;
-float _real_1_pow = 0;
-float _real_2_pow = 0;
+float LogInfo[2][10];
 
 // 限制最大充電電壓,因應不同 type 槍線來限制
 // Chademo : 500V, 125A,
@@ -86,7 +66,7 @@ double gbVol = 7500;
 float maxChargingVol[2] = { 0, 0 };			// 限制最大充電電壓,如依照模塊則填上 0
 // 限制最大充電電流與能量透過 Web
 float maxChargingCur[2] = { 0, 0 };			// 限制最大充電電流,如依照模塊則填上 0
-float maxChargingPow = 0;							// 限制最大充電能量,如依照模塊則填上 0
+float maxChargingPow = 0;					// 限制最大充電能量,如依照模塊則填上 0
 
 // 槍資訊
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -2820,17 +2800,6 @@ void CANReceiver()
 						{
 							if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121)
 							{
-//								for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
-//								{
-//									if (_vCount % 2 == 0 && _vCount != 0)
-//									{
-//										ver[_vCount + _vPoint] = 0x2E;
-//										_vPoint++;
-//									}
-//
-//									ver[_vCount + _vPoint] = frame.data[_vCount];
-//								}
-
 								memcpy(ver, frame.data, frame.can_dlc);
 								memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
 								ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
@@ -2919,23 +2888,6 @@ void CANReceiver()
 						_chargingData[targetGun]->EvBatteryMaxVoltage = (((short) frame.data[4] << 8) + (short) frame.data[3]) / 10;
 						//_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
 						//_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
-						if (targetGun == 0)
-						{
-							if (_max_battery_vol_1 != _chargingData[targetGun]->EvBatteryMaxVoltage)
-							{
-								_max_battery_vol_1 = _chargingData[targetGun]->EvBatteryMaxVoltage;
-								PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", targetGun, _chargingData[targetGun]->EvBatteryMaxVoltage);
-							}
-						}
-						else if (targetGun == 1)
-						{
-							if (_max_battery_vol_2 != _chargingData[targetGun]->EvBatteryMaxVoltage)
-							{
-								_max_battery_vol_2 = _chargingData[targetGun]->EvBatteryMaxVoltage;
-								PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", targetGun, _chargingData[targetGun]->EvBatteryMaxVoltage);
-							}
-						}
-
 
 						if (_chargingData[targetGun]->Type == _Type_Chademo)
 						{
@@ -3068,17 +3020,21 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
 
 	cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
+
 	if (
-		(_outVol_1 >= vol1 + CHK_VOL_RANGE) || (_outVol_1 <= vol1 - CHK_VOL_RANGE) ||
-		(_outVol_2 >= vol2 + CHK_VOL_RANGE) || (_outVol_2 <= vol2 - CHK_VOL_RANGE) ||
-		(_outCur_1 >= cur1 + CHK_CUR_RANGE) || (_outCur_1 <= cur1 - CHK_CUR_RANGE) ||
-		(_outCur_2 >= cur2 + CHK_CUR_RANGE) || (_outCur_2 <= cur2 - CHK_CUR_RANGE)
+		(LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] >= vol1 + CHK_VOL_RANGE) || (LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] <= vol1 - CHK_VOL_RANGE) ||
+		(LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] >= cur1 + CHK_CUR_RANGE) || (LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] <= cur1 - CHK_CUR_RANGE) ||
+		(LogInfo[1][EV_LOG_NOW_OUTPUT_VOL] >= vol2 + CHK_VOL_RANGE) || (LogInfo[1][EV_LOG_NOW_OUTPUT_VOL] <= vol2 - CHK_VOL_RANGE) ||
+		(LogInfo[1][EV_LOG_NOW_OUTPUT_CUR] >= cur2 + CHK_CUR_RANGE) || (LogInfo[1][EV_LOG_NOW_OUTPUT_CUR] <= cur2 - CHK_CUR_RANGE)
 		)
 	{
 		PRINTF_FUNC("G1 -> Output Vol = %.1f, Output Cur = %.1f -- G2 -> Output Vol = %.1f, Output Cur = %.1f \n",
 			vol1 / 10, cur1 / 10, vol2 / 10, cur2 / 10);
 
-		_outVol_1 = vol1; _outCur_1 = cur1; _outVol_2 = vol2; _outCur_2 = cur2;
+		LogInfo[0][EV_LOG_NOW_OUTPUT_VOL] = vol1;
+		LogInfo[0][EV_LOG_NOW_OUTPUT_CUR] = cur1;
+		LogInfo[1][EV_LOG_NOW_OUTPUT_VOL] = vol2;
+		LogInfo[1][EV_LOG_NOW_OUTPUT_CUR] = cur2;
 	}
 
 	SetPresentOutputPower(vol1, cur1, vol2, cur2);
@@ -3106,7 +3062,7 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 			float maxCur = 0;
 			maxCur = (pow1 * 1000) / chargingData_1->FireChargingVoltage;
 
-			if (maxCur * 10 <= cur1 - 10)
+			if (maxCur * 10 <= cur1)
 			{
 				//PRINTF_FUNC("Gun1 -> MaxCharging Current = %f, Cap Current = %f \n", (maxCur * 10), cur1);
 				cur1 = maxCur * 10;
@@ -3130,7 +3086,7 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 			float maxCur = 0;
 			maxCur = (pow2 * 1000) / chargingData_2->FireChargingVoltage;
 
-			if (maxCur * 10 <= cur2 - 10)
+			if (maxCur * 10 <= cur2)
 			{
 				//PRINTF_FUNC("Gun2 -> MaxCharging Current = %f, Cap Current = %f \n", (maxCur * 10), cur2);
 				cur2 = maxCur * 10;
@@ -3138,18 +3094,21 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 		}
 	}
 
-	if ((_pow_1 <= pow1 - 0.5 || _pow_1 >= pow1 + 0.5) ||
-		(_cur_1 <= cur1 - 0.5 || _cur_1 >= cur1+ 0.5) ||
-		(_pow_2 <=  pow2 - 0.5 || _pow_2 >=  pow2 + 0.5) ||
-		(_cur_2 <=  cur2 - 0.5 || _cur_2 >=  cur2 + 0.5))
+	if ((LogInfo[0][EV_LOG_OUTPUT_CAP_POW] <= pow1 - 0.5 || LogInfo[0][EV_LOG_OUTPUT_CAP_POW] >= pow1 + 0.5) ||
+		(LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] <= cur1 - 0.5 || LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] >= cur1+ 0.5) ||
+		(LogInfo[1][EV_LOG_OUTPUT_CAP_POW] <=  pow2 - 0.5 || LogInfo[1][EV_LOG_OUTPUT_CAP_POW] >=  pow2 + 0.5) ||
+		(LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] <=  cur2 - 0.5 || LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] >=  cur2 + 0.5))
 	{
 		PRINTF_FUNC("----------------------------------------------------- \n");
 		PRINTF_FUNC("To EV (Real) Power_1 = %.1f, Cur_1 = %.1f, Power_2 = %.1f, Cur_2 = %.1f \n",
 				pow1 / 10, cur1 / 10, pow2 / 10, cur2 / 10);
 		PRINTF_FUNC("----------------------------------------------------- \n");
 
-		_pow_1 = pow1; _cur_1 = cur1; _pow_2 = pow2; _cur_2 = cur2;
-		chargingData_1->RealMaxCurrent = _cur_1;
+		LogInfo[0][EV_LOG_OUTPUT_CAP_POW] = pow1;
+		LogInfo[0][EV_LOG_OUTPUT_CAP_CUR] = cur1;
+		LogInfo[1][EV_LOG_OUTPUT_CAP_POW] = pow2;
+		LogInfo[1][EV_LOG_OUTPUT_CAP_CUR] = cur2;
+		chargingData_1->RealMaxCurrent = cur1;
 		chargingData_1->RealMaxPower = pow1;
 
 		if (gun_count == 2)
@@ -3588,12 +3547,16 @@ int main(int argc, char *argv[])
 						_chargingData[_index]->ChargingFee = 0.0;
 						_chargingData[_index]->EvBatterySoc = 0;
 						_chargingData[_index]->EvBatteryStartSoc = 0;
-						_chargingData[_index]->PresentChargingVoltage = 0;
-						_chargingData[_index]->PresentChargingCurrent = 0;
 						_chargingData[_index]->EvBatteryMaxVoltage = 0;
 						_chargingData[_index]->ChargingProfilePower = -1;
 						_chargingData[_index]->ChargingProfileCurrent = -1;
 
+						if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
+						{
+							_chargingData[_index]->PresentChargingVoltage = 0;
+							_chargingData[_index]->PresentChargingCurrent = 0;
+						}
+
 						chargingTime[_index] = 0;
 						SendErrorCount[_index] = 0;
 
@@ -3604,22 +3567,11 @@ int main(int argc, char *argv[])
 								ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10 < maxChargingPow)
 							maxChargingPow = ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10;
 
-						if (_index == 0)
-						{
-							_maxVol_1 = 0;
-							_cap_cur_1 = 0;
-							_cap_pw_1	= 0;
-							_max_battery_vol_1 = 0;
-							_real_1_pow = 0;
-						}
-						else if (_index == 1)
-						{
-							_maxVol_2 = 0;
-							_cap_cur_2 = 0;
-							_cap_pw_2 = 0;
-							_max_battery_vol_2 = 0;
-							_real_2_pow = 0;
-						}
+						LogInfo[_index][EV_LOG_EVSE_MAX_VOL] = 0;
+						LogInfo[_index][EV_LOG_EVSE_MAX_CUR] = 0;
+						LogInfo[_index][EV_LOG_MAX_BATT_VOL] = 0;
+						LogInfo[_index][EV_LOG_REAL_CAP_POW] = 0;
+						LogInfo[_index][EV_LOG_SOC] = 0;
 					}
 					break;
 				case S_PREPARNING:
@@ -3639,12 +3591,6 @@ int main(int argc, char *argv[])
 					// 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
 					GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
-//					PRINTF_FUNC("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
-//					PRINTF_FUNC("PresentChargingCurrent = %f \n", _chargingData[_index]->PresentChargingCurrent);
-//					PRINTF_FUNC("AvailableChargingPower = %f \n", _chargingData[_index]->AvailableChargingPower);
-//					PRINTF_FUNC("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
-//					PRINTF_FUNC("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
-
 					// 設定當前輸出
 					if (gun_count == 1)
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
@@ -3660,29 +3606,14 @@ int main(int argc, char *argv[])
 
 						GetMaxVolAndCurMethod(_index, &maxVol, &maxCur);
 
-						if (_index == 0)
+						if (LogInfo[_index][EV_LOG_EVSE_MAX_VOL] != maxVol ||
+								LogInfo[_index][EV_LOG_EVSE_MAX_CUR] != maxCur)
 						{
-							if (_maxVol_1 != maxVol || _cap_cur_1 != maxCur ||
-									_cap_pw_1 != _chargingData[_index]->AvailableChargingPower)
-							{
-								_maxVol_1 = maxVol; _cap_cur_1 = maxCur;
-								_cap_pw_1 = _chargingData[_index]->AvailableChargingPower;
+							LogInfo[_index][EV_LOG_EVSE_MAX_VOL] = maxVol;
+							LogInfo[_index][EV_LOG_EVSE_MAX_CUR] = maxCur;
 
-								PRINTF_FUNC("To EV_%d Max_Vol = %.1f, Cap_Cur = %.1f, Cap_Pow = %.1f \n",
-									_index, maxVol / 10, maxCur / 10, _chargingData[_index]->AvailableChargingPower / 10);
-							}
-						}
-						else if (_index == 1)
-						{
-							if (_maxVol_2 != maxVol || _cap_cur_2 != maxCur ||
-									_cap_pw_2 != _chargingData[_index]->AvailableChargingPower)
-							{
-								_maxVol_2 = maxVol; _cap_cur_2 = maxCur;
-								_cap_pw_2 = _chargingData[_index]->AvailableChargingPower;
-
-								PRINTF_FUNC("To EV_%d Max_Vol = %.1f, Cap_Cur = %.1f, Cap_Pow = %.1f \n",
-									_index, maxVol / 10, maxCur / 10, _chargingData[_index]->AvailableChargingPower / 10);
-							}
+							PRINTF_FUNC("To EV_%d Max_Vol = %.1f, Cap_Cur = %.1f, Cap_Pow = %.1f \n",
+								_index, maxVol / 10, maxCur / 10, _chargingData[_index]->AvailableChargingPower / 10);
 						}
 
 						_chargingData[_index]->RealMaxVoltage = maxVol;
@@ -3720,6 +3651,19 @@ int main(int argc, char *argv[])
 						else if (gun_count == 2)
 							SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
 					}
+
+					if (LogInfo[_index][EV_LOG_MAX_BATT_VOL] != _chargingData[_index]->EvBatteryMaxVoltage)
+					{
+						LogInfo[_index][EV_LOG_MAX_BATT_VOL] = _chargingData[_index]->EvBatteryMaxVoltage;
+						PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", _index, _chargingData[_index]->EvBatteryMaxVoltage);
+					}
+
+					if (LogInfo[_index][EV_LOG_SOC] != _chargingData[_index]->EvBatterySoc)
+					{
+						LogInfo[_index][EV_LOG_SOC] = _chargingData[_index]->EvBatterySoc;
+						PRINTF_FUNC("index = %d, SOC = %d \n", _index, _chargingData[_index]->EvBatterySoc);
+					}
+
 					// 持續通知 Isolation 測試狀態
 					if (priorityLow == 1)
 					{
@@ -3749,26 +3693,12 @@ int main(int argc, char *argv[])
 										_chargingData[_index]->RealRatingPower > 0) ||
 										(GetTimeoutValue(_chk_ratingPower_timeout[_index]) / 1000) > 14000)
 								{
-									if (_index == 0)
-									{
-										if (_real_1_pow != _chargingData[_index]->RealRatingPower)
-										{
-											_real_1_pow = _chargingData[_index]->RealRatingPower;
-											PRINTF_FUNC("Conn %d, RealRatingPower = %d \n",
-														_index, _chargingData[_index]->RealRatingPower);
-										}
-									}
-									else if (_index == 1)
+									if (LogInfo[_index][EV_LOG_REAL_CAP_POW] != _chargingData[_index]->RealRatingPower)
 									{
-										if (_real_2_pow != _chargingData[_index]->RealRatingPower)
-										{
-											_real_2_pow = _chargingData[_index]->RealRatingPower;
-											PRINTF_FUNC("Conn %d, RealRatingPower = %d \n",
-														_index, _chargingData[_index]->RealRatingPower);
-										}
+										LogInfo[_index][EV_LOG_REAL_CAP_POW] = _chargingData[_index]->RealRatingPower;
+										PRINTF_FUNC("Conn %d, RealRatingPower = %d \n",
+											_index, _chargingData[_index]->RealRatingPower);
 									}
-
-									//_result = GFD_PASS;
 								}
 								else
 									_result = GFD_WAIT;
@@ -3816,6 +3746,18 @@ int main(int argc, char *argv[])
 					// 開始確認車端是否同意開始充電
 					GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
+					if (LogInfo[_index][EV_LOG_MAX_BATT_VOL] != _chargingData[_index]->EvBatteryMaxVoltage)
+					{
+						LogInfo[_index][EV_LOG_MAX_BATT_VOL] = _chargingData[_index]->EvBatteryMaxVoltage;
+						PRINTF_FUNC("index = %d, Ev Maximum Battery Voltage = %f \n", _index, _chargingData[_index]->EvBatteryMaxVoltage);
+					}
+
+					if (LogInfo[_index][EV_LOG_SOC] != _chargingData[_index]->EvBatterySoc)
+					{
+						LogInfo[_index][EV_LOG_SOC] = _chargingData[_index]->EvBatterySoc;
+						PRINTF_FUNC("index = %d, SOC = %d \n", _index, _chargingData[_index]->EvBatterySoc);
+					}
+
 					// 設定當前輸出
 					if (gun_count == 1)
 						SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);

+ 13 - 0
EVSE/Projects/DS60-120/Apps/Module_EvComm.h

@@ -75,5 +75,18 @@ enum Receieve_PSU_msgf
 	ACK_EVSE_PRECHAGE_INFO = 			0x08001500,
 };
 
+enum EV_LOG_INDEX
+{
+	EV_LOG_OUTPUT_CAP_POW = 0,
+	EV_LOG_OUTPUT_CAP_CUR = 1,
+	EV_LOG_NOW_OUTPUT_VOL = 2,
+	EV_LOG_NOW_OUTPUT_CUR = 3,
+	EV_LOG_EVSE_MAX_VOL = 	4,
+	EV_LOG_EVSE_MAX_CUR = 	5,
+	EV_LOG_MAX_BATT_VOL	= 	6,
+	EV_LOG_REAL_CAP_POW	= 	7,
+	EV_LOG_SOC = 			8
+};
+
 #endif /* MODULE_EVCOMM_H_ */
 

+ 56 - 3
EVSE/Projects/DS60-120/Apps/Module_EventLogging.c

@@ -46,6 +46,7 @@ int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define EVENT_INFO(format, args...) StoreEventLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 
 int StoreLogMsg(const char *fmt, ...)
 {
@@ -82,6 +83,52 @@ int StoreLogMsg(const char *fmt, ...)
 	return rc;
 }
 
+int StoreEventLogMsg(const char *fmt, ...)
+{
+	char Buf[4096+256];
+	char buffer[4096];
+	time_t CurrentTime;
+	struct tm *tm;
+	struct timeval tv;
+	va_list args;
+
+	va_start(args, fmt);
+	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+	va_end(args);
+
+	memset(Buf,0,sizeof(Buf));
+	CurrentTime = time(NULL);
+	tm=localtime(&CurrentTime);
+	gettimeofday(&tv, NULL); // get microseconds, 10^-6
+
+	if((ShmSysConfigAndInfo->SysConfig.ModelName != NULL) && (ShmSysConfigAndInfo->SysConfig.SerialNumber != NULL) && (strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) >= 14))
+	{
+		sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]%s_%s_EventLog",
+					tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
+					buffer,
+					tm->tm_year+1900,tm->tm_mon+1,
+					ShmSysConfigAndInfo->SysConfig.ModelName,
+					ShmSysConfigAndInfo->SysConfig.SerialNumber);
+	}
+	else
+	{
+		sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]EventLog",
+					tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec,
+					buffer,
+					tm->tm_year+1900,tm->tm_mon+1);
+	}
+
+#ifdef SystemLogMessage
+	system(Buf);
+#endif
+
+#ifdef ConsloePrintLog
+	printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer);
+#endif
+
+	return rc;
+}
+
 int DiffTimeb(struct timeb ST, struct timeb ET)
 {
 	//return milli-second
@@ -338,8 +385,10 @@ int main(void)
 							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
-							DB_Insert_Record(localDb, EventCodeTmp);
 						}
+
+						EVENT_INFO("%s\n", EventCodeTmp);
+						DB_Insert_Record(localDb, EventCodeTmp);
 					}
 				}
 			}
@@ -369,8 +418,10 @@ int main(void)
 							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
-							DB_Insert_Record(localDb, EventCodeTmp);
 						}
+
+						EVENT_INFO("%s\n", EventCodeTmp);
+						DB_Insert_Record(localDb, EventCodeTmp);
 					}
 				}
 			}
@@ -400,8 +451,10 @@ int main(void)
 							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
 							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
 							AddFaultCodeToBuf(EventCodeTmp);
-							DB_Insert_Record(localDb, EventCodeTmp);
 						}
+
+						EVENT_INFO("%s\n", EventCodeTmp);
+						DB_Insert_Record(localDb, EventCodeTmp);
 					}
 				}
 			}

+ 8 - 3
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c

@@ -1925,9 +1925,6 @@ void GetPsuTempForFanSpeed()
 
 void GetFanSpeedByFunction()
 {
-	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-		return;
-
 	// 風控修改 :
 	// ******************************************************* //
 	//
@@ -1967,6 +1964,14 @@ void GetFanSpeedByFunction()
 	if (temp > 70)
 		_temp_diff = temp - 70;
 
+	// debug mode 直接印出資訊後離開
+	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+	{
+//		printf("Fan Speed Information: power = %f, _maxPower = %d, temp = %d -- _pw_rate = %f, _temp_rate = %f, _temp_diff = %d \n",
+//				power, _maxPower, temp, _pw_rate, _temp_rate, _temp_diff);
+		return;
+	}
+
 	ShmFanModuleData->TestFanSpeed = (((50 * _pw_rate * _temp_rate) + (0.5 * _temp_diff)) / 100) * MAX_FAN_SPEED;
 
 	if (ShmFanModuleData->TestFanSpeed > MAX_FAN_SPEED)

+ 3 - 2
EVSE/Projects/DS60-120/Apps/Module_LcmControl.c

@@ -1024,10 +1024,11 @@ void ProcessPageInfo()
 {
 	_page_reload = IsPageReloadChk();
 
+	// ÀH´¡§Y¥R - ¥i¬Ù²¤¸Ó«ö¶s
 	if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
 	{
 		ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-		if (_totalCount >= 2)
+		if (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 			ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 		else
 			ChangeDisplay2Value(__sel_gun_btn, _disappear);
@@ -1089,7 +1090,7 @@ void ProcessPageInfo()
 					break;
 				}
 
-				if (isCharging)
+				if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
 				{
 					ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 				}

+ 12 - 22
EVSE/Projects/DS60-120/Apps/Module_PsuComm.c

@@ -23,6 +23,7 @@
 #define CMD_DELAY_TIME 		25000
 #define LOG_VOL_GAP			50
 #define LOG_CUR_GAP			5
+#define PSU_MIN_OUTPUT_CUR	1
 
 struct SysConfigAndInfo			*ShmSysConfigAndInfo;
 struct StatusCodeData 			*ShmStatusCodeData;
@@ -1630,7 +1631,7 @@ int main(void)
 									}
 								}
 
-								PRINTF_FUNC("Index = %d, DividChargingCurrent = %f \n", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
+								PRINTF_FUNC("Index = %d, DividChargingCurrent = %.1f \n", groupIndex, chargingInfo[groupIndex]->DividChargingCurrent);
 							}
 							else
 							{
@@ -1745,6 +1746,9 @@ int main(void)
 											chargingInfo[groupIndex]->MaxChargingToAverPassFlag == 0)
 										{
 											chargingInfo[groupIndex]->MaxChargingToAverPassFlag = 1;
+
+											if(chargingInfo[groupIndex]->EvBatterytargetCurrent <= PSU_MIN_OUTPUT_CUR)
+												chargingInfo[groupIndex]->EvBatterytargetCurrent = PSU_MIN_OUTPUT_CUR;
 											PresentOutputVol(groupIndex, targetVol, (chargingInfo[groupIndex]->EvBatterytargetCurrent * 10)); Await();
 
 											PresentOutputVol(reassignIndex, targetVol, CHK_CUR_RANGE); Await();
@@ -1774,33 +1778,16 @@ int main(void)
 							else if (ShmSysConfigAndInfo->SysInfo.ReAssignedFlag >= _REASSIGNED_RELAY_M_TO_A)
 							{
 								//PRINTF_FUNC("set out (%d) value = %f******** 3 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+								if(chargingInfo[groupIndex]->EvBatterytargetCurrent <= PSU_MIN_OUTPUT_CUR)
+									chargingInfo[groupIndex]->EvBatterytargetCurrent = PSU_MIN_OUTPUT_CUR;
 								PresentOutputVol(groupIndex,
 									(chargingInfo[groupIndex]->EvBatterytargetVoltage * 10),
 									(chargingInfo[groupIndex]->EvBatterytargetCurrent * 10)); Await();
 							}
 							else if (ShmSysConfigAndInfo->SysInfo.MainChargingMode == _MAIN_CHARGING_MODE_MAX)
 							{
-								//PRINTF_FUNC("set out (sys) value = %f, smart step = %d******** 4 \n",
-								//	chargingInfo[groupIndex]->EvBatterytargetCurrent, ShmSysConfigAndInfo->SysInfo.ReAssignedFlag);
-								// 該充電槍的目標電壓與目標電流
-
-								//sdlu
-//								if ((chargingInfo[groupIndex]->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
-//										chargingInfo[groupIndex]->SystemStatus <= S_CCS_PRECHARGE_ST1))
-//								{
-//									PresentOutputVol(SYSTEM_CMD,
-//										(chargingInfo[groupIndex]->EvBatterytargetVoltage * 10),
-//										0);
-//								}
-//								else
-//								{
-//									PresentOutputVol(SYSTEM_CMD,
-//										(chargingInfo[groupIndex]->EvBatterytargetVoltage * 10) - 100,
-//										(chargingInfo[groupIndex]->EvBatterytargetCurrent * 10));
-//								}
-
-//								printf("groupIndex = %d, EvBatterytargetCurrent = %f \n", groupIndex,
-//									(chargingInfo[groupIndex]->EvBatterytargetCurrent * 10));
+								if(chargingInfo[groupIndex]->EvBatterytargetCurrent <= PSU_MIN_OUTPUT_CUR)
+									chargingInfo[groupIndex]->EvBatterytargetCurrent = PSU_MIN_OUTPUT_CUR;
 
 								PresentOutputVol(SYSTEM_CMD,
 									(chargingInfo[groupIndex]->EvBatterytargetVoltage * 10),
@@ -2006,6 +1993,9 @@ int main(void)
 								else
 								{
 									//PRINTF_FUNC("set out (%d) value = %f******** 7 \n", groupIndex, chargingInfo[groupIndex]->EvBatterytargetCurrent);
+									if(chargingInfo[groupIndex]->EvBatterytargetCurrent <= PSU_MIN_OUTPUT_CUR)
+										chargingInfo[groupIndex]->EvBatterytargetCurrent = PSU_MIN_OUTPUT_CUR;
+
 									PresentOutputVol(groupIndex,
 										(chargingInfo[groupIndex]->EvBatterytargetVoltage * 10),
 										(chargingInfo[groupIndex]->EvBatterytargetCurrent * 10)); Await();

+ 1 - 1
EVSE/Projects/DS60-120/Apps/ReadCmdline.c

@@ -435,7 +435,7 @@ void CreateOneError(char *v1)
 {
 	int value = atoi(v1);
 
-	ShmPrimaryMcuData->InputDet.bits.EmergencyButton = value;
+	ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayWelding = value;
 	//ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = value;
 	//ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value;
 }

+ 164 - 65
EVSE/Projects/DS60-120/Apps/main.c

@@ -53,7 +53,7 @@
 #define		UPGRADE_PRI			0x04
 #define		UPGRADE_AC			0x05
 #define		UPGRADE_LED			0x06
-#define		SYSTEM_MIN_VOL		150
+#define		SYSTEM_MIN_VOL		80
 #define 	MIN_OUTPUT_CUR		0
 #define		AC_OUTPUT_VOL		220
 
@@ -154,7 +154,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "V1.04.00.0000.00";
+char* fwVersion = "V1.05.00.0000.00";
 
 sqlite3 *localDb;
 bool isDb_ready;
@@ -235,7 +235,7 @@ int InitComPort(byte target)
 	tios.c_iflag = 0;
 	tios.c_oflag = 0;
 	tios.c_cc[VMIN]=0;
-	tios.c_cc[VTIME]=(unsigned char)1;
+	tios.c_cc[VTIME]=(unsigned char)5;
 	tios.c_lflag=0;
 	tcflush(fd, TCIFLUSH);
 	ioctl (fd, TCSETS, &tios);
@@ -1019,6 +1019,9 @@ int isReachableInternet()
 
 void InitEthernet()
 {
+	system("ifconfig eth0 down");// eth0 down
+	system("ifconfig eth1 down");// eth1 down
+	sleep(2);
 	char tmpbuf[256];
 	// /sbin/ifconfig eth0 192.168.1.10 netmask 255.255.255.0 down
 	system("echo 1 > /sys/class/gpio/gpio110/value");//reset PHY
@@ -3482,7 +3485,6 @@ void KillTask()
 	system("killall Module_EventLogging");
 	system("killall Module_PrimaryComm");
 	system("killall Module_EvComm");
-	system("killall Module_LcmControl");
 	system("killall Module_InternalComm");
 	system("killall Module_PsuComm");
 	//system("killall OcppBackend &");
@@ -3490,6 +3492,16 @@ void KillTask()
 	system("killall Module_Wifi &");
 }
 
+void KillTaskExceptPrimary()
+{
+	ChangeLcmByIndex(_LCM_FIX);
+	system("killall Module_EvComm");
+	system("killall Module_InternalComm");
+	system("killall Module_PsuComm");
+	system("killall Module_4g &");
+	system("killall Module_Wifi &");
+}
+
 void KillAllTask()
 {
 	ChangeLcmByIndex(_LCM_FIX);
@@ -4059,6 +4071,11 @@ void CheckFwUpdateFunction()
 	{
 		DEBUG_INFO_MSG("ftp : update start. \n");
 		KillTask();
+		for (byte gun_index = 0; gun_index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; gun_index++)
+		{
+			setChargerMode(gun_index, MODE_UPDATE);
+		}
+
 		byte updateResult = CheckUpdateProcess();
 
 		if (updateResult == PASS)
@@ -4069,7 +4086,7 @@ void CheckFwUpdateFunction()
 			KillAllTask();
 			ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = NO;
 			sleep(5);
-			system("/root/main &");
+			system("/usr/bin/run_evse_restart.sh");
 			return;
 		}
 		else
@@ -4114,7 +4131,7 @@ void CheckFwUpdateFunction()
 				strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
 				ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
 				sleep(5);
-				system("/root/main &");
+				system("/usr/bin/run_evse_restart.sh");
 				return;
 			}
 			else
@@ -4206,7 +4223,7 @@ void CheckOcppStatus()
 				ShmOCPP16Data->MsMsg.bits.ResetConf = YES;
 				sleep(3);
 				system("killall OcppBackend &");
-				KillTask();
+				KillAllTask();
 				system("/usr/bin/run_evse_restart.sh");
 			}
 		}
@@ -4530,6 +4547,10 @@ int DB_Open(sqlite3 *db)
 						   "`occurDatetime` TEXT NOT NULL, "
 					       "`statusCode` INTEGER NOT NULL, unique(occurDatetime,statusCode) on conflict replace);";
 
+	char* createrebootSql="CREATE TABLE IF NOT EXISTS `reboot_record` ( "
+							   "`idx` INTEGER PRIMARY KEY AUTOINCREMENT, "
+							   "`rebootDatetime` TEXT NOT NULL, unique(rebootDatetime) on conflict replace);";
+
 	if(sqlite3_open(DB_FILE, &db))
 	{
 		result = FAIL;
@@ -4570,6 +4591,16 @@ int DB_Open(sqlite3 *db)
 			PRINTF_FUNC( "Opened local record table successfully\n");
 		}
 
+		if (sqlite3_exec(db, createrebootSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			PRINTF_FUNC( "Create reboot record table error message: %s\n", errMsg);
+		}
+		else
+		{
+			PRINTF_FUNC( "Opened reboot record table successfully\n");
+		}
+
 		sqlite3_close(db);
 	}
 
@@ -4710,6 +4741,49 @@ int DB_Get_Operactive(sqlite3 *db, uint8_t gun_index)
 	return result;
 }
 
+int DB_Reboot_Record(sqlite3 *db)
+{
+	int result = PASS;
+	char* errMsg = NULL;
+	char insertSql[256];
+
+	sprintf(insertSql, "insert into reboot_record(rebootDatetime) values(CURRENT_TIMESTAMP);");
+
+	if(sqlite3_open(DB_FILE, &db))
+	{
+		result = FAIL;
+		PRINTF_FUNC( "Can't open database: %s\n", sqlite3_errmsg(db));
+		sqlite3_close(db);
+	}
+	else
+	{
+		PRINTF_FUNC( "Local charging record database open successfully.\n");
+		if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			PRINTF_FUNC( "Insert reboot record error message: %s\n", errMsg);
+		}
+		else
+		{
+			PRINTF_FUNC( "Insert reboot record successfully\n");
+		}
+
+		sprintf(insertSql, "delete from reboot_record where idx < (select idx from charging_record order by idx desc limit 1)-2000;");
+		if (sqlite3_exec(db, insertSql, 0, 0, &errMsg) != SQLITE_OK)
+		{
+			result = FAIL;
+			PRINTF_FUNC( "delete reboot record error message: %s\n", errMsg);
+		}
+		else
+		{
+			PRINTF_FUNC( "delete reboot record successfully\n");
+		}
+
+		sqlite3_close(db);
+	}
+
+	return result;
+}
 //===============================================
 // Config process
 //===============================================
@@ -4831,6 +4905,18 @@ void StopProcessingLoop()
 	{
 		CheckFactoryConfigFunction();
 		CheckFwUpdateFunction();
+		if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
+		{
+			ChkPrimaryStatus();
+			if (ShmSysConfigAndInfo->SysWarningInfo.Level == 0)
+			{
+				PRINTF_FUNC("Soft reboot for retry self-tets (Primary). \n");
+				KillAllTask();
+				sleep(3);
+				system("/usr/bin/run_evse_restart.sh");
+				return;
+			}
+		}
 		sleep(1);
 	}
 }
@@ -5227,7 +5313,7 @@ int main(void)
 				PRINTF_FUNC("Soft reboot for retry self-tets. \n");
 				sleep(3);
 				system("killall OcppBackend &");
-				KillTask();
+				KillAllTask();
 				system("/usr/bin/run_evse_restart.sh");
 			}
 		}
@@ -5236,9 +5322,14 @@ int main(void)
 		{
 			ChargingAlarmProcess(gun_index);
 		}
-		ChangeLcmByIndex(_LCM_FIX);
+		//ChangeLcmByIndex(_LCM_FIX);
 		sleep(3);
-		KillTask();
+		if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
+		{
+			KillTaskExceptPrimary();
+		}
+		else
+			KillTask();
 		StopProcessingLoop();
 	}
 	else
@@ -5264,6 +5355,7 @@ int main(void)
 		{
 			chargingInfo[_index]->IsAvailable = DB_Get_Operactive(localDb, _index);
 		}
+		DB_Reboot_Record(localDb);
 	}
 
 	ChangeLcmByIndex(_LCM_IDLE);
@@ -5360,6 +5452,8 @@ int main(void)
 						PRINTF_FUNC("================= S_IDLE (%x) ================  \n", gun_index);
 						chargingInfo[gun_index]->PresentChargedDuration = 0;
 						chargingInfo[gun_index]->RemainChargingDuration = 0;
+						chargingInfo[gun_index]->PresentChargingVoltage = 0;
+						chargingInfo[gun_index]->PresentChargingCurrent = 0;
 						strcpy((char *)chargingInfo[gun_index]->StartDateTime, "");
 						strcpy((char *)chargingInfo[gun_index]->StopDateTime, "");
 						strcpy((char *)chargingInfo[gun_index]->StartUserId, "");
@@ -5631,11 +5725,19 @@ int main(void)
 					if (isEvBoardStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (錯誤)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingAlarmProcess(gun_index);
 					}
 					else if (isEvBoardNormalStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (正常)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingTerminalProcess(gun_index);
 					}
 					else if (OcppRemoteStop(gun_index) == YES ||
@@ -5687,11 +5789,19 @@ int main(void)
 					if (isEvBoardStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (錯誤)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingAlarmProcess(gun_index);
 					}
 					else if (isEvBoardNormalStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (正常)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingTerminalProcess(gun_index);
 					}
 					else if (OcppRemoteStop(gun_index) == YES ||
@@ -5778,11 +5888,19 @@ int main(void)
 					if (isEvBoardStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (錯誤)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingAlarmProcess(gun_index);
 					}
 					else if (isEvBoardNormalStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (正常)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingTerminalProcess(gun_index);
 					}
 					else if (OcppRemoteStop(gun_index) == YES ||
@@ -5822,13 +5940,13 @@ int main(void)
 							// GFD 錯誤停止
 							RecordAlarmCode(gun_index, "012234");
 						}
-						else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
-						{
-							// UVP
-							RecordAlarmCode(gun_index, "012289");
-							ChargingTerminalProcess(gun_index);
-						}
+//						else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+//								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
+//						{
+//							// UVP
+//							RecordAlarmCode(gun_index, "012289");
+//							ChargingTerminalProcess(gun_index);
+//						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
@@ -5842,14 +5960,14 @@ int main(void)
 							// GFD 錯誤停止
 							RecordAlarmCode(gun_index, "012236");
 						}
-						else if (isPrechargeStatus_gb(gun_index) == 10 &&
-								(((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
-						{
-							// UVP
-							RecordAlarmCode(gun_index, "012290");
-							ChargingTerminalProcess(gun_index);
-						}
+//						else if (isPrechargeStatus_gb(gun_index) == 10 &&
+//								(((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+//								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
+//						{
+//							// UVP
+//							RecordAlarmCode(gun_index, "012290");
+//							ChargingTerminalProcess(gun_index);
+//						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
@@ -5863,13 +5981,13 @@ int main(void)
 							// GFD 錯誤停止
 							RecordAlarmCode(gun_index, "012235");
 						}
-						else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
-						{
-							// UVP
-							RecordAlarmCode(gun_index, "012288");
-							ChargingTerminalProcess(gun_index);
-						}
+//						else if (((chargingInfo[gun_index]->EvBatterytargetVoltage * 10) > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+//								(chargingInfo[gun_index]->PresentChargedDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
+//						{
+//							// UVP
+//							RecordAlarmCode(gun_index, "012288");
+//							ChargingTerminalProcess(gun_index);
+//						}
 						else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
 						{
 							// GFD 警告
@@ -5880,11 +5998,19 @@ int main(void)
 					if (isEvBoardStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (錯誤)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingAlarmProcess(gun_index);
 					}
 					else if (isEvBoardNormalStopChargeFlag(gun_index) == YES)
 					{
 						// 板端要求停止 (正常)
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
+						}
 						ChargingTerminalProcess(gun_index);
 					}
 					else if (OcppRemoteStop(gun_index) == YES ||
@@ -5907,6 +6033,11 @@ int main(void)
 				{
 					if (isModeChange(gun_index))
 					{
+						if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
+						{
+							strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
+						}
+
 						if (chargingInfo[gun_index]->SystemStatus == S_ALARM)
 						{
 							PRINTF_FUNC("================== S_ALARM (%x) ================ \n", gun_index);
@@ -5923,20 +6054,12 @@ int main(void)
 						{
 							PRINTF_FUNC("================== S_TERMINATING (%x) ================ \n", gun_index);
 						}
+
 						StopGunInfoTimeoutDet(gun_index);
 					}
 
 					if (chargingInfo[gun_index]->Type == _Type_Chademo)
 					{
-						// 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-						if (isEvStopCharging_chademo(gun_index) == YES)
-						{
-							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-							{
-								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
-							}
-						}
-
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
@@ -5951,15 +6074,6 @@ int main(void)
 					else if (chargingInfo[gun_index]->Type == _Type_GB)
 					{
 						//PRINTF_FUNC("************ GB lock Status = %d, status = %d \n", isEvStopCharging_gb(gun_index), isPrechargeStatus_gb(gun_index));
-						// 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-						if (isEvStopCharging_gb(gun_index) == YES)
-						{
-							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-							{
-								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
-							}
-						}
-
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
@@ -5973,15 +6087,6 @@ int main(void)
 					}
 					else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
 					{
-						// 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
-						if (isEvStopCharging_ccs(gun_index) == YES)
-						{
-							if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-							{
-								strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "Local");
-							}
-						}
-
 						if (chargingInfo[gun_index]->GroundFaultStatus == GFD_FAIL)
 						{
 							// GFD 錯誤停止
@@ -5994,12 +6099,6 @@ int main(void)
 						}
 					}
 
-					// 車端的停止
-					if (strcmp((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "") == EQUAL)
-					{
-						strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].StopReason, "EVDisconnected");
-					}
-
 					if (chargingInfo[gun_index]->SystemStatus == S_ALARM)
 					{
 						if(chargingInfo[gun_index]->ConnectorPlugIn == NO &&

+ 1 - 0
EVSE/Projects/Noodoe/Apps/Module_FactoryConfig.c

@@ -314,6 +314,7 @@ int main(int argc, char *argv[])
 	SysConfig.AthInterface.WifiDhcpClient = 0;	// 0: Enable	1: Disable
 
 	strcpy((char*)SysConfig.TelecomInterface.TelcomApn, "");
+	SysConfig.TelecomInterface.TelcomEnabled = 1; 	//0: disable, 1: enable
 	SysConfig.TelecomInterface.TelcomSimStatus = 0;	// SIM card status
 	SysConfig.TelecomInterface.TelcomModemMode = 0;	//0: No services	1: CDMA		2: GSM/GPRS	3: WCDMA	4: GSM/WCDMA	5: TD_SCDMA		6: Unknown
 

+ 14 - 18
EVSE/Projects/Noodoe/Apps/main.c

@@ -937,20 +937,17 @@ void InitEthernet()
 	//unsigned int address;
 
 	//Init Eth0 for internet
-	if(isInterfaceUp("eth0")==PASS)
-	{
-		memset(tmpbuf,0,256);
-		sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
-		system(tmpbuf);
-		memset(tmpbuf,0,256);
-		sprintf(tmpbuf,"route add default gw %s eth0 &",
-		ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
-		system(tmpbuf);
-		system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &");
-		system("ifconfig lo up &");
-	}
+	memset(tmpbuf,0,256);
+	sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up &",
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress,
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress);
+	system(tmpbuf);
+	memset(tmpbuf,0,256);
+	sprintf(tmpbuf,"route add default gw %s eth0 &",
+	ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
+	system(tmpbuf);
+	system("/sbin/ifconfig eth0:1 192.168.201.201 netmask 255.255.255.248 up &");
+	system("ifconfig lo up &");
 
 	if(isInterfaceUp("eth1")==PASS)
 	{
@@ -1273,7 +1270,7 @@ void get_firmware_version(unsigned char gun_index)
 	strcpy((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev, ShmCharger->gun_info[gun_index].ver.Version_FW);
 
 	// Get CSU root file system version
-	sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "V0.46.00.0000.00");
+	sprintf((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev, "V0.47.00.0000.00");
 
 	// Get AC connector type from model name
 	for(uint8_t idx=0;idx<3;idx++)
@@ -2591,9 +2588,8 @@ int main(void)
 						{
 							case START_METHOD_RFID:
 								if((ShmOCPP16Data->SpMsg.bits.AuthorizeConf) ||
-								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE)) ||
-								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST) && (strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") == 0)) ||
-								   (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_NOCHARGE))
+								   (!ShmOCPP16Data->OcppConnStatus && ((ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_FREE) || (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_NOCHARGE))) ||
+								   (!ShmOCPP16Data->OcppConnStatus && (ShmSysConfigAndInfo->SysConfig.OfflinePolicy == OFF_POLICY_LOCALLIST) && (strcmp((char *)&ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") == 0)))
 								{
 									DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status: %s \n", ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
 

二进制
EVSE/Projects/Noodoe/Images/ramdisk.gz


+ 1 - 1
EVSE/Projects/define.h

@@ -1,4 +1,4 @@
-#ifndef	DEFINE_H_
+#ifndef	DEFINE_H_
 #define	DEFINE_H_
 
 /**************************************************************************************/

+ 9 - 0
EVSE/rootfs/etc/logrotate.d/evse

@@ -8,3 +8,12 @@
         copytruncate
 }
 
+/var/log/**/*.log{
+	daily
+        rotate 3
+        size 3M
+        missingok
+        compress
+        notifempty
+        copytruncate
+}

部分文件因为文件数量过多而无法显示