|
|
@@ -0,0 +1,41 @@
|
|
|
+#include "battery.h"
|
|
|
+#include "src/config.h"
|
|
|
+
|
|
|
+BatteryInfo battery_data[NUM_SLOTS];
|
|
|
+
|
|
|
+//Initialize battery struct
|
|
|
+void Battery_Init(){
|
|
|
+ for(uint8_t i=0; i<NUM_SLOTS; i++){
|
|
|
+ battery_data[i].slot_id = i;
|
|
|
+ battery_data[i].battery_state = STATE_EMPTY;
|
|
|
+ battery_data[i].battery_measurement.voltage = 0;
|
|
|
+ battery_data[i].battery_measurement.current = 0;
|
|
|
+ battery_data[i].battery_measurement.temperature = 0;
|
|
|
+ battery_data[i].battery_limits.min_voltage = 0;
|
|
|
+ battery_data[i].battery_limits.max_voltage = 0;
|
|
|
+ battery_data[i].battery_limits.cut_off_current = 0;
|
|
|
+ battery_data[i].battery_limits.capacitance = 0;
|
|
|
+ battery_data[i].battery_limits.charge_fraction = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void Battery_ReadState(uint8_t slot_id){
|
|
|
+ if(battery_data[slot_id].battery_limits.min_voltage==0 &&
|
|
|
+ battery_data[slot_id].battery_limits.max_voltage==0 &&
|
|
|
+ battery_data[slot_id].battery_limits.cut_off_current==0){
|
|
|
+ battery_data[slot_id].battery_state = STATE_WAITING_FOR_LIMITS;
|
|
|
+ }
|
|
|
+ else if(battery_data[slot_id].battery_measurement.voltage < BATTERY_THRESHOLD){
|
|
|
+ battery_data[slot_id].battery_state = STATE_EMPTY;
|
|
|
+ }
|
|
|
+ else if((battery_data[slot_id].battery_measurement.voltage >= BATTERY_THRESHOLD) &&
|
|
|
+ (battery_data[slot_id].battery_measurement.voltage < battery_data[slot_id].battery_limits.min_voltage)){
|
|
|
+ battery_data[slot_id].battery_state = STATE_BATTERY_DETECTED;
|
|
|
+ }
|
|
|
+ else if(battery_data[slot_id].battery_measurement.temperature > TEMPERATURE_MAX_C){
|
|
|
+ battery_data[slot_id].battery_state = STATE_OVERHEATING;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ battery_data[slot_id].battery_state = STATE_MEASUREMENT_IN_PROGRESS;
|
|
|
+ }
|
|
|
+}
|