mirror of
https://github.com/thelsing/knx.git
synced 2024-12-29 00:05:42 +01:00
opt-out global KNX, ability to DIY construct knx object, minor cleanups (#121)
* Refactored the knx_facade a bit to make the auto-building of the global knx object and the buttonUp() ISR function opt-in. Also added the ability to quite easily attach another serial (in this case tested with Serial2 of an ESP32). * Added visual studio code temp files to .gitignore * Fix for missing build flag for WifiManager in ESP32_ip demo * Added example in which we DIY build the KNX object and use ESP32's second UART to connect so that you can debug with the first one that's connected to USB. * Minor platform cleanups to remove compilation warnings. * ESP32 can't handle the defaulted 8192 byte EPROM. Next to that I needed to begin() the eprom lib in my setup() to get it to work and that requires knowing how much memory KNX will use. This fix makes the default more conservative and moves it's definition to the .h file so that other files can always use it as well. * After comments from thelsing, inverted the logic. The default global knx object is now opt-out by defining KNX_NO_AUTOMATIC_GLOBAL_INSTANCE. See the knx-demo-diy project for an example. Minor syntactic cleanups. * Removed hardwareserial from facade (detail which was not needed) Placed facade constructors together Minor syntactic cleanup * Fixed knx-cc1310 where own button routine was calling now private internal knx facade variable. Renamed files in knx-demo-diy Minor syntactic stuff * Added gitattributes for binary knxprod files
This commit is contained in:
parent
58d3721571
commit
f169e20f2f
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.knxprod binary
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -31,6 +31,7 @@ _build
|
||||
|
||||
# Visual Studio 2015 cache/options directory
|
||||
.vs/
|
||||
.vscode/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
|
@ -11,7 +11,7 @@ void buttonUp()
|
||||
if (millis() - lastpressed > 200)
|
||||
{
|
||||
KnxFacade<CC1310Platform, Bau27B0> &knx = *pKnx;
|
||||
knx._toogleProgMode = true;
|
||||
knx.toggleProgMode();
|
||||
lastpressed = millis();
|
||||
}
|
||||
}
|
||||
|
5
examples/knx-demo-diy/.gitignore
vendored
Normal file
5
examples/knx-demo-diy/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
BIN
examples/knx-demo-diy/knx-demo-diy-tp.knxprod
Normal file
BIN
examples/knx-demo-diy/knx-demo-diy-tp.knxprod
Normal file
Binary file not shown.
133
examples/knx-demo-diy/knx-demo-diy-tp.xml
Normal file
133
examples/knx-demo-diy/knx-demo-diy-tp.xml
Normal file
@ -0,0 +1,133 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<KNX xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreatedBy="KNX MT" ToolVersion="5.6.407.26745" xmlns="http://knx.org/xml/project/11">
|
||||
<ManufacturerData>
|
||||
<Manufacturer RefId="M-00FA">
|
||||
<Catalog>
|
||||
<CatalogSection Id="M-00FA_CS-1" Name="Geräte" Number="1" DefaultLanguage="en-US">
|
||||
<CatalogItem Id="M-00FA_H-0124-0_HP-ABCE-79-0000_CI-IA4313-1" Name="Temperatursensor TP" Number="1" ProductRefId="M-00FA_H-0124-0_P-IA4313" Hardware2ProgramRefId="M-00FA_H-0124-0_HP-ABCE-79-0000" DefaultLanguage="en-US" />
|
||||
</CatalogSection>
|
||||
</Catalog>
|
||||
<ApplicationPrograms>
|
||||
<ApplicationProgram Id="M-00FA_A-ABCE-79-0000" ApplicationNumber="43982" ApplicationVersion="121" ProgramType="ApplicationProgram" MaskVersion="MV-07B0" Name="TK TEMP TP" LoadProcedureStyle="MergedProcedure" PeiType="0" DefaultLanguage="en-US" DynamicTableManagement="false" Linkable="false" MinEtsVersion="4.0">
|
||||
<Static>
|
||||
<Code>
|
||||
<RelativeSegment Id="M-00FA_A-ABCE-79-0000_RS-04-00000" Name="Parameters" Offset="0" Size="8" LoadStateMachine="4" />
|
||||
</Code>
|
||||
<ParameterTypes>
|
||||
<ParameterType Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout" Name="startupTimeout">
|
||||
<TypeRestriction Base="Value" SizeInBit="8">
|
||||
<Enumeration Text="0 s" Value="0" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-0" />
|
||||
<Enumeration Text="1 s" Value="1" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-1" />
|
||||
<Enumeration Text="2 s" Value="2" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-2" />
|
||||
<Enumeration Text="3 s" Value="3" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-3" />
|
||||
<Enumeration Text="4 s" Value="4" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-4" />
|
||||
<Enumeration Text="5 s" Value="5" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-5" />
|
||||
<Enumeration Text="6 s" Value="6" Id="M-00FA_A-ABCE-79-0000_PT-startupTimeout_EN-6" />
|
||||
</TypeRestriction>
|
||||
</ParameterType>
|
||||
<ParameterType Id="M-00FA_A-ABCE-79-0000_PT-TempChange" Name="TempChange">
|
||||
<TypeRestriction Base="Value" SizeInBit="8">
|
||||
<Enumeration Text="Disabled" Value="0" Id="M-00FA_A-ABCE-79-0000_PT-TempChange_EN-0" />
|
||||
<Enumeration Text="0.1 K" Value="1" Id="M-00FA_A-ABCE-79-0000_PT-TempChange_EN-1" />
|
||||
<Enumeration Text="0.2 K" Value="2" Id="M-00FA_A-ABCE-79-0000_PT-TempChange_EN-2" />
|
||||
<Enumeration Text="0.3 K" Value="3" Id="M-00FA_A-ABCE-79-0000_PT-TempChange_EN-3" />
|
||||
</TypeRestriction>
|
||||
</ParameterType>
|
||||
<ParameterType Id="M-00FA_A-ABCE-79-0000_PT-TempCycle" Name="TempCycle">
|
||||
<TypeRestriction Base="Value" SizeInBit="8">
|
||||
<Enumeration Text="Disabled" Value="0" Id="M-00FA_A-ABCE-79-0000_PT-TempCycle_EN-0" />
|
||||
<Enumeration Text="1 min" Value="1" Id="M-00FA_A-ABCE-79-0000_PT-TempCycle_EN-1" />
|
||||
<Enumeration Text="2 min" Value="2" Id="M-00FA_A-ABCE-79-0000_PT-TempCycle_EN-2" />
|
||||
<Enumeration Text="3 min" Value="3" Id="M-00FA_A-ABCE-79-0000_PT-TempCycle_EN-3" />
|
||||
</TypeRestriction>
|
||||
</ParameterType>
|
||||
<ParameterType Id="M-00FA_A-ABCE-79-0000_PT-TempAbgleich" Name="TempAbgleich">
|
||||
<TypeNumber SizeInBit="32" Type="signedInt" minInclusive="-50" maxInclusive="50" />
|
||||
</ParameterType>
|
||||
<ParameterType Id="M-00FA_A-ABCE-79-0000_PT-TempSendMinMax" Name="TempSendMinMax">
|
||||
<TypeRestriction Base="Value" SizeInBit="8">
|
||||
<Enumeration Text="Disabled" Value="0" Id="M-00FA_A-ABCE-79-0000_PT-TempSendMinMax_EN-0" />
|
||||
<Enumeration Text="Send Enable" Value="1" Id="M-00FA_A-ABCE-79-0000_PT-TempSendMinMax_EN-1" />
|
||||
</TypeRestriction>
|
||||
</ParameterType>
|
||||
</ParameterTypes>
|
||||
<Parameters>
|
||||
<Parameter Id="M-00FA_A-ABCE-79-0000_P-1" Name="startupTimeout" ParameterType="M-00FA_A-ABCE-79-0000_PT-startupTimeout" Text="Startup delaytime" Value="0">
|
||||
<Memory CodeSegment="M-00FA_A-ABCE-79-0000_RS-04-00000" Offset="0" BitOffset="0" />
|
||||
</Parameter>
|
||||
<Parameter Id="M-00FA_A-ABCE-79-0000_P-2" Name="Aender Senden" ParameterType="M-00FA_A-ABCE-79-0000_PT-TempChange" Text="Send actual value after change of" Value="0">
|
||||
<Memory CodeSegment="M-00FA_A-ABCE-79-0000_RS-04-00000" Offset="1" BitOffset="0" />
|
||||
</Parameter>
|
||||
<Parameter Id="M-00FA_A-ABCE-79-0000_P-3" Name="ZyklSenden" ParameterType="M-00FA_A-ABCE-79-0000_PT-TempCycle" Text="Send actual temperature cyclically" Value="0">
|
||||
<Memory CodeSegment="M-00FA_A-ABCE-79-0000_RS-04-00000" Offset="2" BitOffset="0" />
|
||||
</Parameter>
|
||||
<Parameter Id="M-00FA_A-ABCE-79-0000_P-4" Name="MinMaxSenden" ParameterType="M-00FA_A-ABCE-79-0000_PT-TempSendMinMax" Text="Send min/max value" Value="0">
|
||||
<Memory CodeSegment="M-00FA_A-ABCE-79-0000_RS-04-00000" Offset="3" BitOffset="0" />
|
||||
</Parameter>
|
||||
<Parameter Id="M-00FA_A-ABCE-79-0000_P-5" Name="Abgleich" ParameterType="M-00FA_A-ABCE-79-0000_PT-TempAbgleich" Text="Internal sensor correction value (value * 0.1 K)" Value="0">
|
||||
<Memory CodeSegment="M-00FA_A-ABCE-79-0000_RS-04-00000" Offset="4" BitOffset="0" />
|
||||
</Parameter>
|
||||
</Parameters>
|
||||
<ParameterRefs>
|
||||
<ParameterRef Id="M-00FA_A-ABCE-79-0000_P-1_R-1" RefId="M-00FA_A-ABCE-79-0000_P-1" />
|
||||
<ParameterRef Id="M-00FA_A-ABCE-79-0000_P-2_R-2" RefId="M-00FA_A-ABCE-79-0000_P-2" />
|
||||
<ParameterRef Id="M-00FA_A-ABCE-79-0000_P-3_R-3" RefId="M-00FA_A-ABCE-79-0000_P-3" />
|
||||
<ParameterRef Id="M-00FA_A-ABCE-79-0000_P-4_R-4" RefId="M-00FA_A-ABCE-79-0000_P-4" />
|
||||
<ParameterRef Id="M-00FA_A-ABCE-79-0000_P-5_R-5" RefId="M-00FA_A-ABCE-79-0000_P-5" />
|
||||
</ParameterRefs>
|
||||
<ComObjectTable>
|
||||
<ComObject Id="M-00FA_A-ABCE-79-0000_O-1" Name="Current temperature value" Text="Current temperature value" Number="1" FunctionText="Transmit temperature value" ObjectSize="2 Bytes" ReadFlag="Enabled" WriteFlag="Disabled" CommunicationFlag="Enabled" TransmitFlag="Enabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" DatapointType="" />
|
||||
<ComObject Id="M-00FA_A-ABCE-79-0000_O-2" Name="Max memory value" Text="Max memory value" Number="2" FunctionText="Read memory" ObjectSize="2 Bytes" ReadFlag="Enabled" WriteFlag="Disabled" CommunicationFlag="Enabled" TransmitFlag="Enabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" DatapointType="" />
|
||||
<ComObject Id="M-00FA_A-ABCE-79-0000_O-3" Name="Min memory value" Text="Min memory value" Number="3" FunctionText="Read memory" ObjectSize="2 Bytes" ReadFlag="Enabled" WriteFlag="Disabled" CommunicationFlag="Enabled" TransmitFlag="Enabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" DatapointType="" />
|
||||
<ComObject Id="M-00FA_A-ABCE-79-0000_O-4" Name="Min/max memory reseet" Text="Min/max memory reseet" Number="4" FunctionText="Reset memory" ObjectSize="1 Bit" ReadFlag="Disabled" WriteFlag="Enabled" CommunicationFlag="Enabled" TransmitFlag="Disabled" UpdateFlag="Disabled" ReadOnInitFlag="Disabled" DatapointType="" />
|
||||
</ComObjectTable>
|
||||
<ComObjectRefs>
|
||||
<ComObjectRef Id="M-00FA_A-ABCE-79-0000_O-1_R-1" RefId="M-00FA_A-ABCE-79-0000_O-1" />
|
||||
<ComObjectRef Id="M-00FA_A-ABCE-79-0000_O-2_R-2" RefId="M-00FA_A-ABCE-79-0000_O-2" />
|
||||
<ComObjectRef Id="M-00FA_A-ABCE-79-0000_O-3_R-3" RefId="M-00FA_A-ABCE-79-0000_O-3" />
|
||||
<ComObjectRef Id="M-00FA_A-ABCE-79-0000_O-4_R-4" RefId="M-00FA_A-ABCE-79-0000_O-4" />
|
||||
</ComObjectRefs>
|
||||
<AddressTable MaxEntries="65000" />
|
||||
<AssociationTable MaxEntries="65000" />
|
||||
<LoadProcedures>
|
||||
<LoadProcedure MergeId="2">
|
||||
<LdCtrlRelSegment AppliesTo="full" LsmIdx="4" Size="8" Mode="0" Fill="0" />
|
||||
</LoadProcedure>
|
||||
<LoadProcedure MergeId="4">
|
||||
<LdCtrlWriteRelMem ObjIdx="4" Offset="0" Size="8" Verify="true" />
|
||||
</LoadProcedure>
|
||||
</LoadProcedures>
|
||||
<Options />
|
||||
</Static>
|
||||
<Dynamic>
|
||||
<ChannelIndependentBlock>
|
||||
<ParameterBlock Id="M-00FA_A-ABCE-79-0000_PB-1" Name="ParameterPage" Text="Allgemeine Parameter">
|
||||
<ParameterRefRef RefId="M-00FA_A-ABCE-79-0000_P-1_R-1" />
|
||||
<ParameterRefRef RefId="M-00FA_A-ABCE-79-0000_P-2_R-2" />
|
||||
<ParameterRefRef RefId="M-00FA_A-ABCE-79-0000_P-3_R-3" />
|
||||
<ParameterRefRef RefId="M-00FA_A-ABCE-79-0000_P-4_R-4" />
|
||||
<ParameterRefRef RefId="M-00FA_A-ABCE-79-0000_P-5_R-5" />
|
||||
<ComObjectRefRef RefId="M-00FA_A-ABCE-79-0000_O-1_R-1" />
|
||||
<ComObjectRefRef RefId="M-00FA_A-ABCE-79-0000_O-2_R-2" />
|
||||
<ComObjectRefRef RefId="M-00FA_A-ABCE-79-0000_O-3_R-3" />
|
||||
<ComObjectRefRef RefId="M-00FA_A-ABCE-79-0000_O-4_R-4" />
|
||||
</ParameterBlock>
|
||||
</ChannelIndependentBlock>
|
||||
</Dynamic>
|
||||
</ApplicationProgram>
|
||||
</ApplicationPrograms>
|
||||
<Hardware>
|
||||
<Hardware Id="M-00FA_H-0124-0" Name="SAMD Random" SerialNumber="0124" VersionNumber="0" BusCurrent="10" HasIndividualAddress="true" HasApplicationProgram="true">
|
||||
<Products>
|
||||
<Product Id="M-00FA_H-0124-0_P-IA4313" Text="Temperatursensor TP" OrderNumber="IA4313" IsRailMounted="false" DefaultLanguage="en-US" />
|
||||
</Products>
|
||||
<Hardware2Programs>
|
||||
<Hardware2Program Id="M-00FA_H-0124-0_HP-ABCE-79-0000" MediumTypes="MT-0">
|
||||
<ApplicationProgramRef RefId="M-00FA_A-ABCE-79-0000" />
|
||||
</Hardware2Program>
|
||||
</Hardware2Programs>
|
||||
</Hardware>
|
||||
</Hardware>
|
||||
</Manufacturer>
|
||||
</ManufacturerData>
|
||||
</KNX>
|
138
examples/knx-demo-diy/knx-demo-diy.ino
Normal file
138
examples/knx-demo-diy/knx-demo-diy.ino
Normal file
@ -0,0 +1,138 @@
|
||||
#include <knx.h>
|
||||
#include <knx/bau07B0.h>
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP8266
|
||||
#include <WiFiManager.h>
|
||||
#endif
|
||||
|
||||
// create named references for easy access to group objects
|
||||
#define goCurrent knx.getGroupObject(1)
|
||||
#define goMax knx.getGroupObject(2)
|
||||
#define goMin knx.getGroupObject(3)
|
||||
#define goReset knx.getGroupObject(4)
|
||||
|
||||
// If you don't want a global knx object, for example because you want
|
||||
// to more finely control it's construction, this is an example
|
||||
// of how to do so. Define KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
// and then you can DIY a knx object as shown below. In this case we use
|
||||
// the ESP32's secondary UART and late-bind the ISR function in setup().
|
||||
Esp32Platform knxPlatform(&Serial2);
|
||||
Bau07B0 knxBau(knxPlatform);
|
||||
KnxFacade<Esp32Platform, Bau07B0> knx(knxBau);
|
||||
|
||||
ICACHE_RAM_ATTR void myButtonPressed()
|
||||
{
|
||||
// Debounce
|
||||
static uint32_t lastpressed=0;
|
||||
if (millis() - lastpressed > 200)
|
||||
{
|
||||
knx.toggleProgMode();
|
||||
lastpressed = millis();
|
||||
}
|
||||
}
|
||||
|
||||
float currentValue = 0;
|
||||
float maxValue = 0;
|
||||
float minValue = RAND_MAX;
|
||||
long lastsend = 0;
|
||||
|
||||
void measureTemp()
|
||||
{
|
||||
long now = millis();
|
||||
if ((now - lastsend) < 2000)
|
||||
return;
|
||||
|
||||
lastsend = now;
|
||||
int r = rand();
|
||||
currentValue = (r * 1.0) / (RAND_MAX * 1.0);
|
||||
currentValue *= 100 * 100;
|
||||
|
||||
// write new value to groupobject
|
||||
goCurrent.value(currentValue);
|
||||
|
||||
if (currentValue > maxValue)
|
||||
{
|
||||
maxValue = currentValue;
|
||||
goMax.value(maxValue);
|
||||
}
|
||||
|
||||
if (currentValue < minValue)
|
||||
{
|
||||
minValue = currentValue;
|
||||
goMin.value(minValue);
|
||||
}
|
||||
}
|
||||
|
||||
// callback from reset-GO
|
||||
void resetCallback(GroupObject& go)
|
||||
{
|
||||
if (go.value())
|
||||
{
|
||||
maxValue = 0;
|
||||
minValue = 10000;
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
knx.setButtonISRFunction(myButtonPressed);
|
||||
|
||||
Serial.begin(115200);
|
||||
ArduinoPlatform::SerialDebug = &Serial;
|
||||
|
||||
Serial2.begin(19200); // KNX, pin 16,17 on EPS32
|
||||
|
||||
randomSeed(millis());
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP8266
|
||||
WiFiManager wifiManager;
|
||||
wifiManager.autoConnect("knx-demo");
|
||||
#endif
|
||||
|
||||
// read adress table, association table, groupobject table and parameters from eeprom
|
||||
knx.readMemory();
|
||||
|
||||
// print values of parameters if device is already configured
|
||||
if (knx.configured())
|
||||
{
|
||||
// register callback for reset GO
|
||||
goReset.callback(resetCallback);
|
||||
goReset.dataPointType(DPT_Trigger);
|
||||
goCurrent.dataPointType(DPT_Value_Temp);
|
||||
goMin.dataPointType(DPT_Value_Temp);
|
||||
goMax.dataPointType(DPT_Value_Temp);
|
||||
|
||||
Serial.print("Timeout: ");
|
||||
Serial.println(knx.paramByte(0));
|
||||
Serial.print("Zykl. senden: ");
|
||||
Serial.println(knx.paramByte(1));
|
||||
Serial.print("Min/Max senden: ");
|
||||
Serial.println(knx.paramByte(2));
|
||||
Serial.print("Aenderung senden: ");
|
||||
Serial.println(knx.paramByte(3));
|
||||
Serial.print("Abgleich: ");
|
||||
Serial.println(knx.paramByte(4));
|
||||
}
|
||||
|
||||
// pin or GPIO the programming led is connected to. Default is LED_BUILTIN
|
||||
// knx.ledPin(LED_BUILTIN);
|
||||
// is the led active on HIGH or low? Default is LOW
|
||||
// knx.ledPinActiveOn(HIGH);
|
||||
// pin or GPIO programming button is connected to. Default is 0
|
||||
// knx.buttonPin(0);
|
||||
|
||||
// start the framework.
|
||||
knx.start();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// don't delay here to much. Otherwise you might lose packages or mess up the timing with ETS
|
||||
knx.loop();
|
||||
|
||||
// only run the application code if the device was configured with ETS
|
||||
if (!knx.configured())
|
||||
return;
|
||||
|
||||
measureTemp();
|
||||
}
|
24
examples/knx-demo-diy/platformio-ci.ini
Normal file
24
examples/knx-demo-diy/platformio-ci.ini
Normal file
@ -0,0 +1,24 @@
|
||||
;PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
;
|
||||
;--- ESP32 -----------------------------------------------
|
||||
|
||||
[env:esp32dev_tp]
|
||||
platform = espressif32
|
||||
board = esp32dev
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
knx
|
||||
|
||||
build_flags =
|
||||
-DMASK_VERSION=0x07B0
|
||||
-Wno-unknown-pragmas
|
||||
-DKNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
33
examples/knx-demo-diy/platformio.ini
Normal file
33
examples/knx-demo-diy/platformio.ini
Normal file
@ -0,0 +1,33 @@
|
||||
;PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
[platformio]
|
||||
; We have to keep libdeps dir out the project directory otherwise,
|
||||
; library scanner seems to have issues so compilation fails
|
||||
libdeps_dir = /tmp/libdeps
|
||||
src_dir = .
|
||||
|
||||
|
||||
;--- ESP32 -----------------------------------------------
|
||||
|
||||
[env:esp32dev_tp]
|
||||
platform = espressif32
|
||||
board = esp32dev
|
||||
framework = arduino
|
||||
; We consider that the this projects is opened within its project directory
|
||||
; while working with VS Code.
|
||||
lib_extra_dirs = ../../../
|
||||
|
||||
lib_deps =
|
||||
knx
|
||||
|
||||
build_flags =
|
||||
-DMASK_VERSION=0x07B0
|
||||
-Wno-unknown-pragmas
|
||||
-DKNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
@ -59,6 +59,7 @@ framework = arduino
|
||||
lib_extra_dirs = ../../../
|
||||
|
||||
lib_deps =
|
||||
WifiManager
|
||||
knx
|
||||
|
||||
build_flags =
|
||||
|
@ -12,11 +12,12 @@ ArduinoPlatform::ArduinoPlatform(HardwareSerial* knxSerial) : _knxSerial(knxSeri
|
||||
|
||||
void ArduinoPlatform::fatalError()
|
||||
{
|
||||
const int period = 200;
|
||||
while (true)
|
||||
{
|
||||
#ifdef LED_BUILTIN
|
||||
if ((millis() % period) > (period / 2))
|
||||
static const long LED_BLINK_PERIOD = 200;
|
||||
|
||||
if ((millis() % LED_BLINK_PERIOD) > (LED_BLINK_PERIOD / 2))
|
||||
digitalWrite(LED_BUILTIN, HIGH);
|
||||
else
|
||||
digitalWrite(LED_BUILTIN, LOW);
|
||||
|
@ -10,7 +10,7 @@ Esp32Platform::Esp32Platform() : ArduinoPlatform(&Serial1)
|
||||
{
|
||||
}
|
||||
|
||||
Esp32Platform::Esp32Platform( HardwareSerial* s) : ArduinoPlatform(s)
|
||||
Esp32Platform::Esp32Platform(HardwareSerial* s) : ArduinoPlatform(s)
|
||||
{
|
||||
}
|
||||
|
||||
@ -58,10 +58,9 @@ void Esp32Platform::closeMultiCast()
|
||||
bool Esp32Platform::sendBytesMultiCast(uint8_t * buffer, uint16_t len)
|
||||
{
|
||||
//printHex("<- ",buffer, len);
|
||||
int result = 0;
|
||||
result = _udp.beginMulticastPacket();
|
||||
result = _udp.write(buffer, len);
|
||||
result = _udp.endPacket();
|
||||
_udp.beginMulticastPacket();
|
||||
_udp.write(buffer, len);
|
||||
_udp.endPacket();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ class Esp32Platform : public ArduinoPlatform
|
||||
{
|
||||
public:
|
||||
Esp32Platform();
|
||||
Esp32Platform( HardwareSerial* s);
|
||||
Esp32Platform(HardwareSerial* s);
|
||||
|
||||
// ip stuff
|
||||
uint32_t currentIpAddress() override;
|
||||
|
@ -61,10 +61,9 @@ void EspPlatform::closeMultiCast()
|
||||
bool EspPlatform::sendBytesMultiCast(uint8_t * buffer, uint16_t len)
|
||||
{
|
||||
//printHex("<- ",buffer, len);
|
||||
int result = 0;
|
||||
result = _udp.beginPacketMulticast(_mulitcastAddr, _mulitcastPort, WiFi.localIP());
|
||||
result = _udp.write(buffer, len);
|
||||
result = _udp.endPacket();
|
||||
_udp.beginPacketMulticast(_mulitcastAddr, _mulitcastPort, WiFi.localIP());
|
||||
_udp.write(buffer, len);
|
||||
_udp.endPacket();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ class EspPlatform : public ArduinoPlatform
|
||||
{
|
||||
public:
|
||||
EspPlatform();
|
||||
EspPlatform( HardwareSerial* s);
|
||||
EspPlatform(HardwareSerial* s);
|
||||
|
||||
// ip stuff
|
||||
uint32_t currentIpAddress() override;
|
||||
|
@ -2,10 +2,6 @@
|
||||
#include <string.h>
|
||||
#include "bits.h"
|
||||
|
||||
#ifndef KNX_FLASH_SIZE
|
||||
# define KNX_FLASH_SIZE 8192
|
||||
#endif
|
||||
|
||||
Memory::Memory(Platform& platform, DeviceObject& deviceObject)
|
||||
: _platform(platform), _deviceObject(deviceObject)
|
||||
{
|
||||
|
@ -9,6 +9,10 @@
|
||||
#define MAXSAVE 5
|
||||
#define MAXTABLEOBJ 4
|
||||
|
||||
#ifndef KNX_FLASH_SIZE
|
||||
# define KNX_FLASH_SIZE 1024
|
||||
#endif
|
||||
|
||||
class MemoryBlock
|
||||
{
|
||||
public:
|
||||
|
@ -2,72 +2,72 @@
|
||||
|
||||
#include "knx/bits.h"
|
||||
|
||||
#ifdef ARDUINO_ARCH_SAMD
|
||||
// predefined global instance for TP or RF or TP/RF coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<SamdPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x27B0
|
||||
KnxFacade<SamdPlatform, Bau27B0> knx;
|
||||
#elif MASK_VERSION == 0x2920
|
||||
KnxFacade<SamdPlatform, Bau2920> knx;
|
||||
#else
|
||||
#error Mask version not supported on ARDUINO_ARCH_SAMD
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
|
||||
#if (defined(ARDUINO_ARCH_STM32) || \
|
||||
defined(ARDUINO_ARCH_ESP32) || \
|
||||
defined(ARDUINO_ARCH_ESP8266) || \
|
||||
defined(ARDUINO_ARCH_SAMD))
|
||||
|
||||
// Only ESP8266 and ESP32 have this define. For all other platforms this is just empty.
|
||||
#ifndef ICACHE_RAM_ATTR
|
||||
#define ICACHE_RAM_ATTR
|
||||
#endif
|
||||
|
||||
ICACHE_RAM_ATTR void buttonUp()
|
||||
{
|
||||
static uint32_t lastpressed=0;
|
||||
if (millis() - lastpressed > 200){
|
||||
knx.toggleProgMode();
|
||||
lastpressed = millis();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<EspPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
KnxFacade<EspPlatform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
KnxFacade<EspPlatform, Bau091A> knx;
|
||||
#else
|
||||
#error Mask version not supported on ARDUINO_ARCH_ESP8266
|
||||
#ifdef ARDUINO_ARCH_SAMD
|
||||
// predefined global instance for TP or RF or TP/RF coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<SamdPlatform, Bau07B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x27B0
|
||||
KnxFacade<SamdPlatform, Bau27B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x2920
|
||||
KnxFacade<SamdPlatform, Bau2920> knx(buttonUp);
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_SAMD"
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<EspPlatform, Bau07B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
KnxFacade<EspPlatform, Bau57B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x091A
|
||||
KnxFacade<EspPlatform, Bau091A> knx(buttonUp);
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP8266"
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<Esp32Platform, Bau07B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
KnxFacade<Esp32Platform, Bau57B0> knx(buttonUp);
|
||||
#elif MASK_VERSION == 0x091A
|
||||
KnxFacade<Esp32Platform, Bau091A> knx(buttonUp);
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP32"
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_STM32)
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<Stm32Platform, Bau07B0> knx(buttonUp);
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_STM32"
|
||||
#endif
|
||||
#else // Non-Arduino platforms and Linux platform
|
||||
// no predefined global instance
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<Esp32Platform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
KnxFacade<Esp32Platform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
KnxFacade<Esp32Platform, Bau091A> knx;
|
||||
#else
|
||||
#error Mask version not supported on ARDUINO_ARCH_ESP8266
|
||||
#endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_STM32)
|
||||
#if MASK_VERSION == 0x07B0
|
||||
KnxFacade<Stm32Platform, Bau07B0> knx;
|
||||
#else
|
||||
#error Mask version not supported on ARDUINO_ARCH_STM32
|
||||
#endif
|
||||
#else // Non-Arduino platforms and Linux platform
|
||||
// no predefined global instance
|
||||
#endif
|
||||
|
||||
// Only ESP8266 and ESP32 have this define. For all other platforms this is just empty.
|
||||
#ifndef ICACHE_RAM_ATTR
|
||||
#define ICACHE_RAM_ATTR
|
||||
#endif
|
||||
|
||||
#if (defined(ARDUINO_ARCH_STM32) || \
|
||||
defined(ARDUINO_ARCH_ESP32) || \
|
||||
defined(ARDUINO_ARCH_ESP8266) || \
|
||||
defined(ARDUINO_ARCH_SAMD))
|
||||
ICACHE_RAM_ATTR void buttonUp()
|
||||
{
|
||||
static uint32_t lastpressed=0;
|
||||
if (millis() - lastpressed > 200){
|
||||
knx._toogleProgMode = true;
|
||||
lastpressed = millis();
|
||||
}
|
||||
}
|
||||
#elif defined(__linux__)
|
||||
void buttonUp()
|
||||
{
|
||||
// no de-bounce on linux platform, just satisfy the compiler
|
||||
}
|
||||
#endif
|
||||
#endif // KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
|
187
src/knx_facade.h
187
src/knx_facade.h
@ -10,33 +10,41 @@
|
||||
|
||||
#ifdef ARDUINO_ARCH_SAMD
|
||||
#include "samd_platform.h"
|
||||
void buttonUp();
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
void buttonUp();
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
#include "esp_platform.h"
|
||||
void buttonUp();
|
||||
#include "esp_platform.h"
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
void buttonUp();
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
#define LED_BUILTIN 13
|
||||
#include "esp32_platform.h"
|
||||
void buttonUp();
|
||||
#define LED_BUILTIN 13
|
||||
#include "esp32_platform.h"
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
void buttonUp();
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_STM32)
|
||||
#include "stm32_platform.h"
|
||||
void buttonUp();
|
||||
#include "stm32_platform.h"
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
void buttonUp();
|
||||
#endif
|
||||
#elif __linux__
|
||||
#define LED_BUILTIN 0
|
||||
#include "linux_platform.h"
|
||||
void buttonUp();
|
||||
#define LED_BUILTIN 0
|
||||
#include "linux_platform.h"
|
||||
#else
|
||||
#define LED_BUILTIN 5 // see GPIO_PinConfig gpioPinConfigs[]
|
||||
#include "cc1310_platform.h"
|
||||
extern void buttonUp();
|
||||
#define LED_BUILTIN 5 // see GPIO_PinConfig gpioPinConfigs[]
|
||||
#include "cc1310_platform.h"
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
extern void buttonUp();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef uint8_t* (*SaveRestoreCallback)(uint8_t* buffer);
|
||||
typedef void (*IsrFunctionPtr)();
|
||||
|
||||
template <class P, class B> class KnxFacade : private SaveRestore
|
||||
{
|
||||
friend void buttonUp();
|
||||
|
||||
public:
|
||||
KnxFacade() : _platformPtr(new P()), _bauPtr(new B(*_platformPtr)), _bau(*_bauPtr)
|
||||
{
|
||||
@ -44,6 +52,19 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
_bau.addSaveRestore(this);
|
||||
}
|
||||
|
||||
KnxFacade(B& bau) : _bau(bau)
|
||||
{
|
||||
manufacturerId(0xfa);
|
||||
_bau.addSaveRestore(this);
|
||||
}
|
||||
|
||||
KnxFacade(IsrFunctionPtr buttonISRFunction) : _platformPtr(new P()), _bauPtr(new B(*_platformPtr)), _bau(*_bauPtr)
|
||||
{
|
||||
manufacturerId(0xfa);
|
||||
_bau.addSaveRestore(this);
|
||||
setButtonISRFunction(buttonISRFunction);
|
||||
}
|
||||
|
||||
virtual ~KnxFacade()
|
||||
{
|
||||
if (_bauPtr)
|
||||
@ -53,12 +74,6 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
delete _platformPtr;
|
||||
}
|
||||
|
||||
KnxFacade(B& bau) : _bau(bau)
|
||||
{
|
||||
manufacturerId(0xfa);
|
||||
_bau.addSaveRestore(this);
|
||||
}
|
||||
|
||||
P& platform()
|
||||
{
|
||||
return *_platformPtr;
|
||||
@ -89,6 +104,14 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
_bau.deviceObject().progMode(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* To be called by ISR handling on button press.
|
||||
*/
|
||||
void toggleProgMode()
|
||||
{
|
||||
_toggleProgMode = true;
|
||||
}
|
||||
|
||||
bool configured()
|
||||
{
|
||||
return _bau.configured();
|
||||
@ -181,10 +204,10 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
digitalWrite(ledPin(), HIGH - _ledPinActiveOn);
|
||||
}
|
||||
}
|
||||
if (_toogleProgMode)
|
||||
if (_toggleProgMode)
|
||||
{
|
||||
progMode(!progMode());
|
||||
_toogleProgMode = false;
|
||||
_toggleProgMode = false;
|
||||
}
|
||||
_bau.loop();
|
||||
}
|
||||
@ -216,21 +239,30 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
|
||||
void start()
|
||||
{
|
||||
pinMode(_ledPin, OUTPUT);
|
||||
pinMode(ledPin(), OUTPUT);
|
||||
|
||||
digitalWrite(_ledPin, HIGH - _ledPinActiveOn);
|
||||
digitalWrite(ledPin(), HIGH - _ledPinActiveOn);
|
||||
|
||||
pinMode(_buttonPin, INPUT_PULLUP);
|
||||
pinMode(buttonPin(), INPUT_PULLUP);
|
||||
|
||||
if (_progButtonISRFuncPtr)
|
||||
{
|
||||
// Workaround for https://github.com/arduino/ArduinoCore-samd/issues/587
|
||||
#if (ARDUINO_API_VERSION >= 10200)
|
||||
attachInterrupt(_buttonPin, _progButtonISRFuncPtr, (PinStatus)_buttonPinInterruptOn);
|
||||
#else
|
||||
attachInterrupt(_buttonPin, _progButtonISRFuncPtr, _buttonPinInterruptOn);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Workaround for https://github.com/arduino/ArduinoCore-samd/issues/587
|
||||
#if (ARDUINO_API_VERSION >= 10200)
|
||||
attachInterrupt(_buttonPin, buttonUp, (PinStatus)_buttonPinInterruptOn);
|
||||
#else
|
||||
attachInterrupt(_buttonPin, buttonUp, _buttonPinInterruptOn);
|
||||
#endif
|
||||
enabled(true);
|
||||
}
|
||||
|
||||
void setButtonISRFunction(IsrFunctionPtr progButtonISRFuncPtr)
|
||||
{
|
||||
_progButtonISRFuncPtr = progButtonISRFuncPtr;
|
||||
}
|
||||
|
||||
void setSaveCallback(SaveRestoreCallback func)
|
||||
{
|
||||
_saveCallback = func;
|
||||
@ -303,9 +335,10 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
uint32_t _buttonPin = 0;
|
||||
SaveRestoreCallback _saveCallback = 0;
|
||||
SaveRestoreCallback _restoreCallback = 0;
|
||||
bool _toogleProgMode = false;
|
||||
volatile bool _toggleProgMode = false;
|
||||
bool _progLedState = false;
|
||||
uint16_t _saveSize = 0;
|
||||
IsrFunctionPtr _progButtonISRFuncPtr = 0;
|
||||
|
||||
uint8_t* save(uint8_t* buffer)
|
||||
{
|
||||
@ -334,46 +367,48 @@ template <class P, class B> class KnxFacade : private SaveRestore
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef ARDUINO_ARCH_SAMD
|
||||
// predefined global instance for TP or RF or TP/RF coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<SamdPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x27B0
|
||||
extern KnxFacade<SamdPlatform, Bau27B0> knx;
|
||||
#elif MASK_VERSION == 0x2920
|
||||
extern KnxFacade<SamdPlatform, Bau2920> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_SAMD"
|
||||
#ifndef KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
#ifdef ARDUINO_ARCH_SAMD
|
||||
// predefined global instance for TP or RF or TP/RF coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<SamdPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x27B0
|
||||
extern KnxFacade<SamdPlatform, Bau27B0> knx;
|
||||
#elif MASK_VERSION == 0x2920
|
||||
extern KnxFacade<SamdPlatform, Bau2920> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_SAMD"
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<EspPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
extern KnxFacade<EspPlatform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
extern KnxFacade<EspPlatform, Bau091A> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP8266"
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<Esp32Platform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
extern KnxFacade<Esp32Platform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
extern KnxFacade<Esp32Platform, Bau091A> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP32"
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_STM32)
|
||||
// predefined global instance for TP only
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<Stm32Platform, Bau07B0> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_STM32"
|
||||
#endif
|
||||
#else // Non-Arduino platforms and Linux platform
|
||||
// no predefined global instance
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP8266)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<EspPlatform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
extern KnxFacade<EspPlatform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
extern KnxFacade<EspPlatform, Bau091A> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP8266"
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_ESP32)
|
||||
// predefined global instance for TP or IP or TP/IP coupler
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<Esp32Platform, Bau07B0> knx;
|
||||
#elif MASK_VERSION == 0x57B0
|
||||
extern KnxFacade<Esp32Platform, Bau57B0> knx;
|
||||
#elif MASK_VERSION == 0x091A
|
||||
extern KnxFacade<Esp32Platform, Bau091A> knx;
|
||||
#else
|
||||
#error "Mask version not supported on ARDUINO_ARCH_ESP32"
|
||||
#endif
|
||||
#elif defined(ARDUINO_ARCH_STM32)
|
||||
// predefined global instance for TP only
|
||||
#if MASK_VERSION == 0x07B0
|
||||
extern KnxFacade<Stm32Platform, Bau07B0> knx;
|
||||
#else
|
||||
#error Mask version not supported on ARDUINO_ARCH_STM32
|
||||
#endif
|
||||
#else // Non-Arduino platforms and Linux platform
|
||||
// no predefined global instance
|
||||
#endif
|
||||
#endif // KNX_NO_AUTOMATIC_GLOBAL_INSTANCE
|
||||
|
Loading…
Reference in New Issue
Block a user