state.c 2.5 KB

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