diff --git a/libraries/includes/defines.h b/libraries/includes/defines.h new file mode 100644 index 0000000..3610300 --- /dev/null +++ b/libraries/includes/defines.h @@ -0,0 +1,17 @@ +#ifndef _DEFINES_H_ +#define _DEFINES_H_ + + + +#define RX_PIN 7 +#define TX_PIN 6 +#define RE_PIN 5 +#define DE_PIN 4 +#define LED_RED 3 +#define LED_GREEN 2 +#define LED_BLUE 45 + + + + +#endif /* _DEFINES_H_ */ \ No newline at end of file diff --git a/sketch/config.cpp b/sketch/config.cpp new file mode 100644 index 0000000..475f395 --- /dev/null +++ b/sketch/config.cpp @@ -0,0 +1,61 @@ +#include +#include +#include "config.h" +#include "LoRaWan_APP.h" + + +#if 0 +/* OTAA para*/ +uint8_t devEui[] = { 0x22, 0x32, 0x33, 0x00, 0x00, 0x88, 0x88, 0x02 }; +uint8_t appEui[] = { 0xa0, 0x57, 0x81, 0x00, 0x01, 0x12, 0xaa, 0xf3 }; +uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }; + + +/* ABP para*/ +uint8_t nwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 }; +uint8_t appSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 }; +uint32_t devAddr = ( uint32_t )0x007e6ae1; + +void configInit() { + +} + +#else + +config_t myConfig = { + .devEui = { 0x22, 0x32, 0x33, 0x00, 0x00, 0x88, 0x88, 0x02 }, + .appEui = { 0xa0, 0x57, 0x81, 0x00, 0x01, 0x12, 0xaa, 0xf3 }, + .appKey = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }, + .nwkSKey = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + .appSKey = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, + .devAddr = 0, + .overTheAirActivation = true, + .modbus_poll_slots = { + { .typ = INPUT_REGISTERS, .id = 7, .address = 0x01 }, + { .typ = INPUT_REGISTERS, .id = 7, .address = 0x02 }, + { .typ = UNASSIGNED, .id = 0, .address = 0 }, + } +}; + +// these variables are defined as externals in the LoRaWAN stack +uint8_t devEui[sizeof(myConfig.devEui)]; +uint8_t appEui[sizeof(myConfig.appEui)]; +uint8_t appKey[sizeof(myConfig.appKey)]; +uint8_t nwkSKey[sizeof(myConfig.nwkSKey)]; +uint8_t appSKey[sizeof(myConfig.appSKey)]; +uint32_t devAddr; +LoRaMacRegion_t loraWanRegion; +bool overTheAirActivation; + +void configInit() { + memcpy(devEui, myConfig.devEui, sizeof(devEui)); + memcpy(appEui, myConfig.appEui, sizeof(appEui)); + memcpy(appKey, myConfig.appKey, sizeof(appKey)); + memcpy(nwkSKey, myConfig.nwkSKey, sizeof(nwkSKey)); + memcpy(appSKey, myConfig.appSKey, sizeof(appSKey)); + devAddr = myConfig.devAddr; + loraWanRegion = LORAMAC_REGION_EU868; + overTheAirActivation = myConfig.overTheAirActivation; +} +#endif + diff --git a/sketch/config.h b/sketch/config.h new file mode 100644 index 0000000..0d2a350 --- /dev/null +++ b/sketch/config.h @@ -0,0 +1,39 @@ +#ifndef _CONFIG_H_ +#define _CONFIG_H_ + +#include +#include +#include + + +#define MAX_MODBUS_POLL_SLOTS 16 + +#define UNASSIGNED 0 +#define COILS 1 +#define DISCRETE_INPUTS 2 +#define HOLDING_REGISTERS 3 +#define INPUT_REGISTERS 4 + +typedef struct modbus_poll_s { + int typ; + int id; + int address; +} modbus_poll_t; + +typedef struct config_s { + uint8_t devEui[8]; + uint8_t appEui[8]; + uint8_t appKey[16]; + uint8_t nwkSKey[16]; + uint8_t appSKey[16]; + uint32_t devAddr; + bool overTheAirActivation; + modbus_poll_t modbus_poll_slots[MAX_MODBUS_POLL_SLOTS]; +} config_t; + + +void configInit(); + + + +#endif /* _CONFIG_H_ */ \ No newline at end of file diff --git a/sketch/sketch.ino b/sketch/sketch.ino index f8f4892..31987e4 100644 --- a/sketch/sketch.ino +++ b/sketch/sketch.ino @@ -1,45 +1,25 @@ #include "LoRaWan_APP.h" -// #include +#include #include +#include "defines.h" +#include "config.h" +#include -#define RX_PIN 7 -#define TX_PIN 6 -#define RE_PIN 5 -#define DE_PIN 4 -#define LED_RED 3 -#define LED_GREEN 2 -#define LED_BLUE 45 +// from config.cpp +extern config_t myConfig; - -/* OTAA para*/ -uint8_t devEui[] = { 0x22, 0x32, 0x33, 0x00, 0x00, 0x88, 0x88, 0x02 }; -uint8_t appEui[] = { 0xa0, 0x57, 0x81, 0x00, 0x01, 0x12, 0xaa, 0xf3 }; -uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }; - - -/* ABP para*/ -uint8_t nwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 }; -uint8_t appSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 }; -uint32_t devAddr = ( uint32_t )0x007e6ae1; - /*LoraWan channelsmask, default channels 0-7*/ uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 }; -/*LoraWan region, select in arduino IDE tools*/ -LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; - /*LoraWan Class, Class A and Class C are supported*/ DeviceClass_t loraWanClass = CLASS_A; /*the application data transmission duty cycle. value in [ms].*/ uint32_t appTxDutyCycle = 15000; -/*OTAA or ABP*/ -bool overTheAirActivation = true; - /*ADR enable*/ bool loraWanAdr = true; @@ -76,43 +56,47 @@ ModbusRTUClientClass* pModbusClient; /* Prepares the payload of the frame */ static void prepareTxFrame( uint8_t port ) { - /*appData size is LORAWAN_APP_DATA_MAX_SIZE which is defined in "commissioning.h". - *appDataSize max value is LORAWAN_APP_DATA_MAX_SIZE. - *if enabled AT, don't modify LORAWAN_APP_DATA_MAX_SIZE, it may cause system hanging or failure. - *if disabled AT, LORAWAN_APP_DATA_MAX_SIZE can be modified, the max value is reference to lorawan region and SF. - *for example, if use REGION_CN470, - *the max value for different DR can be found in MaxPayloadOfDatarateCN470 refer to DataratesCN470 and BandwidthsCN470 in "RegionCN470.h". - */ - appDataSize = 8; - - Serial.println("modbus operation"); - - long v1 = pModbusClient->inputRegisterRead(7, 0x01); - Serial.print("v1: "); - Serial.println(v1); - memcpy(appData, &v1, 4); - - long v2 = pModbusClient->inputRegisterRead(7, 0x02); - Serial.print("v2: "); - Serial.println(v2); - memcpy(appData+4, &v2, 4); - - //appData[0] = 0x10; - //appData[1] = 0x21; - //appData[2] = 0x32; - //appData[3] = 0x43; + Serial.println("modbus operation"); + appDataSize = 0; + for (modbus_poll_t *slot = myConfig.modbus_poll_slots; slot->typ != 0; slot++) { + Serial.printf("Slot: %d, %d, %d\r\n", slot->typ, slot->id, slot->address); + switch (slot->typ) { + case HOLDING_REGISTERS: + { + long v; + if (appDataSize + sizeof(v) < LORAWAN_APP_DATA_MAX_SIZE) { + v = pModbusClient->holdingRegisterRead(slot->id, slot->address); + Serial.println(v); + memcpy(appData + appDataSize, &v, sizeof(v)); + appDataSize += sizeof(v); + } else { + Serial.println("too much data for LoRaWAN packet"); + } + } + break; + case INPUT_REGISTERS: + { + long v; + if (appDataSize + sizeof(v) < LORAWAN_APP_DATA_MAX_SIZE) { + v = pModbusClient->inputRegisterRead(slot->id, slot->address); + Serial.println(v); + memcpy(appData + appDataSize, &v, sizeof(v)); + appDataSize += sizeof(v); + } else { + Serial.println("too much data for LoRaWAN packet"); + } + } + break; + default: + Serial.println("unknown typ, doing nothing"); + break; + } + } } -//if true, next uplink will add MOTE_MAC_DEVICE_TIME_REQ void setup() { - Serial.begin(115200); - Serial1.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); - pRS485_1 = new RS485Class(Serial1, TX_PIN, RE_PIN, DE_PIN); - pModbusClient = new ModbusRTUClientClass(*pRS485_1); - pModbusClient->begin(9600, SERIAL_8N1); - pinMode(LED_BLUE, OUTPUT); digitalWrite(LED_BLUE, LOW); pinMode(LED_RED, OUTPUT); @@ -120,14 +104,21 @@ void setup() { pinMode(LED_GREEN, OUTPUT); digitalWrite(LED_GREEN, LOW); + Serial.begin(115200); + + Serial1.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); + pRS485_1 = new RS485Class(Serial1, TX_PIN, RE_PIN, DE_PIN); + pModbusClient = new ModbusRTUClientClass(*pRS485_1); + pModbusClient->begin(9600, SERIAL_8N1); + + configInit(); + Mcu.begin(); deviceState = DEVICE_STATE_INIT; } void loop() { -#if 1 - digitalWrite(LED_GREEN, HIGH); switch( deviceState ) @@ -175,25 +166,4 @@ void loop() break; } } -#endif - -#if 0 - // for (slave) id 1: write the value of 0x01, to the coil at address 0x00 - if (!ModbusRTUClient.coilWrite(1, 0x00, 0x01)) { - Serial.print("Failed to write coil! "); - Serial.println(ModbusRTUClient.lastError()); - } - - // wait for 1 second - delay(1000); - - // for (slave) id 1: write the value of 0x00, to the coil at address 0x00 - if (!ModbusRTUClient.coilWrite(1, 0x00, 0x00)) { - Serial.print("Failed to write coil! "); - Serial.println(ModbusRTUClient.lastError()); - } - - // wait for 1 second - delay(1000); -#endif }