A FSM Implementation

typedef void(*functionPointer)();
typedef functionPointer(*State)();

State idle(Battery *const battery);
State start(Battery *const battery);
State measure(Battery *const battery);
State estimate_soc(Battery *const battery);
State compute_resistance(Battery *const battery);
State compute_capacity(Battery *const battery);
State balancing(Battery *const battery);
State send_data(Battery *const battery);
State shutdown(Battery *const battery);
#endif /* FSM_H_ */

 

 

 // Set state to idle
  State currentState = idle;
  led_flash(IDLE);

  while (1)
  {
   currentState = (State)currentState(r_battery);
  }


State idle(Battery *const battery){
  HAL_UART_Receive_IT(&huart3, UART_receive_buffer, RX_BUFFER_LENGTH);
  
  if(restart_charge){
    HAL_TIM_Base_Stop_IT(&htim3);
    battery->is_charging = true;
    return start;
  } else if(restart_discharge){
      HAL_TIM_Base_Stop_IT(&htim3);
      battery->is_charging = false;  
      discharge_led();
      return start;
  } 

  restart_charge = false;
  restart_discharge = false;
  tx_data = false;

  return idle;
}

State start(Battery *const battery){

  start_cycle();

  led_flash(START);

  // Initialise the SoC estimation model 
  init_soc_model(); 

  // Set under and over voltage thresholds
  set_UV_OV_threshold();

  turn_off_balancing(battery);

    // Add 1s delay
  HAL_Delay(1000);

    if(restart_charge) {
      battery->is_charging = true;
      restart_charge = false;
      return start;
  } else if(restart_discharge){
      battery->is_charging = false; 
      restart_discharge = false;
      return start;
  } else if (tx_data) {
      return send_data;
  } else {
      return measure;
  }
}

 

posted on 2020-10-14 16:32  荷树栋  阅读(204)  评论(0编辑  收藏  举报

导航