knx/src/knx_facade.h

339 lines
7.2 KiB
C
Raw Normal View History

2018-03-20 23:56:42 +01:00
#pragma once
2018-11-07 00:32:36 +01:00
2019-08-22 22:57:35 +02:00
#include "knx/bits.h"
2019-10-28 13:33:06 +01:00
// Set default medium type to TP if no external definitions was given
#ifndef MEDIUM_TYPE
#define MEDIUM_TYPE 0
#endif
2018-11-07 00:32:36 +01:00
#ifdef ARDUINO_ARCH_SAMD
2019-10-25 16:41:29 +02:00
#include "samd_platform.h"
#include "knx/bau07B0.h"
#include "knx/bau27B0.h"
2019-05-27 21:41:04 +02:00
#elif ARDUINO_ARCH_ESP8266
2019-10-25 16:41:29 +02:00
#include "esp_platform.h"
#include "knx/bau57B0.h"
#elif ARDUINO_ARCH_ESP32
2019-10-25 16:41:29 +02:00
#define LED_BUILTIN 13
#include "esp32_platform.h"
#include "knx/bau57B0.h"
2019-05-27 21:41:04 +02:00
#else
2019-10-25 16:41:29 +02:00
#define LED_BUILTIN 0
#include "linux_platform.h"
#include "knx/bau57B0.h"
#include "knx/bau27B0.h"
2018-11-07 00:32:36 +01:00
#endif
2018-03-20 23:56:42 +01:00
2019-08-22 22:57:35 +02:00
void buttonUp();
2018-09-04 21:12:50 +02:00
typedef uint8_t* (*saveRestoreCallback)(uint8_t* buffer);
2019-08-22 22:57:35 +02:00
template <class P, class B> class KnxFacade : private SaveRestore
2018-03-20 23:56:42 +01:00
{
2019-08-22 22:57:35 +02:00
friend void buttonUp();
public:
KnxFacade() : _platformPtr(new P()), _bauPtr(new B(*_platformPtr)), _bau(*_bauPtr)
2019-09-09 19:07:22 +02:00
{
manufacturerId(0xfa);
_bau.addSaveRestore(this);
}
2019-08-22 22:57:35 +02:00
virtual ~KnxFacade()
{
if (_bauPtr)
delete _bauPtr;
if (_platformPtr)
delete _platformPtr;
}
KnxFacade(B& bau) : _bau(bau)
{
manufacturerId(0xfa);
_bau.addSaveRestore(this);
}
P& platform()
{
return *_platformPtr;
}
B& bau()
{
return _bau;
}
bool enabled()
{
return _bau.enabled();
}
2019-08-22 22:57:35 +02:00
void enabled(bool value)
{
_bau.enabled(true);
}
2019-08-22 22:57:35 +02:00
bool progMode()
{
return _bau.deviceObject().progMode();
}
2019-08-22 22:57:35 +02:00
void progMode(bool value)
{
_bau.deviceObject().progMode(value);
}
2019-08-22 22:57:35 +02:00
bool configured()
{
return _bau.configured();
}
2019-05-27 21:41:04 +02:00
/**
* returns HIGH if led is active on HIGH, LOW otherwise
*/
2019-08-22 22:57:35 +02:00
uint32_t ledPinActiveOn()
{
return _ledPinActiveOn;
}
/**
* Sets if the programming led is active on HIGH or LOW.
*
* Set to HIGH for GPIO--RESISTOR--LED--GND or to LOW for GPIO--LED--RESISTOR--VDD
*/
2019-08-22 22:57:35 +02:00
void ledPinActiveOn(uint32_t value)
{
_ledPinActiveOn = value;
}
2019-08-22 22:57:35 +02:00
uint32_t ledPin()
{
return _ledPin;
}
2019-08-22 22:57:35 +02:00
void ledPin(uint32_t value)
{
_ledPin = value;
}
/**
* returns RISING if interrupt is created in a rising signal, FALLING otherwise
*/
uint32_t buttonPinInterruptOn()
{
return _buttonPinInterruptOn;
}
/**
* Sets if the programming button creates a RISING or a FALLING signal.
*
* Set to RISING for GPIO--BUTTON--VDD or to FALLING for GPIO--BUTTON--GND
*/
void buttonPinInterruptOn(uint32_t value)
{
_buttonPinInterruptOn = value;
}
2019-08-22 22:57:35 +02:00
uint32_t buttonPin()
{
return _buttonPin;
}
2019-08-22 22:57:35 +02:00
void buttonPin(uint32_t value)
{
_buttonPin = value;
}
2019-08-22 22:57:35 +02:00
void readMemory()
{
_bau.readMemory();
}
2019-08-22 22:57:35 +02:00
void writeMemory()
{
_bau.writeMemory();
}
2019-08-22 22:57:35 +02:00
uint16_t induvidualAddress()
{
return _bau.deviceObject().induvidualAddress();
}
2019-08-22 22:57:35 +02:00
void loop()
{
if (progMode() != _progLedState)
{
_progLedState = progMode();
if (_progLedState)
{
println("progmode on");
digitalWrite(ledPin(), _ledPinActiveOn);
}
else
{
println("progmode off");
digitalWrite(ledPin(), HIGH - _ledPinActiveOn);
}
}
if (_toogleProgMode)
{
progMode(!progMode());
_toogleProgMode = false;
}
_bau.loop();
}
2019-08-22 22:57:35 +02:00
void manufacturerId(uint16_t value)
{
_bau.deviceObject().manufacturerId(value);
}
2019-08-22 22:57:35 +02:00
void bauNumber(uint32_t value)
{
_bau.deviceObject().bauNumber(value);
}
2019-08-22 22:57:35 +02:00
void orderNumber(const char* value)
{
_bau.deviceObject().orderNumber(value);
}
2019-08-22 22:57:35 +02:00
void hardwareType(uint8_t* value)
{
_bau.deviceObject().hardwareType(value);
}
2019-08-22 22:57:35 +02:00
void version(uint16_t value)
{
_bau.deviceObject().version(value);
}
2019-08-22 22:57:35 +02:00
void start()
{
pinMode(_ledPin, OUTPUT);
digitalWrite(_ledPin, HIGH - _ledPinActiveOn);
pinMode(_buttonPin, INPUT_PULLUP);
attachInterrupt(_buttonPin, buttonUp, _buttonPinInterruptOn);
2019-08-22 22:57:35 +02:00
enabled(true);
}
2019-08-22 22:57:35 +02:00
void setSaveCallback(saveRestoreCallback func)
{
_saveCallback = func;
}
2019-08-22 22:57:35 +02:00
void setRestoreCallback(saveRestoreCallback func)
{
_restoreCallback = func;
}
2019-08-22 22:57:35 +02:00
uint8_t* paramData(uint32_t addr)
{
if (!_bau.configured())
return nullptr;
return _bau.parameters().data(addr);
}
2019-08-22 22:57:35 +02:00
uint8_t paramByte(uint32_t addr)
{
if (!_bau.configured())
return 0;
return _bau.parameters().getByte(addr);
}
uint16_t paramWord(uint32_t addr)
{
if (!_bau.configured())
return 0;
return _bau.parameters().getWord(addr);
}
2019-08-22 22:57:35 +02:00
uint32_t paramInt(uint32_t addr)
{
if (!_bau.configured())
return 0;
return _bau.parameters().getInt(addr);
}
2019-08-22 22:57:35 +02:00
GroupObject& getGroupObject(uint16_t goNr)
{
return _bau.groupObjectTable().get(goNr);
}
2019-08-22 22:57:35 +02:00
void restart(uint16_t individualAddress)
{
_bau.restartRequest(individualAddress);
}
2019-06-24 22:22:56 +02:00
private:
2019-08-22 22:57:35 +02:00
P* _platformPtr = 0;
B* _bauPtr = 0;
B& _bau;
uint32_t _ledPinActiveOn = LOW;
2019-01-03 22:20:50 +01:00
uint32_t _ledPin = LED_BUILTIN;
uint32_t _buttonPinInterruptOn = RISING;
2018-04-09 23:58:35 +02:00
uint32_t _buttonPin = 0;
2018-09-04 21:12:50 +02:00
saveRestoreCallback _saveCallback = 0;
saveRestoreCallback _restoreCallback = 0;
2019-08-22 22:57:35 +02:00
bool _toogleProgMode = false;
bool _progLedState = false;
uint16_t _saveSize = 0;
2019-08-22 22:57:35 +02:00
uint8_t* save(uint8_t* buffer)
{
if (_saveCallback != 0)
return _saveCallback(buffer);
return buffer;
}
2019-08-22 22:57:35 +02:00
uint8_t* restore(uint8_t* buffer)
{
if (_restoreCallback != 0)
return _restoreCallback(buffer);
return buffer;
}
uint16_t saveSize()
{
return _saveSize;
}
void saveSize(uint16_t size)
{
_saveSize = size;
}
2018-03-20 23:56:42 +01:00
};
2019-08-22 22:57:35 +02:00
#ifdef ARDUINO_ARCH_SAMD
2019-10-25 16:41:29 +02:00
// predefined global instance for TP or RF
#ifdef MEDIUM_TYPE
#if MEDIUM_TYPE == 0
extern KnxFacade<SamdPlatform, Bau07B0> knx;
#elif MEDIUM_TYPE == 2
extern KnxFacade<SamdPlatform, Bau27B0> knx;
#else
#error "Only TP and RF supported for Arduino SAMD platform!"
#endif
#else
#error "No medium type specified for Arduino_SAMD platform! Please set MEDIUM_TYPE! (TP:0, RF:2, IP:5)"
#endif
2019-08-22 22:57:35 +02:00
#elif ARDUINO_ARCH_ESP8266
2019-10-25 16:41:29 +02:00
// predefined global instance for IP only
extern KnxFacade<EspPlatform, Bau57B0> knx;
#elif ARDUINO_ARCH_ESP32
2019-10-25 16:41:29 +02:00
// predefined global instance for IP only
extern KnxFacade<Esp32Platform, Bau57B0> knx;
2019-08-22 22:57:35 +02:00
#elif __linux__
2019-10-25 16:41:29 +02:00
// no predefined global instance
#endif