fholin fholin / Mbed 2 deprecated MiniMousetest

Dependencies:   mbed

Committer:
fholin
Date:
Fri Dec 15 13:15:04 2017 +0000
Revision:
0:2325d1d28df3
Child:
1:eda561b01daf
Initial commit

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 : LoraWanProcess Class definition.
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 "LoraWanProcess.h"
fholin 0:2325d1d28df3 19 #include "ApiRtc.h"
fholin 0:2325d1d28df3 20 #include "utilities.h"
fholin 0:2325d1d28df3 21 Serial pcf( PA_9, PA_10 );
fholin 0:2325d1d28df3 22
fholin 0:2325d1d28df3 23 LoraWanObjet::LoraWanObjet( PinName interrupt ):packet( interrupt ){
fholin 0:2325d1d28df3 24 StateLoraWanProcess=LWPSTATE_IDLE;
fholin 0:2325d1d28df3 25 packet.MajorBits= LORAWANR1;
fholin 0:2325d1d28df3 26 };
fholin 0:2325d1d28df3 27 LoraWanObjet::~LoraWanObjet() {
fholin 0:2325d1d28df3 28 };
fholin 0:2325d1d28df3 29 /************************************************************************************************/
fholin 0:2325d1d28df3 30 /* Public Methods */
fholin 0:2325d1d28df3 31 /************************************************************************************************/
fholin 0:2325d1d28df3 32
fholin 0:2325d1d28df3 33
fholin 0:2325d1d28df3 34 /***********************************************************************************************/
fholin 0:2325d1d28df3 35 /* LoraWanProcess Method */
fholin 0:2325d1d28df3 36 /***********************************************************************************************/
fholin 0:2325d1d28df3 37
fholin 0:2325d1d28df3 38 eLoraWan_Process_States LoraWanObjet::LoraWanProcess( uint8_t * AvailableRxPacket ) {
fholin 0:2325d1d28df3 39
fholin 0:2325d1d28df3 40 *AvailableRxPacket = NOLORARXPACKETAVAILABLE; //@note AvailableRxPacket should be set to "yes" only in Last state before to return to LWPSTATE_IDLE*
fholin 0:2325d1d28df3 41 switch ( StateLoraWanProcess ) {
fholin 0:2325d1d28df3 42 /************************************************************************************/
fholin 0:2325d1d28df3 43 /* STATE IDLE */
fholin 0:2325d1d28df3 44 /************************************************************************************/
fholin 0:2325d1d28df3 45 case LWPSTATE_IDLE :
fholin 0:2325d1d28df3 46 break;
fholin 0:2325d1d28df3 47 /************************************************************************************/
fholin 0:2325d1d28df3 48 /* STATE TX */
fholin 0:2325d1d28df3 49 /************************************************************************************/
fholin 0:2325d1d28df3 50 case LWPSTATE_SEND:
fholin 0:2325d1d28df3 51 switch ( GetRadioState( ) ) {
fholin 0:2325d1d28df3 52
fholin 0:2325d1d28df3 53 case RADIOSTATE_IDLE :
fholin 0:2325d1d28df3 54 packet.ConfigureRadioAndSend( );
fholin 0:2325d1d28df3 55 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 56 pcf.printf( " * Send Payload *\n " );
fholin 0:2325d1d28df3 57 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 58 break ;
fholin 0:2325d1d28df3 59
fholin 0:2325d1d28df3 60 case RADIOSTATE_TXFINISHED :
fholin 0:2325d1d28df3 61 packet.ConfigureRadioForRx1 ( );
fholin 0:2325d1d28df3 62 packet.ConfigureTimerForRx ( RX1 );
fholin 0:2325d1d28df3 63 StateLoraWanProcess = LWPSTATE_RX1;
fholin 0:2325d1d28df3 64 break ;
fholin 0:2325d1d28df3 65
fholin 0:2325d1d28df3 66 default :
fholin 0:2325d1d28df3 67 break;
fholin 0:2325d1d28df3 68 }
fholin 0:2325d1d28df3 69 break;
fholin 0:2325d1d28df3 70 /************************************************************************************/
fholin 0:2325d1d28df3 71 /* STATE RX1 */
fholin 0:2325d1d28df3 72 /* RX1DELAY is defined in ms */
fholin 0:2325d1d28df3 73 /************************************************************************************/
fholin 0:2325d1d28df3 74 case LWPSTATE_RX1:
fholin 0:2325d1d28df3 75 if ( GetRadioState( ) == RADIOSTATE_RX1FINISHED ) {
fholin 0:2325d1d28df3 76 if ( GetRadioIrqFlag ( ) == RECEIVEPACKETIRQFLAG) {
fholin 0:2325d1d28df3 77 //@todo process downlink
fholin 0:2325d1d28df3 78 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 79 pcf.printf( " * Receive a downlink RX1 *\n " );
fholin 0:2325d1d28df3 80 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 81 StateLoraWanProcess = LWPSTATE_PROCESSDOWNLINK;
fholin 0:2325d1d28df3 82 } else { // So rxtimeout case @note manage error case
fholin 0:2325d1d28df3 83 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 84 pcf.printf( " * RX1 Timeout *\n " );
fholin 0:2325d1d28df3 85 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 86 packet.ConfigureRadioForRx2 ( );
fholin 0:2325d1d28df3 87 packet.ConfigureTimerForRx ( RX2 );
fholin 0:2325d1d28df3 88 StateLoraWanProcess = LWPSTATE_RX2;
fholin 0:2325d1d28df3 89 }
fholin 0:2325d1d28df3 90 }
fholin 0:2325d1d28df3 91 break;
fholin 0:2325d1d28df3 92 /************************************************************************************/
fholin 0:2325d1d28df3 93 /* STATE RX2 */
fholin 0:2325d1d28df3 94 /************************************************************************************/
fholin 0:2325d1d28df3 95 case LWPSTATE_RX2:
fholin 0:2325d1d28df3 96
fholin 0:2325d1d28df3 97 if ( GetRadioState( ) == RADIOSTATE_IDLE ) {
fholin 0:2325d1d28df3 98 if ( GetRadioIrqFlag ( ) == RECEIVEPACKETIRQFLAG) {
fholin 0:2325d1d28df3 99 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 100 pcf.printf( " * Receive a downlink RX2 *\n " );
fholin 0:2325d1d28df3 101 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 102 StateLoraWanProcess = LWPSTATE_PROCESSDOWNLINK; //@note to be discuss if it is necessary to create a dedicated state?
fholin 0:2325d1d28df3 103 } else {
fholin 0:2325d1d28df3 104 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 105 pcf.printf( " * RX2 Timeout *\n " );
fholin 0:2325d1d28df3 106 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 107 StateLoraWanProcess = LWPSTATE_UPDATEMAC;
fholin 0:2325d1d28df3 108 }
fholin 0:2325d1d28df3 109 }
fholin 0:2325d1d28df3 110 break;
fholin 0:2325d1d28df3 111 /************************************************************************************/
fholin 0:2325d1d28df3 112 /* STATE PROCESS DOWNLINK */
fholin 0:2325d1d28df3 113 /* At this step crc is valid */
fholin 0:2325d1d28df3 114 /* Step 1 : CheckRxPayloadLength */
fholin 0:2325d1d28df3 115 /* Step 2 : ExtractRxMhdr */
fholin 0:2325d1d28df3 116 /* Step 3 : ExtractRxFhdr */
fholin 0:2325d1d28df3 117 /* Step 4 : Check Mic */
fholin 0:2325d1d28df3 118 /* Step 5 : Decrypt Payload */
fholin 0:2325d1d28df3 119 /* Step 6 : Extract Fport to select Between App/nwm Payload */
fholin 0:2325d1d28df3 120 /************************************************************************************/
fholin 0:2325d1d28df3 121 case LWPSTATE_PROCESSDOWNLINK:
fholin 0:2325d1d28df3 122 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 123 pcf.printf( " * Process Downlink *\n " );
fholin 0:2325d1d28df3 124 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 125 ValidRxPacket = packet.DecodeRxFrame( ); // return NOVALIDRXPACKET or USERRXPACKET or NWKRXPACKET or JOINACCEPTPACKET.
fholin 0:2325d1d28df3 126 StateLoraWanProcess = LWPSTATE_UPDATEMAC;
fholin 0:2325d1d28df3 127 break;
fholin 0:2325d1d28df3 128 /************************************************************************************/
fholin 0:2325d1d28df3 129 /* STATE UPDATE MAC */
fholin 0:2325d1d28df3 130 /************************************************************************************/
fholin 0:2325d1d28df3 131 case LWPSTATE_UPDATEMAC:
fholin 0:2325d1d28df3 132 packet.Phy.StateRadioProcess = RADIOSTATE_IDLE;
fholin 0:2325d1d28df3 133 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 134 pcf.printf( " * UpdateMac *\n " );
fholin 0:2325d1d28df3 135 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 136 if ( ValidRxPacket == JOINACCEPTPACKET){
fholin 0:2325d1d28df3 137 packet.UpdateJoinProcedure( );
fholin 0:2325d1d28df3 138 }
fholin 0:2325d1d28df3 139 if ( ValidRxPacket == NWKRXPACKET){
fholin 0:2325d1d28df3 140 packet.ParseManagementPacket( );
fholin 0:2325d1d28df3 141 }
fholin 0:2325d1d28df3 142 packet.UpdateMacLayer();
fholin 0:2325d1d28df3 143 *AvailableRxPacket = packet.AvailableRxPacketForUser;
fholin 0:2325d1d28df3 144 if ( ( packet.IsFrameToSend == NWKFRAME_TOSEND ) ) {// @note ack send during the next tx|| ( packet.IsFrameToSend == USERACK_TOSEND ) ) {
fholin 0:2325d1d28df3 145 RtcTargetTimer = RtcGetTimeSecond( ) + randr( 5, 25 ); //@note RtcGetTime in s so no wrap before 136 year since 1970 discuss wait between 5s and 25s
fholin 0:2325d1d28df3 146 StateLoraWanProcess = LWPSTATE_TXWAIT;
fholin 0:2325d1d28df3 147 } else {
fholin 0:2325d1d28df3 148 RadioReset ( ) ;
fholin 0:2325d1d28df3 149 StateLoraWanProcess = LWPSTATE_IDLE;
fholin 0:2325d1d28df3 150 }
fholin 0:2325d1d28df3 151 break;
fholin 0:2325d1d28df3 152 /************************************************************************************/
fholin 0:2325d1d28df3 153 /* STATE TXWAIT MAC */
fholin 0:2325d1d28df3 154 /************************************************************************************/
fholin 0:2325d1d28df3 155 case LWPSTATE_TXWAIT:
fholin 0:2325d1d28df3 156
fholin 0:2325d1d28df3 157 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 158 pcf.printf( " * TXWAIT MAC *\n " );
fholin 0:2325d1d28df3 159 pcf.printf( " **************************\n " );
fholin 0:2325d1d28df3 160 if ( RtcGetTimeSecond( ) > RtcTargetTimer) {
fholin 0:2325d1d28df3 161 StateLoraWanProcess = LWPSTATE_SEND; //@note the frame have already been prepare in Upadate Mac Layer
fholin 0:2325d1d28df3 162 }
fholin 0:2325d1d28df3 163 break;
fholin 0:2325d1d28df3 164
fholin 0:2325d1d28df3 165 default:
fholin 0:2325d1d28df3 166 pcf.printf( " Illegal state\n " );
fholin 0:2325d1d28df3 167 break;
fholin 0:2325d1d28df3 168 }
fholin 0:2325d1d28df3 169 return ( StateLoraWanProcess );
fholin 0:2325d1d28df3 170 }
fholin 0:2325d1d28df3 171
fholin 0:2325d1d28df3 172 /***********************************************************************************************/
fholin 0:2325d1d28df3 173 /* End Of LoraWanProcess Method */
fholin 0:2325d1d28df3 174 /***********************************************************************************************/
fholin 0:2325d1d28df3 175
fholin 0:2325d1d28df3 176
fholin 0:2325d1d28df3 177 /**************************************************/
fholin 0:2325d1d28df3 178 /* LoraWan Join Method */
fholin 0:2325d1d28df3 179 /**************************************************/
fholin 0:2325d1d28df3 180 uint8_t LoraWanObjet::Join ( void ) {
fholin 0:2325d1d28df3 181 packet.BuildJoinLoraFrame( );
fholin 0:2325d1d28df3 182 packet.MacRx1Delay = RX1DELAYJOIN;
fholin 0:2325d1d28df3 183 packet.MacTxSf = 12;
fholin 0:2325d1d28df3 184 packet.MacRx2Sf = 12;
fholin 0:2325d1d28df3 185 StateLoraWanProcess = LWPSTATE_SEND;
fholin 0:2325d1d28df3 186 return( StateLoraWanProcess );
fholin 0:2325d1d28df3 187 };
fholin 0:2325d1d28df3 188
fholin 0:2325d1d28df3 189
fholin 0:2325d1d28df3 190 /**************************************************/
fholin 0:2325d1d28df3 191 /* LoraWan IsJoined Method */
fholin 0:2325d1d28df3 192 /**************************************************/
fholin 0:2325d1d28df3 193 uint8_t LoraWanObjet::IsJoined( void ) {
fholin 0:2325d1d28df3 194 uint8_t status;
fholin 0:2325d1d28df3 195 pcf.printf( " New DevAddr = 0x%.8x \n",packet.DevAddr);
fholin 0:2325d1d28df3 196 status = packet.JoinedStatus;
fholin 0:2325d1d28df3 197 return ( status );
fholin 0:2325d1d28df3 198 }
fholin 0:2325d1d28df3 199
fholin 0:2325d1d28df3 200 /**************************************************/
fholin 0:2325d1d28df3 201 /* LoraWan SendPayload Method */
fholin 0:2325d1d28df3 202 /**************************************************/
fholin 0:2325d1d28df3 203 eLoraWan_Process_States LoraWanObjet::SendPayload ( uint8_t fPort, const uint8_t* dataIn, const uint16_t sizeIn, uint8_t PacketType ) {
fholin 0:2325d1d28df3 204
fholin 0:2325d1d28df3 205 if ( StateLoraWanProcess != LWPSTATE_IDLE ) {
fholin 0:2325d1d28df3 206 return ( LWPSTATE_ERROR );
fholin 0:2325d1d28df3 207 }
fholin 0:2325d1d28df3 208 RadioReset ( ) ;
fholin 0:2325d1d28df3 209 CopyUserPayload( dataIn,sizeIn );
fholin 0:2325d1d28df3 210 packet.UserPayloadSize = sizeIn;
fholin 0:2325d1d28df3 211 packet.fPort = fPort;
fholin 0:2325d1d28df3 212 packet.MType = PacketType;
fholin 0:2325d1d28df3 213 packet.BuildTxLoraFrame( );
fholin 0:2325d1d28df3 214 packet.EncryptTxFrame( );
fholin 0:2325d1d28df3 215 StateLoraWanProcess = LWPSTATE_SEND;
fholin 0:2325d1d28df3 216 return( StateLoraWanProcess );
fholin 0:2325d1d28df3 217 };
fholin 0:2325d1d28df3 218
fholin 0:2325d1d28df3 219 /**************************************************/
fholin 0:2325d1d28df3 220 /* LoraWan Receive Method */
fholin 0:2325d1d28df3 221 /**************************************************/
fholin 0:2325d1d28df3 222 uint8_t LoraWanObjet::ReceivePayload ( uint8_t* UserRxFport, uint8_t* UserRxPayload, uint8_t* UserRxPayloadSize ) {
fholin 0:2325d1d28df3 223 int status = OKLORAWAN;
fholin 0:2325d1d28df3 224 if (packet.AvailableRxPacketForUser == NOLORARXPACKETAVAILABLE) {
fholin 0:2325d1d28df3 225 status = ERRORLORAWAN ;
fholin 0:2325d1d28df3 226 } else {
fholin 0:2325d1d28df3 227 *UserRxPayloadSize = packet.MacRxPayloadSize;
fholin 0:2325d1d28df3 228 *UserRxFport = packet.FportRx;
fholin 0:2325d1d28df3 229 memcpy( UserRxPayload, &packet.MacRxPayload[0], packet.MacRxPayloadSize);
fholin 0:2325d1d28df3 230 packet.AvailableRxPacketForUser = NOLORARXPACKETAVAILABLE ;
fholin 0:2325d1d28df3 231 }
fholin 0:2325d1d28df3 232 return( status );
fholin 0:2325d1d28df3 233 };
fholin 0:2325d1d28df3 234
fholin 0:2325d1d28df3 235 /**************************************************/
fholin 0:2325d1d28df3 236 /* LoraWan AdrModeSelect Method */
fholin 0:2325d1d28df3 237 /**************************************************/
fholin 0:2325d1d28df3 238 void LoraWanObjet::SetDataRateStrategy( eDataRateStrategy adrModeSelect ) {
fholin 0:2325d1d28df3 239 packet.AdrModeSelect = adrModeSelect;
fholin 0:2325d1d28df3 240 };
fholin 0:2325d1d28df3 241 /**************************************************/
fholin 0:2325d1d28df3 242 /* LoraWan TryToJoin Method */
fholin 0:2325d1d28df3 243 /**************************************************/
fholin 0:2325d1d28df3 244 uint8_t LoraWanObjet::TryToJoin ( void ) {
fholin 0:2325d1d28df3 245 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 246 }
fholin 0:2325d1d28df3 247
fholin 0:2325d1d28df3 248 /**************************************************/
fholin 0:2325d1d28df3 249 /* LoraWan GetNextMaxPayloadLength Method */
fholin 0:2325d1d28df3 250 /**************************************************/
fholin 0:2325d1d28df3 251 uint32_t LoraWanObjet::GetNextMaxPayloadLength ( void ) {
fholin 0:2325d1d28df3 252 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 253 }
fholin 0:2325d1d28df3 254
fholin 0:2325d1d28df3 255 /**************************************************/
fholin 0:2325d1d28df3 256 /* LoraWan GetDevAddr Method */
fholin 0:2325d1d28df3 257 /**************************************************/
fholin 0:2325d1d28df3 258 uint32_t LoraWanObjet::GetDevAddr ( void ) {
fholin 0:2325d1d28df3 259 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 260 }
fholin 0:2325d1d28df3 261
fholin 0:2325d1d28df3 262 /**************************************************/
fholin 0:2325d1d28df3 263 /* LoraWan GetNextPower Method */
fholin 0:2325d1d28df3 264 /**************************************************/
fholin 0:2325d1d28df3 265 uint8_t LoraWanObjet::GetNextPower ( void ) {
fholin 0:2325d1d28df3 266 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 267 }
fholin 0:2325d1d28df3 268
fholin 0:2325d1d28df3 269 /**************************************************/
fholin 0:2325d1d28df3 270 /* LoraWan GetNextDataRate Method */
fholin 0:2325d1d28df3 271 /**************************************************/
fholin 0:2325d1d28df3 272 uint8_t LoraWanObjet::GetNextDataRate ( void ) {
fholin 0:2325d1d28df3 273 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 274 }
fholin 0:2325d1d28df3 275
fholin 0:2325d1d28df3 276 /**************************************************/
fholin 0:2325d1d28df3 277 /* LoraWan GetLorawanProcessState Method */
fholin 0:2325d1d28df3 278 /**************************************************/
fholin 0:2325d1d28df3 279 uint8_t LoraWanObjet::GetLorawanProcessState ( void ) {
fholin 0:2325d1d28df3 280 //@NOTE NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 281 }
fholin 0:2325d1d28df3 282
fholin 0:2325d1d28df3 283 /**************************************************/
fholin 0:2325d1d28df3 284 /* LoraWan RestoreContext Method */
fholin 0:2325d1d28df3 285 /**************************************************/
fholin 0:2325d1d28df3 286 void LoraWanObjet::RestoreContext ( void ) {
fholin 0:2325d1d28df3 287 packet.LoadFromFlash ( );
fholin 0:2325d1d28df3 288 };
fholin 0:2325d1d28df3 289
fholin 0:2325d1d28df3 290 /************************************************************************************************/
fholin 0:2325d1d28df3 291 /* Private Methods */
fholin 0:2325d1d28df3 292 /************************************************************************************************/
fholin 0:2325d1d28df3 293 void LoraWanObjet::CopyUserPayload( const uint8_t* dataIn, const uint16_t sizeIn ) {
fholin 0:2325d1d28df3 294 memcpy( &packet.Phy.TxPhyPayload[FHDROFFSET], dataIn, sizeIn );
fholin 0:2325d1d28df3 295 };
fholin 0:2325d1d28df3 296
fholin 0:2325d1d28df3 297 uint8_t LoraWanObjet::GetStateTimer(void) {
fholin 0:2325d1d28df3 298 return (packet.StateTimer);
fholin 0:2325d1d28df3 299 }
fholin 0:2325d1d28df3 300
fholin 0:2325d1d28df3 301 uint8_t LoraWanObjet::GetRadioState ( void ) {
fholin 0:2325d1d28df3 302 return packet.Phy.GetRadioState( );
fholin 0:2325d1d28df3 303 };
fholin 0:2325d1d28df3 304
fholin 0:2325d1d28df3 305 uint8_t LoraWanObjet::GetRadioIrqFlag ( void ) {
fholin 0:2325d1d28df3 306 return packet.Phy.RegIrqFlag;
fholin 0:2325d1d28df3 307 };
fholin 0:2325d1d28df3 308 void LoraWanObjet::RadioReset ( void ) {
fholin 0:2325d1d28df3 309 //NOT YET IMPLEMENTED
fholin 0:2325d1d28df3 310 }