Continued work
This commit is contained in:
157
firmware/src/hw/led_display.cpp
Normal file
157
firmware/src/hw/led_display.cpp
Normal file
@@ -0,0 +1,157 @@
|
||||
/**** Includes ****/
|
||||
#include "../utils/utils.h"
|
||||
#include "led_display.h"
|
||||
|
||||
using namespace hw;
|
||||
|
||||
/**** Private definitions ****/
|
||||
/**** Private constants ****/
|
||||
/**** Private variables ****/
|
||||
/**** Private function declarations ****/
|
||||
/**** Public function definitions ****/
|
||||
hw::LedDisplay::LedDisplay(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
hw::LedDisplay::~LedDisplay(void)
|
||||
{
|
||||
this->force(0x00);
|
||||
this->write_backlight(0);
|
||||
}
|
||||
|
||||
void hw::LedDisplay::init(doutCfg_t* dout_chs, uint8_t act_lvl, util::VCounter* timer, bsp::PwmOut* pwm_ch)
|
||||
{
|
||||
this->led0_dout_ch = dout_chs->led0_dout_ch;
|
||||
this->led1_dout_ch = dout_chs->led1_dout_ch;
|
||||
this->led2_dout_ch = dout_chs->led2_dout_ch;
|
||||
this->led3_dout_ch = dout_chs->led3_dout_ch;
|
||||
this->led4_dout_ch = dout_chs->led4_dout_ch;
|
||||
this->led5_dout_ch = dout_chs->led5_dout_ch;
|
||||
|
||||
if(act_lvl) this->act_lvl = 1;
|
||||
else this->act_lvl = 0;
|
||||
|
||||
this->timer = timer;
|
||||
|
||||
this->pwm_ch = pwm_ch;
|
||||
|
||||
this->on_time = 0;
|
||||
this->period = 0;
|
||||
this->cycle_cnt = 0;
|
||||
this->cycle_limit = 0;
|
||||
this->timestamp_start = 0;
|
||||
|
||||
this->force(0x00);
|
||||
this->write_backlight(0);
|
||||
}
|
||||
|
||||
void hw::LedDisplay::force(uint8_t image)
|
||||
{
|
||||
uint8_t led_state;
|
||||
|
||||
if(image&0x01) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led0_dout_ch);
|
||||
|
||||
if(image&0x02) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led1_dout_ch);
|
||||
|
||||
if(image&0x04) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led2_dout_ch);
|
||||
|
||||
if(image&0x08) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led3_dout_ch);
|
||||
|
||||
if(image&0x10) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led4_dout_ch);
|
||||
|
||||
if(image&0x20) led_state = 1;
|
||||
else led_state = 0;
|
||||
this->set_single_led(led_state, this->led5_dout_ch);
|
||||
}
|
||||
|
||||
void hw::LedDisplay::write(uint8_t image)
|
||||
{
|
||||
// Static mode
|
||||
this->on_time = 1;
|
||||
this->period = 0;
|
||||
this->cycle_cnt = 0;
|
||||
this->cycle_limit = 0;
|
||||
this->timestamp_start = 0;
|
||||
|
||||
// Set initial state
|
||||
this->force(image);
|
||||
}
|
||||
|
||||
void hw::LedDisplay::write(uint8_t image, uint16_t on_time, uint16_t period, uint8_t cycle_limit)
|
||||
{
|
||||
// "PWM" mode
|
||||
this->on_time = on_time;
|
||||
this->period = period;
|
||||
this->cycle_cnt = 0;
|
||||
this->cycle_limit = cycle_limit;
|
||||
|
||||
// Set initial state
|
||||
if(this->on_time > 0) this->force(image);
|
||||
else this->force(0x00);
|
||||
|
||||
// Cycle start time
|
||||
this->timestamp_start = this->timer->read();
|
||||
}
|
||||
|
||||
void hw::LedDisplay::process(void)
|
||||
{
|
||||
if(this->period == 0) return; // Nothing to do
|
||||
|
||||
// Update cycle timing
|
||||
uint16_t ts_now = this->timer->read();
|
||||
uint16_t td = util::time_delta(this->timestamp_start, ts_now);
|
||||
uint32_t td_ms = this->timer->convert_ms(td);
|
||||
|
||||
if(td_ms >= this->period)
|
||||
{
|
||||
this->timestamp_start = ts_now;
|
||||
this->cycle_cnt++;
|
||||
};
|
||||
|
||||
// Check cycle limit
|
||||
if((this->cycle_cnt >= this->cycle_limit)&&(this->cycle_limit))
|
||||
{
|
||||
this->on_time = 0;
|
||||
this->period = 0;
|
||||
this->timestamp_start = 0;
|
||||
this->force(0x00);
|
||||
return;
|
||||
};
|
||||
|
||||
// Do output compare
|
||||
if(td_ms < this->on_time) this->force(this->image);
|
||||
else this->force(0x00);
|
||||
}
|
||||
|
||||
uint8_t hw::LedDisplay::is_cycle_end(void)
|
||||
{
|
||||
if(this->cycle_cnt >= this->cycle_limit) return 1;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
void hw::LedDisplay::write_backlight(uint8_t percent)
|
||||
{
|
||||
this->pwm_ch->write(percent);
|
||||
}
|
||||
|
||||
void hw::LedDisplay::set_single_led(uint8_t state, bsp::DigitalOut* led_ch)
|
||||
{
|
||||
uint8_t lvl = 0;
|
||||
|
||||
if(((state==0)&&(this->act_lvl==0))||((state!=0)&&(this->act_lvl==1))) lvl = 1;
|
||||
|
||||
led_ch->write(lvl);
|
||||
}
|
||||
|
||||
/**** Private function definitions ***/
|
||||
Reference in New Issue
Block a user