Files
uDCCD/firmware/src/main.cpp
2024-04-13 14:20:45 +03:00

127 lines
3.0 KiB
C++

/**** Includes ****/
#include "utils/utils.h"
#include "hw/devices.h"
#include "logic/button_force.h"
#include "logic/dccd_force.h"
#include "logic/cfg_mem.h"
/**** Private definitions ****/
/**** Private constants ****/
static const uint16_t dsp_lock_bmode = 1000;
static const uint16_t dsp_lock_force = 50;
/**** Private variables ****/
static logic::CfgMemory cfg_mem = logic::CfgMemory();
static logic::ButtonForce button_force = logic::ButtonForce(&btn_up, &btn_down);
static logic::DccdForce dccd_force = logic::DccdForce(&btn_mode, &sw_hbrake, &sw_brakes);
/**** Private function declarations ****/
/**** Public function definitions ****/
int main(void)
{
// HW setup
devices_init();
// Read saved config
cfg_mem.init();
#ifdef OVERRIDE_CONFIG
cfg_mem.btn_force = 0;
cfg_mem.bmode = 0;
cfg_mem.pot_mode = 0;
cfg_mem.dsp_brigth = 100;
cfg_mem.dsp_dimm = 50;
cfg_mem.brake_force = 100;
cfg_mem.max_hbrake_time = 1000;
cfg_mem.lock_current = 4200;
cfg_mem.max_out_voltage = 6500;
cfg_mem.min_out_voltage = 500;
cfg_mem.save_all();
#endif
uint8_t user_force = 0;
ccout.max_voltage = cfg_mem.max_out_voltage;
ccout.min_voltage = cfg_mem.min_out_voltage;
button_force.force = cfg_mem.btn_force;
dccd_force.brake_mode = cfg_mem.bmode;
dccd_force.max_hbrake_time = cfg_mem.max_hbrake_time;
dccd_force.brake_force = cfg_mem.brake_force;
// Super loop
while(1)
{
// Update inputs
devices_update_inputs();
// Update user setting
button_force.update();
// Select user force input
if(cfg_mem.pot_mode) user_force = pot.percent;
else user_force = button_force.force;
// Calculate next target force
dccd_force.update(user_force);
// Override force in case of fault
if((sup_fuse.fault)||(out_fuse.fault)) dccd_force.force = 0;
// Convert force to current
ccout.max_current = util::percent_of(dccd_force.force, cfg_mem.lock_current);
// Execute outputs
ccout.update();
// Set display
if(dccd_force.is_new_bmode)
{
uint8_t bmode_img = 0x03;
switch(dccd_force.brake_mode)
{
case 1:
bmode_img = 0x0C;
break;
case 2:
bmode_img = 0x30;
break;
default:
bmode_img = 0x03;
break;
}
display.write(bmode_img);
display.set_lock(dsp_lock_bmode);
dccd_force.is_new_bmode = 0;
}
else if((button_force.is_new)&&(cfg_mem.pot_mode==0))
{
display.show_percent(dccd_force.force, hw::DisplayLed::LED_DSP_DOT10);
display.set_lock(dsp_lock_force);
button_force.is_new = 0;
}
else if(display.locked==0) display.show_percent(dccd_force.force, hw::DisplayLed::LED_DSP_DOT10);
// Process dimm
if(sw_dimm.state == hw::BUTTON_ON) display.set_brigthness(cfg_mem.dsp_dimm);
else display.set_brigthness(cfg_mem.dsp_brigth);
// Save user setting changes
cfg_mem.btn_force = button_force.force;
cfg_mem.bmode = dccd_force.brake_mode;
cfg_mem.save();
continue; // End of super loop
}
// Escape the matrix
return 0;
}
/**** Private function definitions ***/