Skip to content

Commit

Permalink
Added detection of radio module
Browse files Browse the repository at this point in the history
  • Loading branch information
alexreinert committed Aug 24, 2020
1 parent 53c63f0 commit cae2e99
Show file tree
Hide file tree
Showing 13 changed files with 444 additions and 76 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,13 @@ Hierbei gilt, dass bei einer debmatic oder piVCCU3 Installation immer nur ein Fu
* WebUI zur Konfiguration
* Intialpasswort: admin
* Firmware Update per Webinterface
* Erkennung des Funkmoduls und Ausgabe von Typ, Seriennummer, Funkadresse und SGTIN in der WebUI
* Regelmäßige Prüfung auf Firmwareupdates
* Werksreset per Taster

### Bekannte Einschränkungen
* Es findet kein automatischer Reconnect bei Verbindungsabbrüchen statt, nach einem Verbindungsabbruch muss die CCU Software daher neu gestartet werden
* Die Stromversorgung mittels des Funkmoduls RPI-RF-MOD darf nur erfolgen, wenn keine andere Stromversorgung (USB oder PoE) angeschlossen ist
* Nach einem Neustart der Platine (z.B. bei Stromausfall) findet kein automatischer Reconnect statt, in diesem Fall muss die CCU Software daher neu gestartet werden.
* Die Stromversorgung mittels des Funkmoduls RPI-RF-MOD darf nur erfolgen, wenn keine andere Stromversorgung (USB oder PoE) angeschlossen ist.

### Werksreset
Die Firmware kann per Taster auf Werkseinstellungen zurückgesetzt werden:
Expand Down Expand Up @@ -67,7 +68,6 @@ Die Unterstützung für die Platine HB-RF-ETH ist in piVCCU3 ab Version 3.51.6-4
Folgende Punkte sind angedacht für zukünftige Releases. Die Sortierung ist als zufällig anzusehen und es ist nicht garantiert, dass alle Punkte auch umgesetzt werden.

* Transportverschlüsselung raw-uart
* Detailerkennung des aufgesteckten Funkmoduls
* LED Fading
* SNMP
* CheckMK Agent
Expand Down
40 changes: 29 additions & 11 deletions include/hmframe.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,40 @@ class HMFrame

typedef enum
{
HM_DST_OS = 0,
HM_DST_APP = 0x01,
HM_DST_HMIP = 0x02,
HM_DST_HMSYSTEM = 0x00,
HM_DST_TRX = 0x01,
HM_DST_LLMAC = 0x03,
HM_DST_DUAL = 0xfe,
HM_DST_DUAL_ERR = 0xff,
HM_DST_COMMON = 0xfe,
} hm_dst_t;

typedef enum
{
HM_CMD_OS_GET_APP = 0,
HM_CMD_OS_CHANGE_APP = 3,
} hm_cmd_os_t;
HM_CMD_HMSYSTEM_IDENTIFY = 0x00,
HM_CMD_HMSYSTEM_GET_VERSION = 0x02,
HM_CMD_HMSYSTEM_START_APP = 0x03,
HM_CMD_HMSYSTEM_ACK = 0x04,
HM_CMD_HMSYSTEM_GET_SERIAL = 0x0b,
} hm_cmd_hmsystem_t;

typedef enum
{
HM_CMD_DUAL_GET_APP = 1,
HM_CMD_DUAL_CHANGE_APP = 2,
} hm_cmd_dual_t;
HM_CMD_TRX_GET_VERSION = 0x02,
HM_CMD_TRX_ACK = 0x04,
HM_CMD_TRX_GET_MCU_TYPE = 0x09,
HM_CMD_TRX_GET_DEFAULT_RF_ADDR = 0x10,
} hm_cmd_trx_t;

typedef enum
{
HM_CMD_LLMAC_ACK = 0x01,
HM_CMD_LLMAC_GET_SERIAL = 0x07,
HM_CMD_LLMAC_GET_DEFAULT_RF_ADDR = 0x08,
} hm_cmd_llmac_t;

typedef enum
{
HM_CMD_COMMON_IDENTIFY = 0x01,
HM_CMD_COMMON_START_APP = 0x03,
HM_CMD_COMMON_GET_SGTIN = 0x04,
HM_CMD_COMMON_ACK = 0x05,
} hm_cmd_common_t;
34 changes: 31 additions & 3 deletions include/radiomoduleconnector.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,49 @@
#include "led.h"
#include "streamparser.h"
#include <atomic>
#define _Atomic(X) std::atomic< X >
#define _Atomic(X) std::atomic<X>

typedef enum
{
RADIO_MODULE_NONE = 0,
RADIO_MODULE_HM_MOD_RPI_PCB = 3,
RADIO_MODULE_RPI_RF_MOD = 4,
} radio_module_type_t;

class FrameHandler
{
public:
virtual void handleFrame(unsigned char *buffer, uint16_t len) = 0;
};

