|
|
|
@ -17,12 +17,6 @@ using namespace events; |
|
|
|
|
|
|
|
|
|
|
|
uint8_t rx_buffer[LORAMAC_PHY_MAXPAYLOAD]; |
|
|
|
uint8_t rx_buffer[LORAMAC_PHY_MAXPAYLOAD]; |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for |
|
|
|
|
|
|
|
* testing |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
#define TX_TIMER 30000 //600000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Maximum number of events for the event queue. |
|
|
|
* Maximum number of events for the event queue. |
|
|
|
* 16 is the safe number for the stack events, however, if application |
|
|
|
* 16 is the safe number for the stack events, however, if application |
|
|
|
@ -60,37 +54,37 @@ int main(void) { |
|
|
|
lorawan_status_t retcode; |
|
|
|
lorawan_status_t retcode; |
|
|
|
|
|
|
|
|
|
|
|
#if MBED_CONF_APP_HX711_ENABLED |
|
|
|
#if MBED_CONF_APP_HX711_ENABLED |
|
|
|
|
|
|
|
loadcell.powerDown(); |
|
|
|
loadcell.setScale(MBED_CONF_APP_HX711_SCALE); |
|
|
|
loadcell.setScale(MBED_CONF_APP_HX711_SCALE); |
|
|
|
loadcell.setOffset(MBED_CONF_APP_HX711_OFFSET); |
|
|
|
loadcell.setOffset(MBED_CONF_APP_HX711_OFFSET); |
|
|
|
loadcell.powerDown(); |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Initialize LoRaWAN stack
|
|
|
|
// Initialize LoRaWAN stack
|
|
|
|
if(lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
|
|
|
if(lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { |
|
|
|
printf("\r\n LoRa initialization failed! \r\n"); |
|
|
|
debug("\r\n LoRa initialization failed! \r\n"); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n Mbed LoRaWANStack initialized \r\n"); |
|
|
|
debug("\r\n Mbed LoRaWANStack initialized \r\n"); |
|
|
|
|
|
|
|
|
|
|
|
callbacks.events = mbed::callback(lora_event_handler); |
|
|
|
callbacks.events = mbed::callback(lora_event_handler); |
|
|
|
lorawan.add_app_callbacks(&callbacks); |
|
|
|
lorawan.add_app_callbacks(&callbacks); |
|
|
|
|
|
|
|
|
|
|
|
// Set number of retries in case of CONFIRMED messages
|
|
|
|
// Set number of retries in case of CONFIRMED messages
|
|
|
|
if(lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) != LORAWAN_STATUS_OK) { |
|
|
|
if(lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) != LORAWAN_STATUS_OK) { |
|
|
|
printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n"); |
|
|
|
debug("\r\n set_confirmed_msg_retries failed! \r\n\r\n"); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n CONFIRMED message retries : %d \r\n", CONFIRMED_MSG_RETRY_COUNTER); |
|
|
|
debug("\r\n CONFIRMED message retries : %d \r\n", CONFIRMED_MSG_RETRY_COUNTER); |
|
|
|
|
|
|
|
|
|
|
|
// Enable adaptive data rate
|
|
|
|
// Enable adaptive data rate
|
|
|
|
if(lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
|
|
|
if(lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) { |
|
|
|
printf("\r\n enable_adaptive_datarate failed! \r\n"); |
|
|
|
debug("\r\n enable_adaptive_datarate failed! \r\n"); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n Adaptive data rate (ADR) - Enabled \r\n"); |
|
|
|
debug("\r\n Adaptive data rate (ADR) - Enabled \r\n"); |
|
|
|
|
|
|
|
|
|
|
|
//led = 0;
|
|
|
|
//led = 0;
|
|
|
|
|
|
|
|
|
|
|
|
@ -98,11 +92,11 @@ int main(void) { |
|
|
|
|
|
|
|
|
|
|
|
if(retcode == LORAWAN_STATUS_OK || retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
|
|
|
if(retcode == LORAWAN_STATUS_OK || retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
printf("\r\n Connection error, code = %d \r\n", retcode); |
|
|
|
debug("\r\n Connection error, code = %d \r\n", retcode); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n Connection - In Progress ...\r\n"); |
|
|
|
debug("\r\n Connection - In Progress ...\r\n"); |
|
|
|
|
|
|
|
|
|
|
|
// make your event queue dispatching events forever
|
|
|
|
// make your event queue dispatching events forever
|
|
|
|
ev_queue.dispatch_forever(); |
|
|
|
ev_queue.dispatch_forever(); |
|
|
|
@ -118,7 +112,7 @@ static void send_message() { |
|
|
|
|
|
|
|
|
|
|
|
#if MBED_CONF_APP_BATTERY_ENABLED |
|
|
|
#if MBED_CONF_APP_BATTERY_ENABLED |
|
|
|
float vbat = bat.read(); |
|
|
|
float vbat = bat.read(); |
|
|
|
vbat = vbat * 5 / 3 * 3.3f; |
|
|
|
vbat = vbat * MBED_CONF_APP_BATTERY_RATIO * 3.3f; |
|
|
|
cayenne.addAnalogInput(1, vbat); |
|
|
|
cayenne.addAnalogInput(1, vbat); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
@ -126,15 +120,17 @@ static void send_message() { |
|
|
|
int err = dht.read(); |
|
|
|
int err = dht.read(); |
|
|
|
if(err == DHT::SUCCESS) { |
|
|
|
if(err == DHT::SUCCESS) { |
|
|
|
cayenne.addTemperature(1, dht.getTemperature()); |
|
|
|
cayenne.addTemperature(1, dht.getTemperature()); |
|
|
|
cayenne.addRelativeHumidity(2, dht.getHumidity()); |
|
|
|
cayenne.addRelativeHumidity(1, dht.getHumidity()); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
printf("Error code : %d\r\n", err); |
|
|
|
debug("Error code : %d\r\n", err); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if MBED_CONF_APP_HX711_ENABLED |
|
|
|
#if MBED_CONF_APP_HX711_ENABLED |
|
|
|
loadcell.powerUp(); |
|
|
|
loadcell.powerUp(); |
|
|
|
|
|
|
|
if (loadcell.waitReadyRetry(20, 100)) { |
|
|
|
cayenne.addAnalogInput(2, loadcell.getUnits(5)); |
|
|
|
cayenne.addAnalogInput(2, loadcell.getUnits(5)); |
|
|
|
|
|
|
|
} |
|
|
|
loadcell.powerDown(); |
|
|
|
loadcell.powerDown(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
@ -147,12 +143,12 @@ static void send_message() { |
|
|
|
MSG_UNCONFIRMED_FLAG); |
|
|
|
MSG_UNCONFIRMED_FLAG); |
|
|
|
|
|
|
|
|
|
|
|
if(retcode < 0) { |
|
|
|
if(retcode < 0) { |
|
|
|
retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") |
|
|
|
retcode == LORAWAN_STATUS_WOULD_BLOCK ? debug("send - WOULD BLOCK\r\n") |
|
|
|
: printf("\r\n send() - Error code %d \r\n", retcode); |
|
|
|
: debug("\r\n send() - Error code %d \r\n", retcode); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n %d bytes scheduled for transmission \r\n", retcode); |
|
|
|
debug("\r\n %d bytes scheduled for transmission \r\n", retcode); |
|
|
|
cayenne.reset(); |
|
|
|
cayenne.reset(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -165,17 +161,17 @@ static void receive_message() { |
|
|
|
MSG_CONFIRMED_FLAG | MSG_UNCONFIRMED_FLAG); |
|
|
|
MSG_CONFIRMED_FLAG | MSG_UNCONFIRMED_FLAG); |
|
|
|
|
|
|
|
|
|
|
|
if(retcode < 0) { |
|
|
|
if(retcode < 0) { |
|
|
|
printf("\r\n receive() - Error code %d \r\n", retcode); |
|
|
|
debug("\r\n receive() - Error code %d \r\n", retcode); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf(" Data:"); |
|
|
|
debug(" Data:"); |
|
|
|
|
|
|
|
|
|
|
|
for(uint8_t i = 0; i < retcode; i++) { |
|
|
|
for(uint8_t i = 0; i < retcode; i++) { |
|
|
|
printf("%x", rx_buffer[i]); |
|
|
|
debug("%x", rx_buffer[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("\r\n Data Length: %d\r\n", retcode); |
|
|
|
debug("\r\n Data Length: %d\r\n", retcode); |
|
|
|
|
|
|
|
|
|
|
|
memset(rx_buffer, 0, LORAMAC_PHY_MAXPAYLOAD); |
|
|
|
memset(rx_buffer, 0, LORAMAC_PHY_MAXPAYLOAD); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -184,20 +180,21 @@ static void lora_event_handler(lorawan_event_t event) { |
|
|
|
switch(event) { |
|
|
|
switch(event) { |
|
|
|
case CONNECTED: |
|
|
|
case CONNECTED: |
|
|
|
//led = 1;
|
|
|
|
//led = 1;
|
|
|
|
printf("\r\n Connection - Successful \r\n"); |
|
|
|
debug("\r\n Connection - Successful \r\n"); |
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
send_message(); |
|
|
|
send_message(); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
ev_queue.call_every(TX_TIMER, send_message); |
|
|
|
send_message(); |
|
|
|
|
|
|
|
ev_queue.call_every(MBED_CONF_APP_TX_TIMER, send_message); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
case DISCONNECTED: |
|
|
|
case DISCONNECTED: |
|
|
|
ev_queue.break_dispatch(); |
|
|
|
ev_queue.break_dispatch(); |
|
|
|
printf("\r\n Disconnected Successfully \r\n"); |
|
|
|
debug("\r\n Disconnected Successfully \r\n"); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case TX_DONE: |
|
|
|
case TX_DONE: |
|
|
|
printf("\r\n Message Sent to Network Server \r\n"); |
|
|
|
debug("\r\n Message Sent to Network Server \r\n"); |
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
send_message(); |
|
|
|
send_message(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -206,22 +203,22 @@ static void lora_event_handler(lorawan_event_t event) { |
|
|
|
case TX_ERROR: |
|
|
|
case TX_ERROR: |
|
|
|
case TX_CRYPTO_ERROR: |
|
|
|
case TX_CRYPTO_ERROR: |
|
|
|
case TX_SCHEDULING_ERROR: |
|
|
|
case TX_SCHEDULING_ERROR: |
|
|
|
printf("\r\n Transmission Error - EventCode = %d \r\n", event); |
|
|
|
debug("\r\n Transmission Error - EventCode = %d \r\n", event); |
|
|
|
// try again
|
|
|
|
// try again
|
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
if(MBED_CONF_LORA_DUTY_CYCLE_ON) { |
|
|
|
send_message(); |
|
|
|
send_message(); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RX_DONE: |
|
|
|
case RX_DONE: |
|
|
|
printf("\r\n Received message from Network Server \r\n"); |
|
|
|
debug("\r\n Received message from Network Server \r\n"); |
|
|
|
receive_message(); |
|
|
|
receive_message(); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case RX_TIMEOUT: |
|
|
|
case RX_TIMEOUT: |
|
|
|
case RX_ERROR: |
|
|
|
case RX_ERROR: |
|
|
|
printf("\r\n Error in reception - Code = %d \r\n", event); |
|
|
|
debug("\r\n Error in reception - Code = %d \r\n", event); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case JOIN_FAILURE: |
|
|
|
case JOIN_FAILURE: |
|
|
|
printf("\r\n OTAA Failed - Check Keys \r\n"); |
|
|
|
debug("\r\n OTAA Failed - Check Keys \r\n"); |
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
MBED_ASSERT("Unknown Event"); |
|
|
|
MBED_ASSERT("Unknown Event"); |
|
|
|
|