app_charge.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "usr_config.h"
  2. #include "bsp_time.h"
  3. #include "system.h"
  4. #include "hal_led.h"
  5. #include "nrf_gpio.h"
  6. #include "hal_ble_client.h"
  7. #include "hal_ble_host.h"
  8. #include "app_charge.h"
  9. #include "app_flash.h"
  10. #include "hal_battery.h"
  11. #include "hal_ble_uart0.h"
  12. #include "ble_comm.h"
  13. /************************ 函数声明 ***********************************/
  14. void app_charge_Process(void);
  15. void cb_BLE_Client_T_CHARGE(void* handle);
  16. /************************ 变量 ***********************************/
  17. static uint8_t app_charge_state = BLE_CHARGE_PULLOUT;
  18. /********************************************************/
  19. uint8_t app_charge_Getstate(void)
  20. {
  21. return app_charge_state;
  22. }
  23. void send_charge(void)
  24. {
  25. static uint8_t sbuf[2];
  26. uint8_t L = 0;
  27. if(mFlash.isHost) sbuf[L++] = 0;
  28. else sbuf[L++] = 1;
  29. sbuf[L++] = app_charge_state;
  30. BLE_Client_Tx_Send(0,BLE_CHARGE,sbuf,L);
  31. }
  32. void cb_BLE_Client_R_CHARGE(void* handle)
  33. {
  34. BLE_Client_Rx_t* target = handle;
  35. send_charge();
  36. BLE_Host_Tx_Send(0,BLE_CHARGE,target->pDat,target->datLen);
  37. }
  38. void cb_BLE_Host_R_CHARGE(void* handle)
  39. {
  40. BLE_Host_Rx_t* target = handle;
  41. BLE_Client_Tx_Send(0,BLE_CHARGE,target->pDat,target->datLen);
  42. // SEGGER_RTT_printf(0,"cb_BLE_Host_R_CHARGE:%d,%d,%d\n",target->pDat[0],target->pDat[1],target->datLen);
  43. }
  44. void cb_BLE_Client_T_CHARGE(void* handle)
  45. {
  46. SEGGER_RTT_printf(0,"cb_BLE_Client_T_CHARGE\n");
  47. }
  48. void app_charge_Vol_Send(BLE_CMD_n cmd)
  49. {
  50. uint8_t buf[32];
  51. uint8_t L = 0;
  52. buf[L++] = GetBatteryPersent();
  53. if(mFlash.isHost)BLE_Host_Tx_Send(0,cmd,buf,L);
  54. else BLE_Client_Tx_Send(0,cmd,buf,L);
  55. }
  56. static uint8_t OtherShoesVol = 0;
  57. void cb_BLE_CLient_R_CHAR_VOL(void* handle)
  58. {
  59. UART0_Rx_t* target = handle;
  60. OtherShoesVol = target->pDat[0];
  61. // SEGGER_RTT_printf(0,"OtherShoesVol=%d\n",OtherShoesVol);
  62. }
  63. static void app_charge_Process(void)
  64. {
  65. uint8_t client_connect =0;
  66. uint8_t host_connect =0;
  67. static uint8_t ResponseFlag =0;
  68. app_charge_Vol_Send(BLE_CHAR_VOL); //共享充电电量
  69. uint32_t ch = nrf_gpio_pin_read(PIN_CHARGING);
  70. //进入充电状态
  71. client_connect = slave_isconnect();
  72. if(mFlash.isHost){
  73. host_connect = host_isconnect();
  74. }
  75. else{
  76. host_connect = slave_isconnect();
  77. }
  78. // SEGGER_RTT_printf(0,"charge state:%d\n",ch);
  79. if(!ch){ //没充电
  80. if(app_charge_state!=BLE_CHARGE_PULLOUT){ SEGGER_RTT_printf(0,"charge out...\n");
  81. app_charge_state = BLE_CHARGE_PULLOUT;
  82. Process_SetHoldOn(app_charge_Process,0);
  83. LED_Stop(LED_CHARGE);
  84. if(client_connect){
  85. ResponseFlag = 0;
  86. send_charge();
  87. }
  88. else ResponseFlag =1;
  89. }
  90. return;
  91. }
  92. if(host_connect && GetBatteryPersent()>=100 && OtherShoesVol>=100){ //充满
  93. if(app_charge_state!=BLE_CHARGE_DONE){ SEGGER_RTT_printf(0,"charge done:%d...\n",OtherShoesVol);
  94. app_charge_state = BLE_CHARGE_DONE;
  95. Process_SetHoldOn(app_charge_Process,1);
  96. LED_Start(LED_CHARGE,COLOR_GREEN);
  97. send_charge();
  98. }
  99. }else{ //正在充电
  100. if(app_charge_state!=BLE_CHARGE_INSERT){ SEGGER_RTT_printf(0,"charge in...\n");
  101. app_charge_state = BLE_CHARGE_INSERT;
  102. Process_SetHoldOn(app_charge_Process,1);
  103. LED_Start(LED_CHARGE,COLOR_ORANGE);
  104. if(client_connect){
  105. send_charge();
  106. ResponseFlag = 0;
  107. }
  108. else ResponseFlag =1;
  109. }
  110. }
  111. if(client_connect && ResponseFlag){
  112. ResponseFlag =0;
  113. send_charge();
  114. }
  115. }
  116. static void app_charge_monitor_battery_charge_data_process(void)
  117. {
  118. #define BATTERY_VOL_THRESHOLD_MIN 2500 //2.5V
  119. #define BATTERY_VOL_THRESHOLD_MAX 4000 //4V
  120. #define CHARGE_VOL_THRESHOLD 80 //充电前和充电期间的充电电压变化值,单位mv
  121. //监测电池和充电数据
  122. int16_t bat_vol;
  123. int16_t charge_vol;
  124. int16_t charge_threshold;
  125. uint32_t ch = nrf_gpio_pin_read(PIN_CHARGING);
  126. static uint32_t charge_cycle = 50;
  127. static int16_t before_charge_vol; //充电前的电压值
  128. static int16_t charge_vol_max; //充电期间最大的电压值
  129. if(!ch)//没充电
  130. {
  131. charge_vol = ADC_RESULT_IN_MILLI_VOLTS(ADC_GetValue(PIN_ADC_CHARGMEASURE_CHANNEL));
  132. before_charge_vol = before_charge_vol > charge_vol ? charge_vol : before_charge_vol;
  133. charge_vol_max = 0;
  134. charge_cycle = 50;
  135. }else //充电
  136. {
  137. /* 过筛50轮 */
  138. if(charge_cycle != 0){
  139. charge_vol = ADC_RESULT_IN_MILLI_VOLTS(ADC_GetValue(PIN_ADC_CHARGMEASURE_CHANNEL));
  140. charge_vol_max = charge_vol_max < charge_vol ? charge_vol : charge_vol_max;
  141. charge_cycle--;
  142. return;
  143. }
  144. charge_vol = ADC_RESULT_IN_MILLI_VOLTS(ADC_GetValue(PIN_ADC_CHARGMEASURE_CHANNEL));
  145. charge_vol_max = charge_vol_max < charge_vol ? charge_vol : charge_vol_max;
  146. bat_vol = ADC_RESULT_IN_MILLI_VOLTS(ADC_GetValue(PIN_ADC_BAT_CHANNEL))*5/3;
  147. //当电池电量没满,充电(经测试,电量没满的充电电压跟电池电压有关,最小充电电压100+mv)
  148. charge_threshold = charge_vol_max - before_charge_vol; //充电前和充电期间的充电电压变化值
  149. // DEBUG_LOG("charge_threshold:%d,%d,%d,bat:%d\n",charge_threshold,ob_monitor.charge_vol_max,ob_monitor.before_charge_vol,bat_vol);
  150. if(charge_threshold < CHARGE_VOL_THRESHOLD)
  151. {
  152. Except_SetExceptype(EXCEPT_DATA_CHARGE);
  153. Except_TxError(EXCEPT_DATA_CHARGE,"except_charging_chip");
  154. }
  155. else
  156. {
  157. Except_ClearExceptype(EXCEPT_DATA_CHARGE);
  158. }
  159. //电池小于2.5V或充电电压变化小于阈值且电池电压大于4V
  160. if(bat_vol <= BATTERY_VOL_THRESHOLD_MIN || (charge_threshold < CHARGE_VOL_THRESHOLD && bat_vol > BATTERY_VOL_THRESHOLD_MAX))
  161. {
  162. Except_SetExceptype(EXCEPT_DATA_BATTERY);
  163. Except_TxError(EXCEPT_DATA_BATTERY,"except_battery");
  164. }
  165. else
  166. {
  167. Except_ClearExceptype(EXCEPT_DATA_BATTERY);
  168. }
  169. }
  170. }
  171. void app_charge_Init(void)
  172. {
  173. nrf_gpio_cfg_input(PIN_CHARGING,NRF_GPIO_PIN_NOPULL);
  174. if(mFlash.isHost)
  175. BLE_Host_Rx_Regist(BLE_CHAR_VOL,cb_BLE_CLient_R_CHAR_VOL);
  176. else
  177. BLE_Client_Rx_Regist(BLE_CHAR_VOL,cb_BLE_CLient_R_CHAR_VOL);
  178. BLE_Client_Rx_Regist(BLE_CHARGE,cb_BLE_Client_R_CHARGE);
  179. BLE_Host_Rx_Regist(BLE_CHARGE,cb_BLE_Host_R_CHARGE);
  180. Process_Start(1000,"app_charge",app_charge_Process);
  181. app_charge_Process();
  182. Process_Start(10,"app_charge_monitor_battery_charge_data_process",app_charge_monitor_battery_charge_data_process);
  183. }