Nove ovladani preruseni, zprehledneni kodu.
This commit is contained in:
138
src/SigLed.cpp
138
src/SigLed.cpp
@@ -1,69 +1,64 @@
|
||||
// Obsluha LED signalizace
|
||||
#include <Arduino.h>
|
||||
#include "SigLed.h"
|
||||
#include <Arduino.h>
|
||||
#include <CriticalSection.hpp>
|
||||
|
||||
SigLED::SigLED(int pin, int ledon, int ledoff)
|
||||
{
|
||||
: _pin(pin), _ledon(ledon), _ledoff(ledoff), _state(LS_NOTINITIALIZED)
|
||||
{}
|
||||
|
||||
_pin = pin;
|
||||
_ledon = ledon;
|
||||
_ledoff = ledoff;
|
||||
_state = LS_NOTINITIALIZED;
|
||||
}
|
||||
|
||||
void SigLED::rtLed(void)
|
||||
void SigLED::rtLed()
|
||||
{
|
||||
|
||||
switch (_state) {
|
||||
case LS_RUN: {
|
||||
uint8_t instr;
|
||||
case LS_RUN: {
|
||||
uint8_t instr;
|
||||
|
||||
if (NULL != _signal)
|
||||
instr = *_ptr; // instrukce
|
||||
else if (NULL != _psignal)
|
||||
instr = pgm_read_byte(_pptr);
|
||||
else
|
||||
instr = LEDS_STOP;
|
||||
switch (instr & 0xc0) {
|
||||
case LEDS_ONFOR:
|
||||
digitalWrite(_pin, _ledon);
|
||||
_timer = 10ul * ((instr & 0x3F) + 1);
|
||||
_state = LS_WAIT;
|
||||
if (_signal)
|
||||
instr = *_ptr; // instrukce
|
||||
else if (_psignal)
|
||||
instr = pgm_read_byte(_pptr);
|
||||
else
|
||||
instr = LEDS_STOP;
|
||||
switch (instr & 0xc0) {
|
||||
case LEDS_ONFOR:
|
||||
digitalWrite(_pin, _ledon);
|
||||
_timer = 10ul * ((instr & 0x3F) + 1);
|
||||
_state = LS_WAIT;
|
||||
break;
|
||||
|
||||
case LEDS_OFFFOR:
|
||||
digitalWrite(_pin, _ledoff);
|
||||
_timer = 10ul * ((instr & 0x3F) + 1);
|
||||
_state = LS_WAIT;
|
||||
break;
|
||||
|
||||
case LEDS_STOP:
|
||||
_state = LS_IDLE;
|
||||
break;
|
||||
|
||||
case LEDS_RESTART:
|
||||
_ptr = _signal;
|
||||
_pptr = _psignal;
|
||||
break;
|
||||
}
|
||||
} break;
|
||||
|
||||
case LS_WAIT:
|
||||
--_timer;
|
||||
if (0 == _timer) {
|
||||
_state = LS_RUN;
|
||||
++_ptr;
|
||||
++_pptr;
|
||||
}
|
||||
break;
|
||||
|
||||
case LEDS_OFFFOR:
|
||||
digitalWrite(_pin, _ledoff);
|
||||
_timer = 10ul * ((instr & 0x3F) + 1);
|
||||
_state = LS_WAIT;
|
||||
default:
|
||||
break;
|
||||
|
||||
case LEDS_STOP:
|
||||
_state = LS_IDLE;
|
||||
break;
|
||||
|
||||
case LEDS_RESTART:
|
||||
_ptr = _signal;
|
||||
_pptr = _psignal;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case LS_WAIT:
|
||||
--_timer;
|
||||
if (0 == _timer) {
|
||||
_state = LS_RUN;
|
||||
++_ptr;
|
||||
++_pptr;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SigLED::_init(void)
|
||||
void SigLED::prepare()
|
||||
{
|
||||
|
||||
pinMode(_pin, OUTPUT);
|
||||
@@ -72,47 +67,58 @@ void SigLED::_init(void)
|
||||
_handler.attach_ms(10, lh, this);
|
||||
}
|
||||
|
||||
void SigLED::set(const uint8_t *signal)
|
||||
void SigLED::set(const uint8_t * signal)
|
||||
{
|
||||
|
||||
if (LS_NOTINITIALIZED == _state)
|
||||
_init();
|
||||
noInterrupts();
|
||||
prepare();
|
||||
|
||||
CriticalSection cs;
|
||||
_signal = signal;
|
||||
_ptr = _signal;
|
||||
_psignal = NULL;
|
||||
_psignal = nullptr;
|
||||
_state = LS_RUN;
|
||||
interrupts();
|
||||
}
|
||||
|
||||
void SigLED::set_P(PGM_P signal)
|
||||
{
|
||||
|
||||
if (LS_NOTINITIALIZED == _state)
|
||||
_init();
|
||||
noInterrupts();
|
||||
prepare();
|
||||
|
||||
CriticalSection cs;
|
||||
_psignal = signal;
|
||||
_pptr = _psignal;
|
||||
_signal = NULL;
|
||||
_signal = nullptr;
|
||||
_state = LS_RUN;
|
||||
interrupts();
|
||||
}
|
||||
|
||||
void SigLED::start(void)
|
||||
void SigLED::setup()
|
||||
{
|
||||
|
||||
if (LS_NOTINITIALIZED == _state)
|
||||
_init();
|
||||
noInterrupts();
|
||||
prepare();
|
||||
|
||||
CriticalSection cs;
|
||||
_ptr = _signal;
|
||||
_pptr = _psignal;
|
||||
_state = LS_RUN;
|
||||
interrupts();
|
||||
}
|
||||
|
||||
void SigLED::lh(SigLED *ptr)
|
||||
void SigLED::lh(SigLED * ptr)
|
||||
{
|
||||
|
||||
SigLED *pled = ptr;
|
||||
SigLED * pled = ptr;
|
||||
pled->rtLed();
|
||||
}
|
||||
|
||||
void SigLED::setInvert(bool invert)
|
||||
{
|
||||
|
||||
if (_invert != invert) {
|
||||
_invert = invert;
|
||||
int temp = _ledon;
|
||||
_ledon = _ledoff;
|
||||
_ledoff = temp;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user