127 lines
3.0 KiB
C++
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 ***/ |