class RadioModuleConnector
class RadioModuleConnector : private FrameHandler
{
private:
LED *_redLED;
LED *_greenLED;
LED *_blueLED;
StreamParser *_streamParser;
std::atomic<FrameHandler*> _frameHandler = ATOMIC_VAR_INIT(0);
std::atomic<FrameHandler *> _frameHandler = ATOMIC_VAR_INIT(0);
QueueHandle_t _uart_queue;
TaskHandle_t _tHandle = NULL;

void sendFrame(uint8_t counter, uint8_t destination, uint8_t command, unsigned char *data, uint data_len);
void _handleFrame(unsigned char *buffer, uint16_t len);

void detectRadioModule();
void handleFrame(unsigned char *buffer, uint16_t len);

char _serial[11] = {0};
uint32_t _radioMAC;
char _sgtin[25] = {0};
uint8_t _firmwareVersion[3];
radio_module_type_t _radioModuleType;

int _detectState;
int _detectRetryCount;
int _detectMsgCounter;
SemaphoreHandle_t _detectWaitFrameDataSemaphore;

public:
RadioModuleConnector(LED *redLED, LED *greenLed, LED *blueLed);

Expand All @@ -60,5 +82,11 @@ class RadioModuleConnector

void sendFrame(unsigned char *buffer, uint16_t len);

const char *getSerial();
uint32_t getRadioMAC();
const char *getSGTIN();
const uint8_t *getFirmwareVersion();
radio_module_type_t getRadioModuleType();

void _serialQueueHandler();
};
15 changes: 8 additions & 7 deletions include/rawuartudplistener.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,30 @@
#include "lwip/udp.h"
#include "lwip/priv/tcpip_priv.h"
#include <atomic>
#define _Atomic(X) std::atomic< X >
#define _Atomic(X) std::atomic<X>
#include "radiomoduleconnector.h"

class RawUartUdpListener : FrameHandler {
class RawUartUdpListener : FrameHandler
{
private:
RadioModuleConnector* _radioModuleConnector;
RadioModuleConnector *_radioModuleConnector;
std::atomic<uint> _remoteAddress;
std::atomic<ushort> _remotePort;
std::atomic<bool> _connectionStarted;
std::atomic<int> _counter;
std::atomic<int> _endpointConnectionIdentifier;
uint64_t _lastReceivedKeepAlive;
udp_pcb* _pcb;
udp_pcb *_pcb;
QueueHandle_t _udp_queue;
TaskHandle_t _tHandle = NULL;

void handlePacket(pbuf *pb, ip4_addr_t addr, uint16_t port);
void sendMessage(unsigned char command, unsigned char* buffer, size_t len);
void sendMessage(unsigned char command, unsigned char *buffer, size_t len);

public:
RawUartUdpListener(RadioModuleConnector* radioModuleConnector);
RawUartUdpListener(RadioModuleConnector *radioModuleConnector);

void handleFrame(unsigned char* buffer, uint16_t len);
void handleFrame(unsigned char *buffer, uint16_t len);
void handleEvent();

ip4_addr_t getConnectedRemoteAddress();
Expand Down
21 changes: 12 additions & 9 deletions include/streamparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,21 @@ class StreamParser
{
private:
unsigned char _buffer[2048];
uint16_t _buffer_pos;
uint16_t _frame_pos;
uint16_t _frame_length;
uint16_t _bufferPos;
uint16_t _framePos;
uint16_t _frameLength;
state_t _state;
bool _is_escaped;
bool _decode_escaped;
bool _isEscaped;
bool _decodeEscaped;
std::function<void(unsigned char *buffer, uint16_t len)> _processor;

public:
StreamParser(bool decode_escaped, std::function<void(unsigned char *buffer, uint16_t len)> processor);
StreamParser(bool decodeEscaped, std::function<void(unsigned char *buffer, uint16_t len)> processor);

void Append(unsigned char chr);
void Append(unsigned char *buffer, uint16_t len);
void Flush();
void append(unsigned char chr);
void append(unsigned char *buffer, uint16_t len);
void flush();

bool getDecodeEscaped();
void setDecodeEscaped(bool decodeEscaped);
};
2 changes: 1 addition & 1 deletion include/webui.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class WebUI
httpd_handle_t _httpd_handle;

public:
WebUI(Settings* settings, LED* statusLED, SysInfo *sysInfo, UpdateCheck* updateCheck, RawUartUdpListener* rawUartUdpListener);
WebUI(Settings* settings, LED* statusLED, SysInfo *sysInfo, UpdateCheck* updateCheck, RawUartUdpListener* rawUartUdpListener, RadioModuleConnector* radioModuleConnector);
void start();
void stop();
};
30 changes: 29 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,34 @@ void app_main()
Ethernet ethernet(&settings);
ethernet.start();

radio_module_type_t radioModuleType = radioModuleConnector.getRadioModuleType();
if (radioModuleType != RADIO_MODULE_NONE)
{
switch (radioModuleType)
{
case RADIO_MODULE_HM_MOD_RPI_PCB:
ESP_LOGI(TAG, "Detected HM-MOD-RPI-PCB:");
break;
case RADIO_MODULE_RPI_RF_MOD:
ESP_LOGI(TAG, "Detected RPI-RF-MOD:");
break;
default:
ESP_LOGI(TAG, "Detected unknown radio module:");
break;
}

ESP_LOGI(TAG, " Serial: %s", radioModuleConnector.getSerial());
ESP_LOGI(TAG, " SGTIN: %s", radioModuleConnector.getSGTIN());
ESP_LOGI(TAG, " Radio MAC: 0x%06x", radioModuleConnector.getRadioMAC());

const uint8_t *firmwareVersion = radioModuleConnector.getFirmwareVersion();
ESP_LOGI(TAG, " Firmware Version: %d.%d.%d", *firmwareVersion, *(firmwareVersion + 1), *(firmwareVersion + 2));
}
else
{
ESP_LOGW(TAG, "Radio module could not be detected.");
}

setenv("TZ", "UTC0", 1);
tzset();

Expand Down Expand Up @@ -116,7 +144,7 @@ void app_main()
UpdateCheck updateCheck(&sysInfo, &statusLED);
updateCheck.start();

WebUI webUI(&settings, &statusLED, &sysInfo, &updateCheck, &rawUartUdpLister);
WebUI webUI(&settings, &statusLED, &sysInfo, &updateCheck, &rawUartUdpLister, &radioModuleConnector);
webUI.start();

powerLED.setState(LED_STATE_ON);
Expand Down
Loading

0 comments on commit cae2e99

Please sign in to comment.