Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MinimouseSrc/PhyLayer.cpp@1:eda561b01daf, 2017-12-18 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |