diff --git a/knx-linux/CMakeLists.txt b/knx-linux/CMakeLists.txt index d161ea1..deccfbb 100644 --- a/knx-linux/CMakeLists.txt +++ b/knx-linux/CMakeLists.txt @@ -1,10 +1,37 @@ -#Generated by VisualGDB project wizard. -#Note: VisualGDB will automatically update this file when you add new sources to the project. - cmake_minimum_required(VERSION 2.7) project(knx-linux) set(LIBRARIES_FROM_REFERENCES "") -add_executable(knx-linux ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/data_link_layer.cpp ../src/knx/datapoint_types.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/knx/platform.cpp main.cpp ../src/linux_platform.cpp ../src/knx_facade.cpp ../src/knx/dptconvert.cpp) +add_executable(knx-linux + ../src/knx/address_table_object.cpp + ../src/knx/apdu.cpp + ../src/knx/application_layer.cpp + ../src/knx/application_program_object.cpp + ../src/knx/association_table_object.cpp + ../src/knx/bau.cpp + ../src/knx/bau07B0.cpp + ../src/knx/bau57B0.cpp + ../src/knx/bau_systemB.cpp + ../src/knx/bits.cpp + ../src/knx/cemi_frame.cpp + ../src/knx/data_link_layer.cpp + ../src/knx/device_object.cpp + ../src/knx/group_object.cpp + ../src/knx/group_object_table_object.cpp + ../src/knx/interface_object.cpp + ../src/knx/ip_data_link_layer.cpp + ../src/knx/ip_parameter_object.cpp + ../src/knx/memory.cpp + ../src/knx/network_layer.cpp + ../src/knx/npdu.cpp + ../src/knx/table_object.cpp + ../src/knx/tpdu.cpp + ../src/knx/tpuart_data_link_layer.cpp + ../src/knx/transport_layer.cpp + ../src/knx/platform.cpp + main.cpp + ../src/linux_platform.cpp + ../src/knx_facade.cpp + ../src/knx/dptconvert.cpp) target_link_libraries(knx-linux "${LIBRARIES_FROM_REFERENCES}") include_directories(../src) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wno-unknown-pragmas -Wno-switch -g -O0") diff --git a/knx-linux/knx-linux.vcxproj b/knx-linux/knx-linux.vcxproj index 52fb28e..839a421 100644 --- a/knx-linux/knx-linux.vcxproj +++ b/knx-linux/knx-linux.vcxproj @@ -82,7 +82,6 @@ - @@ -126,7 +125,6 @@ - diff --git a/knx-linux/knx-linux.vcxproj.filters b/knx-linux/knx-linux.vcxproj.filters index 9ba69e5..7d9b90b 100644 --- a/knx-linux/knx-linux.vcxproj.filters +++ b/knx-linux/knx-linux.vcxproj.filters @@ -75,9 +75,6 @@ Header files\knx - - Header files\knx - Header files\knx @@ -176,9 +173,6 @@ Source files\knx - - Source files\knx - Source files\knx diff --git a/knx-linux/main.cpp b/knx-linux/main.cpp index 0a0bae9..08e3056 100644 --- a/knx-linux/main.cpp +++ b/knx-linux/main.cpp @@ -6,20 +6,19 @@ #include #include -LinuxPlatform platfrom; -Bau57B0 bau(platfrom); -KnxFacade knx(bau); +KnxFacade* knx = 0; +Platform* platform = 0; long lastsend = 0; -#define CURR knx.getGroupObject(1) -#define MAX knx.getGroupObject(2) -#define MIN knx.getGroupObject(3) -#define RESET knx.getGroupObject(4) +#define CURR knx->getGroupObject(1) +#define MAX knx->getGroupObject(2) +#define MIN knx->getGroupObject(3) +#define RESET knx->getGroupObject(4) void measureTemp() { - long now = platfrom.millis(); + long now = platform->millis(); if ((now - lastsend) < 10000) return; @@ -51,7 +50,7 @@ void resetCallback(GroupObject& go) void appLoop() { - if (!bau.configured()) + if (!knx->configured()) return; measureTemp(); @@ -60,12 +59,12 @@ void appLoop() void setup() { srand((unsigned int)time(NULL)); - knx.readMemory(); + knx->readMemory(); - if (knx.induvidualAddress() == 0) - knx.progMode(true); + if (knx->induvidualAddress() == 0) + knx->progMode(true); - if (knx.configured()) + if (knx->configured()) { CURR.dataPointType(Dpt(9, 1)); MIN.dataPointType(Dpt(9, 1)); @@ -74,24 +73,28 @@ void setup() MAX.valueNoSend(-273.0); RESET.dataPointType(Dpt(1, 15)); RESET.callback(resetCallback); - printf("Timeout: %d\n", bau.parameters().getWord(0)); - printf("Zykl. senden: %d\n", bau.parameters().getByte(2)); - printf("Min/Max senden: %d\n", bau.parameters().getByte(3)); - printf("Aenderung senden: %d\n", bau.parameters().getByte(4)); - printf("Abgleich %d\n", bau.parameters().getByte(5)); + printf("Timeout: %d\n", knx->paramWord(0)); + printf("Zykl. senden: %d\n", knx->paramByte(2)); + printf("Min/Max senden: %d\n", knx->paramByte(3)); + printf("Aenderung senden: %d\n", knx->paramByte(4)); + printf("Abgleich %d\n", knx->paramByte(5)); } - knx.start(); + knx->start(); } int main(int argc, char **argv) { + platform = new LinuxPlatform(argc, argv); + Bau57B0 bau(*platform); + knx = new KnxFacade(bau); + setup(); while (1) { - knx.loop(); - if(knx.configured()) + knx->loop(); + if(knx->configured()) appLoop(); - platfrom.mdelay(100); + platform->mdelay(100); } } \ No newline at end of file diff --git a/src/knx/bau_systemB.cpp b/src/knx/bau_systemB.cpp index 6438e2f..288f685 100644 --- a/src/knx/bau_systemB.cpp +++ b/src/knx/bau_systemB.cpp @@ -155,15 +155,9 @@ void BauSystemB::memoryReadIndication(Priority priority, HopCountType hopType, u void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap) { - // Flush the EEPROM before resetting _memory.writeMemory(); _platform.restart(); - - // for platforms that don't really restart - _memory.readMemory(); - _deviceObj.progMode(false); - _configured = true; } void BauSystemB::authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key) diff --git a/src/linux_platform.cpp b/src/linux_platform.cpp index ed763fd..958d288 100644 --- a/src/linux_platform.cpp +++ b/src/linux_platform.cpp @@ -29,10 +29,18 @@ #define MAX_MEM 4096 -LinuxPlatform::LinuxPlatform() +LinuxPlatform::LinuxPlatform(int argc, char** argv) { Platform::_memoryReference = (uint8_t*)malloc(MAX_MEM); _currentMaxMem = Platform::_memoryReference; + _args = new char*[argc + 1]; + memcpy(_args, argv, argc * sizeof(char*)); + _args[argc] = 0; +} + +LinuxPlatform::~LinuxPlatform() +{ + delete[] _args; } uint32_t LinuxPlatform::currentIpAddress() @@ -79,13 +87,7 @@ void LinuxPlatform::macAddress(uint8_t* data) void LinuxPlatform::restart() { - // clear alocated memory - if(_memoryReference != 0) - { - free(_memoryReference); - Platform::_memoryReference = (uint8_t*)malloc(MAX_MEM); - _currentMaxMem = Platform::_memoryReference; - } + execv(_args[0], _args); } void LinuxPlatform::fatalError() diff --git a/src/linux_platform.h b/src/linux_platform.h index 90b98d0..404325b 100644 --- a/src/linux_platform.h +++ b/src/linux_platform.h @@ -10,8 +10,9 @@ class LinuxPlatform: public Platform using Platform::_memoryReference; using Platform::memoryReference; public: - LinuxPlatform(); - + LinuxPlatform(int argc, char** argv); + virtual ~LinuxPlatform(); + std::string flashFilePath(); void flashFilePath(const std::string path); @@ -27,27 +28,29 @@ public: void restart() override; void fatalError() override; - //multicast - void setupMultiCast(uint32_t addr, uint16_t port) override; - void closeMultiCast() override; - bool sendBytes(uint8_t* buffer, uint16_t len) override; - int readBytes(uint8_t* buffer, uint16_t maxLen) override; - - //uart + //multicast + void setupMultiCast(uint32_t addr, uint16_t port) override; + void closeMultiCast() override; + bool sendBytes(uint8_t* buffer, uint16_t len) override; + int readBytes(uint8_t* buffer, uint16_t maxLen) override; + + //uart void setupUart() override; void closeUart() override; int uartAvailable() override; size_t writeUart(const uint8_t data) override; size_t writeUart(const uint8_t *buffer, size_t size) override; int readUart() override; - size_t readBytesUart(uint8_t *buffer, size_t length) override; - - //memory - uint8_t* getEepromBuffer(uint16_t size) override; - void commitToEeprom() override; - uint8_t* allocMemory(size_t size) override; - void freeMemory(uint8_t* ptr) override; -private: + size_t readBytesUart(uint8_t *buffer, size_t length) override; + + //memory + uint8_t* getEepromBuffer(uint16_t size) override; + void commitToEeprom() override; + uint8_t* allocMemory(size_t size) override; + void freeMemory(uint8_t* ptr) override; + void cmdlineArgs(int argc, char** argv); + + private: uint32_t _multicastAddr; uint16_t _port; int _socketFd = -1; @@ -56,6 +59,7 @@ private: int _fd = -1; uint8_t* _currentMaxMem = 0; std::string _flashFilePath = "flash.bin"; + char** _args; }; #endif \ No newline at end of file