LoRa Access Point 1.5.2018

Dependencies:   mbed ds3231 SX1276Lib_LoRa_Access_Point

Committer:
lukas_formanek
Date:
Thu Mar 28 09:55:48 2019 +0000
Revision:
10:e62222c46ee9
Parent:
8:5d99fbf255d6
Child:
11:376bfcdda0d4
28.3.2019 working SD,RTC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lukas_formanek 0:ea088908ad26 1 #include "RFM95W.h"
lukas_formanek 0:ea088908ad26 2
lukas_formanek 5:19b34c4d27a1 3 RFM95W rfm;
lukas_formanek 0:ea088908ad26 4
lukas_formanek 0:ea088908ad26 5 //--------------------------- Callback funkcie ---------------------------------
lukas_formanek 5:19b34c4d27a1 6 void TxDone(void)
lukas_formanek 5:19b34c4d27a1 7 {
lukas_formanek 5:19b34c4d27a1 8 rfm.OnTxDone();
lukas_formanek 5:19b34c4d27a1 9 };
lukas_formanek 0:ea088908ad26 10
lukas_formanek 5:19b34c4d27a1 11 void RxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
lukas_formanek 5:19b34c4d27a1 12 {
lukas_formanek 5:19b34c4d27a1 13 rfm.OnRxDone(payload,size,rssi,snr);
lukas_formanek 5:19b34c4d27a1 14 };
lukas_formanek 0:ea088908ad26 15
lukas_formanek 5:19b34c4d27a1 16 void TxTimeout(void)
lukas_formanek 5:19b34c4d27a1 17 {
lukas_formanek 5:19b34c4d27a1 18 rfm.OnTxTimeout();
lukas_formanek 5:19b34c4d27a1 19 };
lukas_formanek 0:ea088908ad26 20
lukas_formanek 5:19b34c4d27a1 21 void RxTimeout(void)
lukas_formanek 5:19b34c4d27a1 22 {
lukas_formanek 5:19b34c4d27a1 23 rfm.OnRxTimeout();
lukas_formanek 5:19b34c4d27a1 24 };
lukas_formanek 0:ea088908ad26 25
lukas_formanek 5:19b34c4d27a1 26 void RxError(void)
lukas_formanek 5:19b34c4d27a1 27 {
lukas_formanek 5:19b34c4d27a1 28 rfm.OnRxError();
lukas_formanek 5:19b34c4d27a1 29 };
lukas_formanek 0:ea088908ad26 30
lukas_formanek 5:19b34c4d27a1 31 void CadDone(bool channelActivityDetected)
lukas_formanek 5:19b34c4d27a1 32 {
lukas_formanek 5:19b34c4d27a1 33 rfm.OnCadDone(channelActivityDetected);
lukas_formanek 5:19b34c4d27a1 34 };
lukas_formanek 0:ea088908ad26 35 //------------------------------------------------------------------------------
lukas_formanek 0:ea088908ad26 36
lukas_formanek 0:ea088908ad26 37 RFM95W::RFM95W()
lukas_formanek 0:ea088908ad26 38 : radio(NULL),
lukas_formanek 3:7a3ddda464bf 39 indicationLed(LED_PIN),
lukas_formanek 3:7a3ddda464bf 40 noise(NOISE_PIN)
lukas_formanek 0:ea088908ad26 41 {
lukas_formanek 5:19b34c4d27a1 42 for(uint16_t i=0; i<MAX_DEVICES; i++)
lukas_formanek 3:7a3ddda464bf 43 messageNumbers[i]=NULL;
lukas_formanek 0:ea088908ad26 44 memset(receivedMessage, '\0', sizeof(receivedMessage));
lukas_formanek 0:ea088908ad26 45 ledState = 0;
lukas_formanek 0:ea088908ad26 46 timeOnAirSec = 0.3;
lukas_formanek 0:ea088908ad26 47 indicationLed = 1;
lukas_formanek 3:7a3ddda464bf 48 messageNumber = GATEWAY_ID;
lukas_formanek 3:7a3ddda464bf 49 sendCounter = 0;
lukas_formanek 3:7a3ddda464bf 50 receivedAck = false;
lukas_formanek 8:5d99fbf255d6 51 writeDataToSD = false;
lukas_formanek 0:ea088908ad26 52 };
lukas_formanek 0:ea088908ad26 53
lukas_formanek 0:ea088908ad26 54 void RFM95W::OnLedTick()
lukas_formanek 0:ea088908ad26 55 {
lukas_formanek 0:ea088908ad26 56 if(ledState<6) {
lukas_formanek 0:ea088908ad26 57 indicationLed = !indicationLed;
lukas_formanek 0:ea088908ad26 58 } else {
lukas_formanek 0:ea088908ad26 59 ledState = 0;
lukas_formanek 0:ea088908ad26 60 indicationLed = 1;
lukas_formanek 0:ea088908ad26 61 ledTicker.detach();
lukas_formanek 0:ea088908ad26 62 }
lukas_formanek 0:ea088908ad26 63 ledState++;
lukas_formanek 0:ea088908ad26 64 }
lukas_formanek 0:ea088908ad26 65
lukas_formanek 3:7a3ddda464bf 66 void RFM95W::SendMessage()
lukas_formanek 3:7a3ddda464bf 67 {
lukas_formanek 3:7a3ddda464bf 68 snprintf((char *)ack, 3, "%c%c%c",GATEWAY_ID, sendBuffer[0], messageNumber);
lukas_formanek 6:1ee035ae2a2c 69 radio.Send( sendBuffer, 15 );
lukas_formanek 3:7a3ddda464bf 70 }
lukas_formanek 3:7a3ddda464bf 71
lukas_formanek 0:ea088908ad26 72 void RFM95W::SendAck(uint8_t addr, uint8_t messageNumber)
lukas_formanek 0:ea088908ad26 73 {
lukas_formanek 0:ea088908ad26 74 uint8_t ack[3];
lukas_formanek 3:7a3ddda464bf 75 snprintf((char *)ack, sizeof(ack), "%c%c%c", addr, GATEWAY_ID, messageNumber);
lukas_formanek 10:e62222c46ee9 76 // pc.printf("Sending Ack : %s \r\n",ack);
lukas_formanek 10:e62222c46ee9 77 pc.printf("Sending Ack : %d \r\n",addr);
lukas_formanek 0:ea088908ad26 78 radio.Send(ack, 3);
lukas_formanek 0:ea088908ad26 79 };
lukas_formanek 0:ea088908ad26 80
lukas_formanek 3:7a3ddda464bf 81 float RFM95W::CalculateRandomTime()
lukas_formanek 3:7a3ddda464bf 82 {
lukas_formanek 4:e20eb5efd859 83 uint8_t number = rand() % 1500;;
lukas_formanek 5:19b34c4d27a1 84 while(number == 0) {
lukas_formanek 5:19b34c4d27a1 85 number = rand() % 1500;
lukas_formanek 5:19b34c4d27a1 86 }
lukas_formanek 8:5d99fbf255d6 87 return (timeOnAirSec * (number / 500.0));
lukas_formanek 3:7a3ddda464bf 88 };
lukas_formanek 3:7a3ddda464bf 89
lukas_formanek 3:7a3ddda464bf 90 void RFM95W::OnCheckAck()
lukas_formanek 3:7a3ddda464bf 91 {
lukas_formanek 3:7a3ddda464bf 92 if((receivedAck == false) && (sendCounter < MAX_RESENDS))
lukas_formanek 8:5d99fbf255d6 93 {
lukas_formanek 8:5d99fbf255d6 94 sendTicker.detach();
lukas_formanek 4:e20eb5efd859 95 sendTicker.attach(callback(this,&RFM95W::OnSendAgain), CalculateRandomTime());
lukas_formanek 8:5d99fbf255d6 96 }
lukas_formanek 5:19b34c4d27a1 97 else if((receivedAck == false) && (sendCounter >= MAX_RESENDS)) {
lukas_formanek 4:e20eb5efd859 98 messageNumber++;
lukas_formanek 4:e20eb5efd859 99 if(messageNumber>255)
lukas_formanek 4:e20eb5efd859 100 messageNumber = 0;
lukas_formanek 3:7a3ddda464bf 101 }
lukas_formanek 3:7a3ddda464bf 102 ackTicker.detach();
lukas_formanek 3:7a3ddda464bf 103 };
lukas_formanek 3:7a3ddda464bf 104
lukas_formanek 3:7a3ddda464bf 105 void RFM95W::OnSendAgain()
lukas_formanek 3:7a3ddda464bf 106 {
lukas_formanek 4:e20eb5efd859 107 pc.printf("On send again \r\n");
lukas_formanek 3:7a3ddda464bf 108 SendMessage();
lukas_formanek 3:7a3ddda464bf 109 sendCounter++;
lukas_formanek 3:7a3ddda464bf 110 sendTicker.detach();
lukas_formanek 3:7a3ddda464bf 111 };
lukas_formanek 3:7a3ddda464bf 112
lukas_formanek 0:ea088908ad26 113 void RFM95W::OnTxDone( void )
lukas_formanek 0:ea088908ad26 114 {
lukas_formanek 0:ea088908ad26 115 radio.Sleep();
lukas_formanek 3:7a3ddda464bf 116 if(sendingAck)
lukas_formanek 8:5d99fbf255d6 117 {
lukas_formanek 3:7a3ddda464bf 118 sendingAck = false;
lukas_formanek 8:5d99fbf255d6 119 }
lukas_formanek 5:19b34c4d27a1 120 else {
lukas_formanek 4:e20eb5efd859 121 pc.printf("OnTxDone !\r\n");
lukas_formanek 3:7a3ddda464bf 122 receivedAck = false;
lukas_formanek 8:5d99fbf255d6 123 ackTicker.detach();
lukas_formanek 3:7a3ddda464bf 124 ackTicker.attach(callback(this,&RFM95W::OnCheckAck),timeOnAirSec*3);
lukas_formanek 3:7a3ddda464bf 125 }
lukas_formanek 0:ea088908ad26 126 radio.Rx(0);
lukas_formanek 0:ea088908ad26 127 };
lukas_formanek 0:ea088908ad26 128
lukas_formanek 0:ea088908ad26 129 void RFM95W::OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
lukas_formanek 0:ea088908ad26 130 {
lukas_formanek 0:ea088908ad26 131 radio.Sleep();
lukas_formanek 3:7a3ddda464bf 132 if(payload[0] == GATEWAY_ID) {
lukas_formanek 6:1ee035ae2a2c 133 uint8_t msgFrom = payload[1];
lukas_formanek 3:7a3ddda464bf 134 indicationLed=0;
lukas_formanek 8:5d99fbf255d6 135 ledTicker.detach();
lukas_formanek 3:7a3ddda464bf 136 ledTicker.attach(callback(this,&RFM95W::OnLedTick), LED_BLIK_PERIOD);
lukas_formanek 5:19b34c4d27a1 137 if((size == 3) && (strncmp( ( const char* )payload, ( const char* )ack, 3 ) == 0) ) {
lukas_formanek 3:7a3ddda464bf 138 receivedAck = true;
lukas_formanek 5:19b34c4d27a1 139 wifi.ConfirmReceivedAck(msgFrom);
lukas_formanek 3:7a3ddda464bf 140 pc.printf("Received Ack : %s \r\n",ack);
lukas_formanek 3:7a3ddda464bf 141 messageNumber++;
lukas_formanek 3:7a3ddda464bf 142 if(messageNumber>255)
lukas_formanek 3:7a3ddda464bf 143 messageNumber = 0;
lukas_formanek 5:19b34c4d27a1 144 radio.Rx(0);
lukas_formanek 0:ea088908ad26 145 return;
lukas_formanek 0:ea088908ad26 146 }
lukas_formanek 5:19b34c4d27a1 147 sendingAck = true;
lukas_formanek 5:19b34c4d27a1 148 SendAck(msgFrom,payload[2]);
lukas_formanek 10:e62222c46ee9 149 pc.printf("MSG from : %d , message number received= %d \r\n",msgFrom,payload[2]);
lukas_formanek 5:19b34c4d27a1 150 if(payload[2] == messageNumbers[msgFrom]) {
lukas_formanek 5:19b34c4d27a1 151 pc.printf("--------------------- Ta ista sprava -------------------- \r\n");
lukas_formanek 5:19b34c4d27a1 152 return;
lukas_formanek 5:19b34c4d27a1 153 }
lukas_formanek 5:19b34c4d27a1 154 messageNumbers[msgFrom] = payload[2];
lukas_formanek 6:1ee035ae2a2c 155 payload[2] = 48;
lukas_formanek 3:7a3ddda464bf 156 memmove(payload, payload+4, size - 4 + 1); // orezem prve styri bajty
lukas_formanek 3:7a3ddda464bf 157 snprintf((char *)receivedMessage, BUFF_SIZE, "%d|%d|%d|%d|%s|\r\n", rssi, snr, GATEWAY_ID, msgFrom, payload);
lukas_formanek 8:5d99fbf255d6 158 writeDataToSD = true;
lukas_formanek 8:5d99fbf255d6 159 wifi.SendMessage((char *)receivedMessage);
lukas_formanek 8:5d99fbf255d6 160 SDcard.Write((char *)receivedMessage);
lukas_formanek 0:ea088908ad26 161 return;
lukas_formanek 0:ea088908ad26 162 }
lukas_formanek 5:19b34c4d27a1 163 radio.Rx(0);
lukas_formanek 0:ea088908ad26 164 };
lukas_formanek 0:ea088908ad26 165
lukas_formanek 0:ea088908ad26 166 void RFM95W::OnTxTimeout( void )
lukas_formanek 0:ea088908ad26 167 {
lukas_formanek 0:ea088908ad26 168 radio.Sleep();
lukas_formanek 0:ea088908ad26 169 Init();
lukas_formanek 0:ea088908ad26 170 };
lukas_formanek 0:ea088908ad26 171
lukas_formanek 0:ea088908ad26 172 void RFM95W::OnRxTimeout( void )
lukas_formanek 0:ea088908ad26 173 {
lukas_formanek 0:ea088908ad26 174 radio.Sleep();
lukas_formanek 0:ea088908ad26 175 radio.Rx(0);
lukas_formanek 0:ea088908ad26 176 };
lukas_formanek 0:ea088908ad26 177
lukas_formanek 0:ea088908ad26 178 void RFM95W::OnRxError( void )
lukas_formanek 0:ea088908ad26 179 {
lukas_formanek 0:ea088908ad26 180 radio.Sleep();
lukas_formanek 0:ea088908ad26 181 pc.printf("Chyba prijatia ! \r\n");
lukas_formanek 0:ea088908ad26 182 radio.Rx(0);
lukas_formanek 0:ea088908ad26 183 };
lukas_formanek 0:ea088908ad26 184
lukas_formanek 5:19b34c4d27a1 185 void RFM95W::OnCadDone( bool channelActivityDetected ) {};
lukas_formanek 0:ea088908ad26 186
lukas_formanek 3:7a3ddda464bf 187 void RFM95W::SendValue(uint8_t addr, float value)
lukas_formanek 3:7a3ddda464bf 188 {
lukas_formanek 3:7a3ddda464bf 189 snprintf((char *)sendBuffer, BUFF_SIZE, "%c%c%c|%.2f|",addr, GATEWAY_ID, messageNumber, value);
lukas_formanek 3:7a3ddda464bf 190 sendCounter = 0;
lukas_formanek 3:7a3ddda464bf 191 receivedAck = false;
lukas_formanek 5:19b34c4d27a1 192 SendMessage();
lukas_formanek 4:e20eb5efd859 193 };
lukas_formanek 4:e20eb5efd859 194
lukas_formanek 4:e20eb5efd859 195 void RFM95W::SendValue(uint8_t addr, int value)
lukas_formanek 4:e20eb5efd859 196 {
lukas_formanek 4:e20eb5efd859 197 snprintf((char *)sendBuffer, BUFF_SIZE, "%c%c%c|%d|",addr, GATEWAY_ID, messageNumber, value);
lukas_formanek 4:e20eb5efd859 198 sendCounter = 0;
lukas_formanek 4:e20eb5efd859 199 receivedAck = false;
lukas_formanek 5:19b34c4d27a1 200 SendMessage();
lukas_formanek 4:e20eb5efd859 201 };
lukas_formanek 4:e20eb5efd859 202
lukas_formanek 4:e20eb5efd859 203 void RFM95W::SendMessage(char* message)
lukas_formanek 4:e20eb5efd859 204 {
lukas_formanek 4:e20eb5efd859 205 snprintf((char *)sendBuffer, BUFF_SIZE, "%s", message);
lukas_formanek 4:e20eb5efd859 206 sendBuffer[0] = (char)sendBuffer[0];
lukas_formanek 4:e20eb5efd859 207 sendBuffer[1] = (char)GATEWAY_ID;
lukas_formanek 4:e20eb5efd859 208 sendBuffer[2] = (char)messageNumber;
lukas_formanek 4:e20eb5efd859 209 sendCounter = 0;
lukas_formanek 4:e20eb5efd859 210 receivedAck = false;
lukas_formanek 4:e20eb5efd859 211
lukas_formanek 4:e20eb5efd859 212 pc.printf("%s",sendBuffer);
lukas_formanek 5:19b34c4d27a1 213 SendMessage();
lukas_formanek 3:7a3ddda464bf 214 };
lukas_formanek 3:7a3ddda464bf 215
lukas_formanek 8:5d99fbf255d6 216 void RFM95W::WriteDataToSDcard()
lukas_formanek 8:5d99fbf255d6 217 {
lukas_formanek 8:5d99fbf255d6 218 if(writeDataToSD)
lukas_formanek 8:5d99fbf255d6 219 {
lukas_formanek 8:5d99fbf255d6 220 // SDcard.Write((char *)receivedMessage);
lukas_formanek 8:5d99fbf255d6 221 writeDataToSD = false;
lukas_formanek 8:5d99fbf255d6 222 }
lukas_formanek 8:5d99fbf255d6 223 }
lukas_formanek 8:5d99fbf255d6 224
lukas_formanek 0:ea088908ad26 225 void RFM95W::Init( void )
lukas_formanek 0:ea088908ad26 226 {
lukas_formanek 0:ea088908ad26 227 pc.printf( "\n\n\r------- RFM95W GATEWAY -------\n\r" );
lukas_formanek 0:ea088908ad26 228 // Initialize Radio driver
lukas_formanek 0:ea088908ad26 229 radioEvents.TxDone = TxDone;
lukas_formanek 0:ea088908ad26 230 radioEvents.RxDone = RxDone;
lukas_formanek 0:ea088908ad26 231 radioEvents.RxError = RxError;
lukas_formanek 0:ea088908ad26 232 radioEvents.TxTimeout = TxTimeout;
lukas_formanek 0:ea088908ad26 233 radioEvents.RxTimeout = RxTimeout;
lukas_formanek 0:ea088908ad26 234 radioEvents.CadDone = CadDone;
lukas_formanek 0:ea088908ad26 235 radio.Init( &radioEvents );
lukas_formanek 0:ea088908ad26 236 // verify the connection with the board
lukas_formanek 0:ea088908ad26 237 while( radio.Read( REG_VERSION ) == 0x00 ) {
lukas_formanek 0:ea088908ad26 238 pc.printf( "Radiovy modul nie je pripojeny!\n\r", NULL );
lukas_formanek 0:ea088908ad26 239 wait(1);
lukas_formanek 0:ea088908ad26 240 }
lukas_formanek 0:ea088908ad26 241 radio.SetChannel( RF_FREQUENCY );
lukas_formanek 0:ea088908ad26 242 #if USE_MODEM_LORA == 1
lukas_formanek 2:0499e1d037a5 243 pc.printf("\n\r > LORA Mod < \n\n\r");
lukas_formanek 0:ea088908ad26 244 radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
lukas_formanek 0:ea088908ad26 245 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
lukas_formanek 0:ea088908ad26 246 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
lukas_formanek 0:ea088908ad26 247 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
lukas_formanek 0:ea088908ad26 248 LORA_IQ_INVERSION_ON, 2000000 );
lukas_formanek 0:ea088908ad26 249
lukas_formanek 0:ea088908ad26 250 radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
lukas_formanek 0:ea088908ad26 251 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
lukas_formanek 0:ea088908ad26 252 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
lukas_formanek 0:ea088908ad26 253 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
lukas_formanek 0:ea088908ad26 254 LORA_IQ_INVERSION_ON, true );
lukas_formanek 0:ea088908ad26 255
lukas_formanek 0:ea088908ad26 256 #elif USE_MODEM_FSK == 1
lukas_formanek 0:ea088908ad26 257
lukas_formanek 2:0499e1d037a5 258 pc.printf("\n\r > FSK Mod < \n\n\r");
lukas_formanek 0:ea088908ad26 259 radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
lukas_formanek 0:ea088908ad26 260 FSK_DATARATE, 0,
lukas_formanek 0:ea088908ad26 261 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
lukas_formanek 0:ea088908ad26 262 FSK_CRC_ENABLED, 0, 0, 0, 2000000 );
lukas_formanek 0:ea088908ad26 263
lukas_formanek 0:ea088908ad26 264 radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
lukas_formanek 0:ea088908ad26 265 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
lukas_formanek 0:ea088908ad26 266 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
lukas_formanek 0:ea088908ad26 267 0, 0, false, true );
lukas_formanek 0:ea088908ad26 268
lukas_formanek 0:ea088908ad26 269 #else
lukas_formanek 0:ea088908ad26 270
lukas_formanek 0:ea088908ad26 271 #error "Nie je definovany typ modemu."
lukas_formanek 0:ea088908ad26 272
lukas_formanek 0:ea088908ad26 273 #endif
lukas_formanek 0:ea088908ad26 274 // Konfiguracia pre moznost max. vysielacieho vykonu
lukas_formanek 0:ea088908ad26 275 uint8_t paConfig;
lukas_formanek 0:ea088908ad26 276 paConfig = radio.Read( REG_PACONFIG );
lukas_formanek 0:ea088908ad26 277 paConfig |= RF_PACONFIG_PASELECT_PABOOST;
lukas_formanek 0:ea088908ad26 278 radio.Write( REG_PACONFIG, paConfig );
lukas_formanek 5:19b34c4d27a1 279
lukas_formanek 0:ea088908ad26 280 pc.printf("________Start aplikacie________\r\n" );
lukas_formanek 2:0499e1d037a5 281 timeOnAirSec = (radio.TimeOnAir( MODEM_LORA, 10)/1000.0); // time on air v ms
lukas_formanek 0:ea088908ad26 282 pc.printf( "\n\n\r------- Time on air : %f sec. -------\n\r", timeOnAirSec);
lukas_formanek 0:ea088908ad26 283 indicationLed = 1;
lukas_formanek 3:7a3ddda464bf 284 InitRandom();
lukas_formanek 3:7a3ddda464bf 285 messageNumber = rand();
lukas_formanek 0:ea088908ad26 286 radio.Rx(0);
lukas_formanek 0:ea088908ad26 287 };
lukas_formanek 0:ea088908ad26 288
lukas_formanek 3:7a3ddda464bf 289 void RFM95W::InitRandom()
lukas_formanek 3:7a3ddda464bf 290 {
lukas_formanek 3:7a3ddda464bf 291 uint32_t seed;
lukas_formanek 3:7a3ddda464bf 292 uint8_t loops = 3;
lukas_formanek 3:7a3ddda464bf 293 for (int i=0; i<(32*loops); i++) {
lukas_formanek 3:7a3ddda464bf 294 seed ^= noise.read_u16();
lukas_formanek 5:19b34c4d27a1 295 if (seed & 1<31) {
lukas_formanek 3:7a3ddda464bf 296 seed <<= 1;
lukas_formanek 3:7a3ddda464bf 297 seed |= 1;
lukas_formanek 3:7a3ddda464bf 298 } else
lukas_formanek 3:7a3ddda464bf 299 seed <<= 1;
lukas_formanek 3:7a3ddda464bf 300 }
lukas_formanek 3:7a3ddda464bf 301 srand(seed);
lukas_formanek 3:7a3ddda464bf 302 };