state.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "bsp/gpio.h"
  2. #include "app/sox/sense_measure.h"
  3. #include "libs/shark_task.h"
  4. #include "state.h"
  5. static bms_state_t _bms_state;
  6. struct means_task {
  7. shark_task_t _task;
  8. u32 delay;
  9. u8 index;
  10. };
  11. static void init_pack_current_task(void);
  12. static void init_cell_task(void);
  13. static void init_temp_task(void);
  14. void bms_state_init(void){
  15. measure_system_init();
  16. init_pack_current_task();
  17. init_cell_task();
  18. init_temp_task();
  19. }
  20. bms_state_t * bms_state_get(void){
  21. return &_bms_state;
  22. }
  23. /***********************************************************************/
  24. static struct means_task _pack_current_task;
  25. static u32 pack_current_task_handler(void);
  26. static void init_pack_current_task(void){
  27. _pack_current_task._task.handler = pack_current_task_handler;
  28. _pack_current_task.delay = 60;
  29. _pack_current_task.index = 0;
  30. shark_task_add(&_pack_current_task._task);
  31. }
  32. static u32 pack_current_task_handler(void){
  33. _bms_state.load_current = get_pack_current();
  34. return _pack_current_task.delay;
  35. }
  36. /***********************************************************************/
  37. static struct means_task _cell_task;
  38. static u32 cell_task_handler(void);
  39. static void init_cell_task(void){
  40. _cell_task._task.handler = cell_task_handler;
  41. _cell_task.delay = 60;
  42. _cell_task.index = 0;
  43. shark_task_add(&_cell_task._task);
  44. }
  45. static u32 cell_task_handler(void){
  46. _bms_state.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index);
  47. _cell_task.index = (_cell_task.index + 1) % CELLS_NUM;
  48. return _cell_task.delay;
  49. }
  50. /***********************************************************************/
  51. static struct means_task _temp_task;
  52. static u32 temp_task_handler(void);
  53. static void init_temp_task(void){
  54. _temp_task._task.handler = temp_task_handler;
  55. _temp_task.delay = 5 * 1000;
  56. _temp_task.index = 0;
  57. _bms_state.pcb_temp = 0xFF;
  58. _bms_state.pack_temp[0] = 0xFF;
  59. _bms_state.pack_temp[1] = 0xFF;
  60. _bms_state.pack_temp[2] = 0xFF;
  61. shark_task_add(&_temp_task._task);
  62. }
  63. static u32 temp_task_handler(void){
  64. switch(_temp_task.index) {
  65. case 0:
  66. _bms_state.pcb_temp = get_pcb_temperature();
  67. break;
  68. case 1:
  69. case 2:
  70. case 3:
  71. _bms_state.pack_temp[_temp_task.index - 1] = get_pack_temperature(_temp_task.index - 1);
  72. break;
  73. default:
  74. break;
  75. }
  76. _temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM + 1);
  77. if (_bms_state.pack_temp[0] == 0xFF || _bms_state.pack_temp[0] == 0xFF || _bms_state.pack_temp[1] == 0xFF
  78. || _bms_state.pack_temp[2] == 0xFF){
  79. return 0;//read all temps ASAP
  80. }
  81. return _temp_task.delay;
  82. }