/** * \file main.c * * \brief Serial Provisioning of LoRaWAN Demo Application * * Copyright (c) 2020 Europalab Devices ApS * * \asf_license_start * * \page License * * This file is part of Sendcomm. * * Sendcomm is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Sendcomm is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Sendcomm. If not, see . * * \asf_license_stop * */ /****************************** INCLUDES **************************************/ #include "system_low_power.h" #include "radio_driver_hal.h" #include "lorawan.h" #include "sys.h" #include "system_init.h" #include "system_assert.h" #include "aes_engine.h" #include "enddevice_demo.h" #include "sio2host.h" #include "extint.h" #include "conf_app.h" #include "sw_timer.h" #ifdef CONF_PMM_ENABLE #include "pmm.h" #include "conf_pmm.h" #include "sleep_timer.h" #include "sleep.h" #endif #include "conf_sio2host.h" #if (ENABLE_PDS == 1) #include "pds_interface.h" #endif #if (CERT_APP == 1) #include "conf_certification.h" #include "enddevice_cert.h" #endif /************************** Macro definition ***********************************/ /* Button debounce time in ms */ #define APP_DEBOUNCE_TIME 50 /************************** Global variables ***********************************/ bool button_pressed = false; bool factory_reset = false; bool bandSelected = false; uint32_t longPress = 0; uint8_t demoTimerId = 0xFF; uint8_t lTimerId = 0xFF; extern bool certAppEnabled; #ifdef CONF_PMM_ENABLE bool deviceResetsForWakeup = false; #endif /************************** Extern variables ***********************************/ /************************** Function Prototypes ********************************/ static void driver_init(void); #if (_DEBUG_ == 1) static void assertHandler(SystemAssertLevel_t level, uint16_t code); #endif /* #if (_DEBUG_ == 1) */ /*********************************************************************//** \brief Uninitializes app resources before going to low power mode *************************************************************************/ #ifdef CONF_PMM_ENABLE static void app_resources_uninit(void); #endif /****************************** FUNCTIONS **************************************/ static void print_reset_causes(void) { enum system_reset_cause rcause = system_get_reset_cause(); printf("Last reset cause: "); if(rcause & (1 << 6)) { printf("System Reset Request\r\n"); } if(rcause & (1 << 5)) { printf("Watchdog Reset\r\n"); } if(rcause & (1 << 4)) { printf("External Reset\r\n"); } if(rcause & (1 << 2)) { printf("Brown Out 33 Detector Reset\r\n"); } if(rcause & (1 << 1)) { printf("Brown Out 12 Detector Reset\r\n"); } if(rcause & (1 << 0)) { printf("Power-On Reset\r\n"); } } #ifdef CONF_PMM_ENABLE static void appWakeup(uint32_t sleptDuration) { HAL_Radio_resources_init(); sio2host_init(); printf("\r\nsleep_ok %ld ms\r\n", sleptDuration); } #endif #if (_DEBUG_ == 1) static void assertHandler(SystemAssertLevel_t level, uint16_t code) { printf("\r\n%04x\r\n", code); (void)level; } #endif /* #if (_DEBUG_ == 1) */ /** * \mainpage * \section preface Preface * This is the reference manual for the LORAWAN Demo Application of EU Band */ int main(void) { /* System Initialization */ system_init(); /* Initialize the delay driver */ delay_init(); /* Initialize the board target resources */ board_init(); INTERRUPT_GlobalInterruptEnable(); /* Initialize Hardware and Software Modules */ driver_init(); /* Initialize the Serial Interface */ sio2host_init(); print_reset_causes(); #if (_DEBUG_ == 1) SYSTEM_AssertSubscribe(assertHandler); #endif /* Initialize demo application */ Stack_Init(); SwTimerCreate(&demoTimerId); SwTimerCreate(&lTimerId); mote_demo_init(); while (1) { serial_data_handler(); SYSTEM_RunTasks(); #ifdef CONF_PMM_ENABLE if (false == certAppEnabled) { if(bandSelected == true) { PMM_SleepReq_t sleepReq; /* Put the application to sleep */ sleepReq.sleepTimeMs = DEMO_CONF_DEFAULT_APP_SLEEP_TIME_MS; sleepReq.pmmWakeupCallback = appWakeup; sleepReq.sleep_mode = CONF_PMM_SLEEPMODE_WHEN_IDLE; if (CONF_PMM_SLEEPMODE_WHEN_IDLE == SLEEP_MODE_STANDBY) { deviceResetsForWakeup = false; } if (true == LORAWAN_ReadyToSleep(deviceResetsForWakeup)) { app_resources_uninit(); if (PMM_SLEEP_REQ_DENIED == PMM_Sleep(&sleepReq)) { HAL_Radio_resources_init(); sio2host_init(); /*printf("\r\nsleep_not_ok\r\n");*/ } } } } #endif } } /* Initializes all the hardware and software modules used for Stack operation */ static void driver_init(void) { /* Initialize the Radio Hardware */ HAL_RadioInit(); /* Initialize the AES Hardware Engine */ AESInit(); /* Initialize the Software Timer Module */ SystemTimerInit(); #ifdef CONF_PMM_ENABLE /* Initialize the Sleep Timer Module */ SleepTimerInit(); #endif #if (ENABLE_PDS == 1) /* PDS Module Init */ PDS_Init(); #endif } #ifdef CONF_PMM_ENABLE static void app_resources_uninit(void) { /* Disable USART TX and RX Pins */ struct port_config pin_conf; port_get_config_defaults(&pin_conf); pin_conf.powersave = true; port_pin_set_config(HOST_SERCOM_PAD0_PIN, &pin_conf); port_pin_set_config(HOST_SERCOM_PAD1_PIN, &pin_conf); /* Disable UART module */ sio2host_deinit(); /* Disable Transceiver SPI Module */ HAL_RadioDeInit(); } #endif /** End of File */