From ceac2ece33475598f81d4bef4ed9a15483ff9f00 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Tue, 16 Feb 2016 16:23:59 +0100 Subject: [PATCH] change led implementation --- src/hmi.cpp | 128 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 38 deletions(-) diff --git a/src/hmi.cpp b/src/hmi.cpp index f4be484..89be24f 100644 --- a/src/hmi.cpp +++ b/src/hmi.cpp @@ -95,7 +95,8 @@ private: }; class SwitchPort1 : public SwitchPort { public: - SwitchPort1(uint16_t bit) : SwitchPort(), m_bit(bit) { + SwitchPort1(uint16_t bit) : SwitchPort() { + m_bit = bit; P1REN |= bit; P1DIR &= ~bit; P1SEL &= ~bit; @@ -107,58 +108,117 @@ private: uint16_t m_bit; }; +class Led { +public: + enum e_flashType { FLASH_SHORT, FLASH_LONG }; + Led() : m_state(STATE_IDLE), m_timeout(0) { + } + void start(e_flashType ft) { + m_state = STATE_START; + if (FLASH_LONG == ft) { + m_timeout = LED_WAIT_TIME_LONG; + } else { + m_timeout = LED_WAIT_TIME_SHORT; + } + } + virtual void set(bool v) {}; + void exec() { + switch (m_state) { + case STATE_IDLE: + break; + case STATE_START: + set(true); + m_state = STATE_ON; + break; + case STATE_ON: + if (m_timeout == 0) { + m_state = STATE_OFF; + } + m_timeout--; + break; + case STATE_OFF: + set(false); + m_state = STATE_IDLE; + break; + default: + m_state = STATE_IDLE; + break; + } + } +private: + enum e_state { STATE_IDLE, STATE_START, STATE_ON, STATE_OFF }; + e_state m_state; + uint32_t m_timeout; +}; +class Led1 : Led { +public: + Led1(uint16_t bit) : Led() { + m_bit = bit; + P1DIR |= bit; + P1OUT &= ~bit; + } + virtual void set(bool v) { + if (v) { + P1OUT |= m_bit; + } else { + P1OUT &= ~m_bit; + } + } +private: + uint16_t m_bit; +}; +class Led2 : Led { +public: + Led1(uint16_t bit) : Led() { + m_bit = bit; + P2DIR |= bit; + P2OUT &= ~bit; + } + virtual void set(bool v) { + if (v) { + P2OUT |= m_bit; + } else { + P2OUT &= ~m_bit; + } + } +private: + uint16_t m_bit; +}; + SwitchPort2 intensitySwitch = SwitchPort2(BIT1); - SwitchPort2 onTimeSwitch = SwitchPort2(BIT2); - SwitchPort2 offTimeSwitch = SwitchPort2(BIT3); //SwitchPort modeSwitch = SwitchPort2(BIT4); +Led1 ledGreen = Led1(BIT5); +Led1 ledRed = Led1(BIT4); + uint16_t intensity = 0; uint16_t maxIntensity = 0; uint16_t intensityStep = 0; const uint16_t intensityStepCnt = 16; -void hmiLedGreenOn() { - P1OUT |= BIT4; -} -void hmiLedRedOn() { - P1OUT |= BIT5; -} -void hmiLedGreenOff() { - P1OUT &= ~BIT4; -} -void hmiLedRedOff() { - P1OUT &= ~BIT5; -} void hmiInit() { maxIntensity = engineMaxPwmValue(); intensityStep = maxIntensity / intensityStepCnt; - - P1DIR |= BIT4 | BIT5; - P1OUT &= ~(BIT4 | BIT5); } void hmiExec() { - static uint32_t ledWait = 0; - if (intensitySwitch.get() == SwitchPort::SWITCH_SHORT) { intensity += intensityStep; if (intensity > maxIntensity) { intensity = maxIntensity; } - hmiLedGreenOn(); - ledWait = LED_WAIT_TIME; + ledGreen.start(Led::FLASH_SHORT); debugWrite(intensity); engineSetPwmValue(intensity); } else if (intensitySwitch.get() == SwitchPort::SWITCH_LONG) { if (intensity != 0) { intensity -= intensityStep; } - hmiLedRedOn(); - ledWait = LED_WAIT_TIME; + ledRed.start(Led::FLASH_SHORT); debugWrite(intensity); engineSetPwmValue(intensity); } @@ -166,28 +226,20 @@ void hmiExec() { if (onTimeSwitch.get() == SwitchPort::SWITCH_SHORT) { engineIncOnTime(); - hmiLedGreenOn(); - ledWait = LED_WAIT_TIME; + ledGreen.start(Led::FLASH_SHORT); } else if (onTimeSwitch.get() == SwitchPort::SWITCH_LONG) { engineDecOnTime(); - hmiLedRedOn(); - ledWait = LED_WAIT_TIME; + ledRed.start(Led::FLASH_SHORT); } if (offTimeSwitch.get() == SwitchPort::SWITCH_SHORT) { engineIncOffTime(); - hmiLedGreenOn(); - ledWait = LED_WAIT_TIME; + ledGreen.start(Led::FLASH_SHORT); } else if (onTimeSwitch.get() == SwitchPort::SWITCH_LONG) { engineDecOffTime(); - hmiLedRedOn(); - ledWait = LED_WAIT_TIME; + ledRed.start(Led::FLASH_SHORT); } - if (ledWait != 0) { - ledWait--; - } else { - hmiLedGreenOff(); - hmiLedRedOff(); - } + ledRed.exec(); + ledGreen.exec(); }