diff --git a/library.json b/library.json new file mode 100644 index 0000000..95c0006 --- /dev/null +++ b/library.json @@ -0,0 +1,22 @@ +{ + "name":"SigLED", + "description":"Handle signalling LED easily", + "keywords":"signalling,indiaction,led", + "authors": + { + "name": "Pavel Brychta", + "maintainer": true + }, + "repository": + { + "type": "git", + "url": "http://git.xpablo.cz/xPablo.cz/SigLed" + }, + "version": "1.0.0", + "license": "MIT", + "frameworks": "arduino", + "platforms": "*", + "build": { + "libCompatMode": 2 + } +} diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..292ab5a --- /dev/null +++ b/library.properties @@ -0,0 +1,9 @@ +name=SigLED +version=1.0.0 +author=Pavel Brychta +maintainer=Pavel Brychta +sentence=Handle signalling LED easily +paragraph=Handle signalling LED easily +category=Other +url=http://git.xpablo.cz/xPablo.cz/SigLed +architectures=* diff --git a/src/sigLed.cpp b/src/sigLed.cpp new file mode 100644 index 0000000..e71db0a --- /dev/null +++ b/src/sigLed.cpp @@ -0,0 +1,113 @@ +// Obsluha LED signalizace +#include +#include "sigLed.h" + +SigLED::SigLED(int pin, int ledon, int ledoff) +{ + _pin = pin; + _ledon = ledon; + _ledoff = ledoff; +} + +void SigLED::rtLed(void) +{ + + switch (_state) + { + 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; + 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; + + default: + break; + } +} + +void SigLED::begin(void) +{ + + pinMode(_pin, OUTPUT); + digitalWrite(_pin, _ledoff); + _state = LS_IDLE; + _handler.attach_ms(10, lh, this); +} + +void SigLED::set(const uint8_t *signal) +{ + + noInterrupts(); + _signal = signal; + _ptr = _signal; + _psignal = NULL; + _state = LS_RUN; + interrupts(); +} + +void SigLED::set(PGM_P signal) +{ + noInterrupts(); + _psignal = signal; + _pptr = _psignal; + _signal = NULL; + _state = LS_RUN; + interrupts(); +} + +void SigLED::start() +{ + + noInterrupts(); + _ptr = _signal; + _pptr = _psignal; + _state = LS_RUN; + interrupts(); +} + +void SigLED::lh(SigLED *ptr) +{ + + SigLED *pled = ptr; + pled->rtLed(); +} diff --git a/src/sigLed.h b/src/sigLed.h new file mode 100644 index 0000000..8697e3a --- /dev/null +++ b/src/sigLed.h @@ -0,0 +1,72 @@ +/** + * @file sigLed.h + * @author Pavel Brychta, http://www.xpablo.cz + * + * Copyright (c) 2015,16 Pavel Brychta. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ +#ifndef _sigled_h_ +#define _sigled_h_ + +#include +#include + +typedef struct +{ + +}ledsignal_t; + +enum +{ + LEDS_ONFOR = 0x00, // rozsviti LED na delku, ktera je uvedena v nizsich 6-ti bitech (+1) [100ms], 0 znamena, ze se rozsviti na 100ms + LEDS_OFFFOR = 0x40, + LEDS_STOP = 0x80, + LEDS_RESTART = 0xc0 +}; + +class SigLED +{ +// typedef void (LED::*runtime)(void); + + protected: + int _pin; // pin, na kterem je LED pripojena + Ticker _handler; // obsluha LED signalizace + const uint8_t *_signal; // ukazatel na vzor signalizace + PGM_P _psignal; + const uint8_t *_ptr; // ukazatel na aktualne zpracovavane misto v signalizaci + PGM_P _pptr; + uint32_t _timer; // casovani + int _ledon; + int _ledoff; + enum + { + LS_IDLE, // klid, cekame na zmenu (zavolani set, nebo start) + LS_RUN, // bezi automat + LS_WAIT, // cekame v automatu + }_state; // stav automatu + public: + SigLED(int pin, int ledon, int ledoff); + void begin(void); + void set(const uint8_t *signal); +// void set(const __FlashStringHelper *signal); + void set(PGM_P signal); + void start(); +// static void lh(void *ptr); + static void lh(SigLED *ptr); + void rtLed(void); // vykonna metoda +}; +#endif