fholin fholin / Mbed 2 deprecated MiniMousetest

Dependencies:   mbed

Committer:
fholin
Date:
Mon Dec 18 16:31:11 2017 +0000
Revision:
1:eda561b01daf
Parent:
0:2325d1d28df3
inline with github repository : ; https://github.com/LoRaWanMiniMouse/Mini-Mouse.git

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fholin 0:2325d1d28df3 1 /*
fholin 0:2325d1d28df3 2
fholin 0:2325d1d28df3 3 __ __ _ _
fholin 0:2325d1d28df3 4 | \/ (_) (_)
fholin 0:2325d1d28df3 5 | \ / |_ _ __ _ _ __ ___ ___ _ _ ___ ___
fholin 0:2325d1d28df3 6 | |\/| | | '_ \| | '_ ` _ \ / _ \| | | / __|/ _ \
fholin 0:2325d1d28df3 7 | | | | | | | | | | | | | | (_) | |_| \__ \ __/
fholin 0:2325d1d28df3 8 |_| |_|_|_| |_|_|_| |_| |_|\___/ \__,_|___/\___|
fholin 0:2325d1d28df3 9
fholin 0:2325d1d28df3 10
fholin 0:2325d1d28df3 11 Description : LoraWan Phy Layer objets.
fholin 0:2325d1d28df3 12
fholin 0:2325d1d28df3 13
fholin 0:2325d1d28df3 14 License : Revised BSD License, see LICENSE.TXT file include in the project
fholin 0:2325d1d28df3 15
fholin 0:2325d1d28df3 16 Maintainer : Fabien Holin (SEMTECH)
fholin 0:2325d1d28df3 17 */
fholin 0:2325d1d28df3 18 #include "PhyLayer.h"
fholin 0:2325d1d28df3 19 #include "sx1276-hal.h"
fholin 0:2325d1d28df3 20 #include "sx1276Regs-LoRa.h"
fholin 0:2325d1d28df3 21 #include "MacLayer.h"
fholin 0:2325d1d28df3 22 #include "LoraWanProcess.h"
fholin 0:2325d1d28df3 23 #include "ApiRtc.h"
fholin 1:eda561b01daf 24 #include "Define.h"
fholin 0:2325d1d28df3 25
fholin 0:2325d1d28df3 26 static RadioEvents_t RadioEvents;
fholin 0:2325d1d28df3 27
fholin 0:2325d1d28df3 28
fholin 0:2325d1d28df3 29
fholin 0:2325d1d28df3 30 RadioContainer::RadioContainer( PinName interrupt )
fholin 1:eda561b01daf 31 :Radio( NULL ), TxInterrupt( interrupt ), RxTimeoutInterrupt ( RX_TIMEOUT_IT ) {
fholin 0:2325d1d28df3 32 StateRadioProcess = RADIOSTATE_IDLE;
fholin 0:2325d1d28df3 33 TxInterrupt.rise( this,&RadioContainer::IsrRadio );
fholin 0:2325d1d28df3 34 RxTimeoutInterrupt.rise( this,&RadioContainer::IsrRadio );
fholin 0:2325d1d28df3 35 TimestampRtcIsr =0;
fholin 0:2325d1d28df3 36 TxFrequency = 868100000;
fholin 0:2325d1d28df3 37 TxPower = 14;
fholin 0:2325d1d28df3 38 TxSf = 7;
fholin 0:2325d1d28df3 39 };
fholin 0:2325d1d28df3 40 RadioContainer::~RadioContainer( ) {
fholin 0:2325d1d28df3 41 };
fholin 0:2325d1d28df3 42
fholin 0:2325d1d28df3 43 /*******************Isr Radio ***************************************/
fholin 0:2325d1d28df3 44 /* Timestamp isr with RTC */
fholin 0:2325d1d28df3 45 /* Read IrqFlags Register /clear Irq flag */
fholin 0:2325d1d28df3 46 /* Update the StateRadioProcess */
fholin 0:2325d1d28df3 47 /* Cpy data +meta data in case of reception & crc ok */
fholin 0:2325d1d28df3 48 /* Set Radio in Sleep Mode */
fholin 0:2325d1d28df3 49 /*******************Isr Radio ***************************************/
fholin 0:2325d1d28df3 50 void RadioContainer::IsrRadio( void ) {
fholin 0:2325d1d28df3 51 int status = OKLORAWAN;
fholin 0:2325d1d28df3 52 GetIrqRadioFlag ( );
fholin 0:2325d1d28df3 53 ClearIrqRadioFlag ( );
fholin 0:2325d1d28df3 54 if ( RegIrqFlag == RECEIVEPACKETIRQFLAG ) {//@ note (important for phy ) remove all IT mask in config send or rx and check if regirqflag = rxdone + header crc valid
fholin 0:2325d1d28df3 55 status = DumpRxPayloadAndMetadata ( );
fholin 0:2325d1d28df3 56 if ( status != OKLORAWAN ) { // Case receive a packet but it isn't a valid packet
fholin 0:2325d1d28df3 57 RegIrqFlag = BADPACKETIRQFLAG ; // this case is exactly the same than the case of rx timeout
fholin 0:2325d1d28df3 58 }
fholin 0:2325d1d28df3 59 }
fholin 0:2325d1d28df3 60 Radio.Sleep ( );
fholin 0:2325d1d28df3 61 switch ( StateRadioProcess ) {
fholin 0:2325d1d28df3 62 case RADIOSTATE_TXON :
fholin 0:2325d1d28df3 63 TimestampRtcIsr = RtcGetTimeMs ( ); //@info Timestamp only on txdone it
fholin 0:2325d1d28df3 64 StateRadioProcess = RADIOSTATE_TXFINISHED;
fholin 0:2325d1d28df3 65 break;
fholin 0:2325d1d28df3 66
fholin 0:2325d1d28df3 67 case RADIOSTATE_TXFINISHED :
fholin 0:2325d1d28df3 68 StateRadioProcess = RADIOSTATE_RX1FINISHED;
fholin 0:2325d1d28df3 69 break;
fholin 0:2325d1d28df3 70
fholin 0:2325d1d28df3 71 case RADIOSTATE_RX1FINISHED :
fholin 0:2325d1d28df3 72 StateRadioProcess = RADIOSTATE_IDLE;
fholin 0:2325d1d28df3 73 break;
fholin 0:2325d1d28df3 74
fholin 0:2325d1d28df3 75 default :
fholin 0:2325d1d28df3 76 pcf.printf ("receive It radio error\n");
fholin 0:2325d1d28df3 77 break;
fholin 0:2325d1d28df3 78 }
fholin 0:2325d1d28df3 79 };
fholin 0:2325d1d28df3 80
fholin 0:2325d1d28df3 81
fholin 0:2325d1d28df3 82 /************************************************************************************************/
fholin 0:2325d1d28df3 83 /* Public Methods */
fholin 0:2325d1d28df3 84 /************************************************************************************************/
fholin 0:2325d1d28df3 85 //@note Partionning Public/private not yet finalized
fholin 0:2325d1d28df3 86
fholin 0:2325d1d28df3 87 void RadioContainer::SetTxConfig( void ) {
fholin 0:2325d1d28df3 88 StateRadioProcess = RADIOSTATE_TXON;
fholin 0:2325d1d28df3 89 Radio.SetChannel( TxFrequency );
fholin 0:2325d1d28df3 90 Radio.Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD );
fholin 0:2325d1d28df3 91 Radio.SetTxConfig( MODEM_LORA, TxPower, 0, BW125, TxSf, 1, 8, false, true, 0, 0, false, 10e3 );
fholin 0:2325d1d28df3 92 };
fholin 0:2325d1d28df3 93 void RadioContainer::Send( ) { //@note could/should be merge with tx config
fholin 0:2325d1d28df3 94 Radio.Send( TxPhyPayload, TxPayloadSize );
fholin 0:2325d1d28df3 95 };
fholin 0:2325d1d28df3 96
fholin 0:2325d1d28df3 97 void RadioContainer::SetRxConfig( void ) {
fholin 0:2325d1d28df3 98 Radio.SetChannel( RxFrequency );
fholin 0:2325d1d28df3 99 Radio.SetRxConfig( MODEM_LORA, BW125, RxSf, 1, 0, 6, 10, false, 0, false, 0, 0, true, false );//@note rxtimeout 400ms!!!!
fholin 0:2325d1d28df3 100 }
fholin 0:2325d1d28df3 101
fholin 0:2325d1d28df3 102 int RadioContainer::GetRadioState( void ) {
fholin 0:2325d1d28df3 103 return StateRadioProcess;
fholin 0:2325d1d28df3 104 };
fholin 0:2325d1d28df3 105
fholin 0:2325d1d28df3 106 void RadioContainer::RadioContainerInit( void ) {
fholin 0:2325d1d28df3 107 Radio.Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD );
fholin 0:2325d1d28df3 108 Radio.Sleep( );
fholin 0:2325d1d28df3 109 }
fholin 0:2325d1d28df3 110
fholin 0:2325d1d28df3 111 /************************************************************************************************/
fholin 0:2325d1d28df3 112 /* Private Methods */
fholin 0:2325d1d28df3 113 /************************************************************************************************/
fholin 0:2325d1d28df3 114
fholin 0:2325d1d28df3 115
fholin 0:2325d1d28df3 116
fholin 0:2325d1d28df3 117 int RadioContainer::DumpRxPayloadAndMetadata ( void ) {
fholin 0:2325d1d28df3 118
fholin 0:2325d1d28df3 119 RxPhyPayloadSize = Radio.Read( REG_LR_RXNBBYTES );
fholin 0:2325d1d28df3 120 Radio.ReadFifo( RxPhyPayload, RxPhyPayloadSize );
fholin 0:2325d1d28df3 121 RxPhyPayloadSnr = Radio.Read( REG_LR_PKTSNRVALUE );
fholin 0:2325d1d28df3 122 RxPhyPayloadRssi = Radio.Read( REG_LR_PKTRSSIVALUE );
fholin 0:2325d1d28df3 123 /* check Mtype */
fholin 0:2325d1d28df3 124 int status = OKLORAWAN;
fholin 0:2325d1d28df3 125 uint8_t MtypeRxtmp = RxPhyPayload[0] >> 5 ;
fholin 0:2325d1d28df3 126 if (( MtypeRxtmp == JOINREQUEST) || ( MtypeRxtmp == UNCONFDATAUP ) || ( MtypeRxtmp == CONFDATAUP) || ( MtypeRxtmp == REJOINREQUEST )) {
fholin 0:2325d1d28df3 127 status += ERRORLORAWAN;
fholin 0:2325d1d28df3 128 }
fholin 0:2325d1d28df3 129 /* check devaddr */
fholin 0:2325d1d28df3 130 uint32_t DevAddrtmp = RxPhyPayload[1] + ( RxPhyPayload[2] << 8 ) + ( RxPhyPayload[3] << 16 )+ ( RxPhyPayload[4] << 24 );
fholin 0:2325d1d28df3 131 status += (DevAddrtmp == DevAddrIsr) ? OKLORAWAN : ERRORLORAWAN;
fholin 0:2325d1d28df3 132 if ( status != OKLORAWAN ) {
fholin 0:2325d1d28df3 133 RxPhyPayloadSize = 0;
fholin 0:2325d1d28df3 134 }
fholin 0:2325d1d28df3 135 return (status);
fholin 0:2325d1d28df3 136 }
fholin 0:2325d1d28df3 137 void RadioContainer::ClearIrqRadioFlag ( void ) {
fholin 0:2325d1d28df3 138 Radio.Write( REG_LR_IRQFLAGS, 0 );
fholin 0:2325d1d28df3 139 }
fholin 0:2325d1d28df3 140 void RadioContainer::GetIrqRadioFlag ( void ) {
fholin 0:2325d1d28df3 141 RegIrqFlag = Radio.Read ( REG_LR_IRQFLAGS );
fholin 0:2325d1d28df3 142 }