158 lines
3.4 KiB
C++
158 lines
3.4 KiB
C++
/**** 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 ***/
|