/** * \file demo_output.c * * \brief Demo output Implementation. * * Copyright (c) 2019 Microchip Technology Inc. and its subsidiaries. * * \asf_license_start * * \page License * * Subject to your compliance with these terms, you may use Microchip * software and any derivatives exclusively with Microchip products. * It is your responsibility to comply with third party license terms applicable * to your use of third party software (including open source software) that * may accompany Microchip software. * * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. * * \asf_license_stop * */ #include "system.h" #include "miwi_config.h" #include "miwi_config_p2p.h" #include "miwi_api.h" #include "delay.h" #include "demo_output.h" #include "sio2host.h" #include "asf.h" #define DEBOUNCE_TIME 0x00003FFF bool PUSH_BUTTON_pressed; MIWI_TICK PUSH_BUTTON_press_time; void DemoOutput_Greeting(void) { #if defined (ENABLE_LCD) #if defined(PROTOCOL_P2P) LCDDisplay((char *)"Sendcomm LoRa P2P Demo on \n SAMR34 Node ", 0, true); #endif #endif #if defined (ENABLE_CONSOLE) #if defined(PROTOCOL_P2P) printf("\r\nStarting Node 1 of Sendcomm Demo for LoRa P2P Stack ..."); #endif #if defined(ENABLE_SLEEP_FEATURE) printf("\r\nReduced Function Device (RFD) operations") ; #else printf("\r\nFull Function Device (FFD) operations") ; #endif printf("\r\n RF Transceiver: SX_1276"); printf("\r\n Demo Instruction:"); printf("\r\n Power on the board until LED 1 lights up"); printf("\r\n to indicate connecting with peer."); printf("\r\n Push Button 1 to broadcast message."); printf("\r\n LED 1 will be toggled upon receiving messages. "); printf("\r\n\r\n"); #endif } void demo_output_freezer_options(void) { #if defined (ENABLE_LCD) LCDDisplay((char *)"SW: Use Nwk Freezer \nPress in 5 sec", 0, false); delay_ms(1000); #endif } void DemoOutput_Channel(uint8_t channel, uint8_t Step) { if( Step == 0 ) { #if defined (ENABLE_LCD) LCDDisplay((char *)"Connecting Peer on \n Channel ", channel, true); #endif #if defined (ENABLE_CONSOLE) #if !defined(MIWIKIT) printf("\r\nConnecting Peer on Channel "); printf("%d",channel); printf("\r\n"); #endif #endif } else { #if defined (ENABLE_LCD) LCDDisplay((char *)"Connected Peer on \n Channel ", channel, true); #endif #if defined (ENABLE_CONSOLE) #if !defined(MIWIKIT) printf("\r\nConnected Peer on Channel "); printf("%d",channel); printf("\r\n"); #endif #endif } } void DemoOutput_Instruction(void) { #if defined (ENABLE_LCD) #if defined (EXT_BOARD_OLED1_XPLAINED_PRO) LCDDisplay((char *)"SW : Broadcast \nBUTTON1: Unicast", 0, false); #else LCDDisplay((char *)"SW: Broadcast", 0, false); #endif #endif } void DemoOutput_HandleMessage(void) { uint8_t i; if( rxMessage.flags.bits.secEn ) { sio2host_tx((uint8_t *)"Secured ", sizeof("Secured ")); } if( rxMessage.flags.bits.broadcast ) { sio2host_tx((uint8_t *)"Broadcast Packet with RSSI ", sizeof("Broadcast Packet with RSSI ")); } else { sio2host_tx((uint8_t *)"Unicast Packet with RSSI ",sizeof("Unicast Packet with RSSI ")); } printf("%02x", rxMessage.PacketRSSI); if( rxMessage.flags.bits.srcPrsnt ) { sio2host_tx((uint8_t *)" from ", sizeof(" from ")); if( rxMessage.flags.bits.altSrcAddr ) { printf( "%x", rxMessage.SourceAddress[1]); printf( "%x", rxMessage.SourceAddress[0]); } else { for(i = 0; i < MY_ADDRESS_LENGTH; i++) { printf("%x", rxMessage.SourceAddress[MY_ADDRESS_LENGTH-1-i]); } } } sio2host_tx((uint8_t *)": ",sizeof(": ")); for(i = 0; i < rxMessage.PayloadSize; i++) { sio2host_putchar(rxMessage.Payload[i]); } printf("\r\n"); } void DemoOutput_UpdateTxRx(uint8_t TxNum, uint8_t RxNum) { #if defined (ENABLE_LCD) LCDTRXCount(TxNum, RxNum); #endif } void DemoOutput_ChannelError(uint8_t channel) { #if defined (ENABLE_CONSOLE) printf("\r\nSelection of channel "); printf("%d", channel); printf(" is not supported in current configuration.\r\n"); #endif } void DemoOutput_UnicastFail(void) { #if defined (ENABLE_CONSOLE) printf("\r\nUnicast Failed\r\n"); #endif #if defined (ENABLE_LCD) LCDDisplay((char *)" Unicast Failed", 0, true); #endif } void DemoOutput_BroadcastFail(void) { #if defined (ENABLE_CONSOLE) printf("\r\nBroadcast Failed\r\n"); #endif #if defined (ENABLE_LCD) LCDDisplay((char *)" Broadcast Failed", 0, true); #endif } /********************************************************************* * Function: uint8_t ButtonPressed(void) * * PreCondition: None * * Input: None * * Output: Return value to indicate which button has been pressed. * Return 0 if no button pressed. * * Side Effects: * * Overview: This function check if any button has been pressed * * Note: ********************************************************************/ uint8_t ButtonPressed(void) { MIWI_TICK tickDifference; if(!port_pin_get_input_level(BUTTON_0_PIN)) { //if the button was previously not pressed if(PUSH_BUTTON_pressed == false) { PUSH_BUTTON_pressed = true; PUSH_BUTTON_press_time.Val = MiWi_TickGet(); return 1; } } #if defined (EXT_BOARD_OLED1_XPLAINED_PRO) else if(!port_pin_get_input_level(WING_BUTTON_1)) { //if the button was previously not pressed if(PUSH_BUTTON_pressed == false) { PUSH_BUTTON_pressed = true; PUSH_BUTTON_press_time.Val = MiWi_TickGet(); return 2; } } #endif else { //get the current time MIWI_TICK t; t.Val = MiWi_TickGet(); //if the button has been released long enough tickDifference.Val = MiWi_TickGetDiff(t,PUSH_BUTTON_press_time); //then we can mark it as not pressed if(tickDifference.Val > DEBOUNCE_TIME) { PUSH_BUTTON_pressed = false; } } return 0; } #if (defined EXT_BOARD_OLED1_XPLAINED_PRO) /** * \brief Configures buttons */ void Buttons_init(void) { struct port_config conf; port_get_config_defaults(&conf); conf.direction = PORT_PIN_DIR_INPUT; conf.input_pull = PORT_PIN_PULL_UP; /* Configure all three buttons as inputs */ port_pin_set_config(WING_BUTTON_1, &conf); port_pin_set_config(WING_BUTTON_2, &conf); port_pin_set_config(WING_BUTTON_3, &conf); } #endif