#include "bsp/gpio.h" #include "app/sox/measure.h" #include "libs/shark_task.h" #include "state.h" #include "iostate.h" static bms_state_t _bms_state; struct means_task { shark_task_t _task; u32 delay; u8 index; }; static void init_pack_current_task(void); static void init_cell_task(void); static void init_temp_task(void); void bms_state_init(void){ measure_system_init(); adc_select_for_pack_current(CS1180_ADC); init_pack_current_task(); init_cell_task(); init_temp_task(); io_state_init(); } bms_state_t * bms_state_get(void){ return &_bms_state; } /***********************************************************************/ static struct means_task _pack_current_task; static u32 pack_current_task_handler(void); static void init_pack_current_task(void){ _pack_current_task._task.handler = pack_current_task_handler; _pack_current_task.delay = 60; _pack_current_task.index = 0; shark_task_add(&_pack_current_task._task); } static u32 pack_current_task_handler(void){ _bms_state.load_current = get_pack_current(); return _pack_current_task.delay; } /***********************************************************************/ static struct means_task _cell_task; static u32 cell_task_handler(void); static void init_cell_task(void){ _cell_task._task.handler = cell_task_handler; _cell_task.delay = 60; _cell_task.index = 0; shark_task_add(&_cell_task._task); } static u32 cell_task_handler(void){ _bms_state.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index); _cell_task.index = (_cell_task.index + 1) % CELLS_NUM; return _cell_task.delay; } /***********************************************************************/ static struct means_task _temp_task; static u32 temp_task_handler(void); static void init_temp_task(void){ _temp_task._task.handler = temp_task_handler; _temp_task.delay = 5 * 1000; _temp_task.index = 0; _bms_state.pcb_temp = 0xFF; _bms_state.pack_temp[0] = 0xFF; _bms_state.pack_temp[1] = 0xFF; _bms_state.pack_temp[2] = 0xFF; shark_task_add(&_temp_task._task); } static u32 temp_task_handler(void){ switch(_temp_task.index) { case 0: _bms_state.pcb_temp = get_pcb_temperature(); break; case 1: case 2: case 3: _bms_state.pack_temp[_temp_task.index - 1] = get_pack_temperature(_temp_task.index - 1); break; default: break; } _temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM + 1); if (_bms_state.pack_temp[0] == 0xFF || _bms_state.pack_temp[0] == 0xFF || _bms_state.pack_temp[1] == 0xFF || _bms_state.pack_temp[2] == 0xFF){ return 0;//read all temps ASAP } return _temp_task.delay; }