CaryCoders
/
demo_SX1276_standalone
standalone sx1276 demo program
Fork of SX1276_GPS by
Diff: utilities.cpp
- Revision:
- 32:a2472bbe7c92
- Parent:
- 31:2c813f321db7
- Child:
- 33:319cbac3b6eb
diff -r 2c813f321db7 -r a2472bbe7c92 utilities.cpp --- a/utilities.cpp Tue Jul 14 14:58:23 2015 +0000 +++ b/utilities.cpp Wed Jul 29 12:14:42 2015 +0000 @@ -2,9 +2,23 @@ #include "sx1276-hal.h" #include "main.h" #include "debug.h" -//radfta #include "vt100.h" #include "serial_api.h" +void gps_setup(void) +{ + printf("setting up gps\r\n"); + gpsd.setBaud(9600); + gpsd.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); + gpsd.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); + gpsd.sendCommand(PGCMD_NOANTENNA); + gpsd.day=01; + gpsd.month=01; + gpsd.year=15; + gpsd.hour=1; + gpsd.minute=1; + gpsd.seconds=1; +} + int get_kbd_str(char* buf, int size) { char c; @@ -37,11 +51,23 @@ buf[i++] = c; pc.putc(c); } - } else { + } + + else { +#if 0 + return 0; +#else if (app == APP_PING) ping_pong(); if (app == APP_HELLO) - hello(); + { + // if (check_gps() == 0) + // { + return 0; + //hello(); + // } + } + if (app == APP_GPS) check_gps(); #if 1 @@ -51,6 +77,346 @@ check_rx_chat(); } #endif + #endif } + } // ...for() } +void OnTxTimeout( void ) +{ + Radio.Sleep( ); + State = TX_TIMEOUT; + //debug_if( DEBUG_MESSAGE, "> OnTxTimeout\r\n" ); +} + +void OnRxTimeout( void ) +{ + Radio.Sleep( ); + int i; + if (pkt_count >= max_pkts) + { + pkt_count=0; + } + + // mark the rolling avg that a pkt has not been received + pkt_data[pkt_count]=2; + + for (i=0; i< BUFFER_SIZE; i++) + BufferRx[ i ] = '\0'; // clear the buffer + BufferSize = 0; + State = RX_TIMEOUT; + rxTimeout = false; + // debug_if( DEBUG_MESSAGE, "> OnRxTimeout\r\n" ); +} + +void OnRxError( void ) +{ + Radio.Sleep( ); + if (pkt_count >= max_pkts) + { + pkt_count=0; + } + + // mark the rolling avg that a pkt has not been received + pkt_data[pkt_count]=2; + State = RX_ERROR; + debug_if( DEBUG_MESSAGE, "> OnRxError\r\n" ); +} + + +char* itoa(int val, int base){ + + static char buf[32] = {0}; + + int i = 30; + + for(; val && i ; --i, val /= base) + + buf[i] = "0123456789abcdef"[val % base]; + + return &buf[i+1]; + +} + +unsigned int randomSeed(){ + AnalogIn randIn(A0); // analog input for random number seed + unsigned int rnum = 0; // int = 4 bytes - 32 bits + // build 32 bit random number from the 2 lower bits from 16 analog reads + for (int i = 0; i<4;i++){ + rnum = rnum | ((randIn.read_u16() & 15) << i*4); + wait_ms(5); + } + return rnum; +} + +void configRxTx() { + + + Radio.SetTxConfig( MODEM_LORA, TxPower, 0, Bandwidth, + SpreadingFactor, CodingRate, + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, + LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, + LORA_IQ_INVERSION_ON, 2000000 ); + + Radio.SetRxConfig( MODEM_LORA, Bandwidth, SpreadingFactor, + CodingRate, 0, LORA_PREAMBLE_LENGTH, + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, + LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, + LORA_IQ_INVERSION_ON, true ); +} + +void print_bandwidth() +{ + printf("bandwidth: "); + switch (((Radio.Read(REG_LR_MODEMCONFIG1) & 0xf0) >> 4)) { + case 0: printf("7.8KHz "); break; + case 1: printf("10.4KHz "); break; + case 2: printf("15.6KHz "); break; + case 3: printf("20.8KHz "); break; + case 4: printf("31.25KHz "); break; + case 5: printf("41.7KHz "); break; + case 6: printf("62.5KHz "); break; + case 7: printf("125KHz "); break; + case 8: printf("250KHz "); break; + case 9: printf("500KHz "); break; + default: printf("%x ", Radio.Read(REG_LR_MODEMCONFIG1)); break; + } + //printf("\r\n"); +} + +void print_cr() +{ + int cr = (Radio.Read(REG_LR_MODEMCONFIG1) & 0x0f)>>1; + printf("coding rate: "); + switch (cr) + { + case 1: + printf("4/5"); + break; + case 2: + printf("4/6"); + break; + case 3: + printf("4/7"); + break; + case 4: + printf("4/8"); + break; + default: + printf("unknown"); + break; + + } + printf(" "); +} + +void print_power() +{ + uint8_t paConfig = 0; + uint8_t paDac = 0; + + paConfig = Radio.Read( REG_PACONFIG ); + paDac = Radio.Read( REG_PADAC ); + + paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | Radio.GetPaSelect( Radio.GetChannel()*1000000); + paConfig = ( paConfig & RF_PACONFIG_MAX_POWER_MASK ) | 0x70; + printf("channel = %f getpa = %x, paConfig =%x \r\n",Radio.GetChannel(), Radio.GetPaSelect((uint32_t)Radio.GetChannel()*1000000), paConfig ); + if( ( paConfig & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST ) + { + if( ( paDac & RF_PADAC_20DBM_ON ) == RF_PADAC_20DBM_ON ) + { + printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) & 0x0f ) + 5 ); + } + else + printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) &0x0f) + 2 ); + } + else + { + printf("Power: %d dBm ", ( uint8_t )( ( uint16_t )( paConfig) & 0x0f ) - 1 ); + } + +} + +void print_errata() +{ + + int seqconfig1 = (Radio.Read(REG_SEQCONFIG1)); + int timer2 = (Radio.Read(REG_TIMER2COEF)); + printf("seqconfig1 = 0x%02x\r\n", seqconfig1); + printf("timer2coef = 0x%02x\r\n", timer2); + +} +void print_status() +{ + + printf("Radio version: 0x%02x Channel: %.1f MHz ", \ + Radio.Read(REG_VERSION),\ + Radio.GetChannel()\ + ); + print_power(); + print_bandwidth(); printf("\r\n"); + printf("Spreading Factor: %d ",SpreadingFactor); + print_cr(); + if (isMaster) + printf("Mode: master "); + else + printf("Mode: slave "); + + + printf("\r\n"); + print_errata(); + printf("\r\n"); + +} + + +void OnTxDone( void ) +{ + Radio.Sleep( ); + State = TX; + pkt_count++; + + + //debug_if( DEBUG_MESSAGE, "> OnTxDone\r\n" ); +} + +void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) +{ + Radio.Sleep( ); + if (pkt_count >= max_pkts) + { + pkt_count=0; + } + + // mark the rolling avg that a pkt has been received + pkt_data[pkt_count]=1; + //printf("rx done, pkt_count = %d\r\n", pkt_count); + + BufferSize = size; + int i; + for (i=0; i< BUFFER_SIZE; i++) + BufferRx[ i ] = '\0'; // clear the buffer + + memcpy( BufferRx, payload, BufferSize ); + if (rssi > 100) + { + rssi *= -1; + } + RssiValue = rssi; + SnrValue = snr; + State = RX; + rxTimeout = false; + if (app == APP_PING) + debug_if( DEBUG_MESSAGE, "> OnRxDone size=%d rssi=%d snr=%d \r\n", size, rssi, snr ); + +} + +void find_distance() +{ + //float dist = 0; + float lat2 = 0; + float lon2 = 0; + float lat1 = 0; + float lon1 = 0; + float dLat = 0; + float dLon = 0; + float c = 0; + float a = 0; + float d = 0; + + distance = 0; + if (gpsd.lat_deg == 0.0) + { + distance = -1; + return; + } + if (gpsd.lon_deg == 0.0) + { + distance = -1; + return; + } + + lat1 = r_latitude; + lon1 = r_longitude; + + lat2 = gpsd.lat_deg; + lon2 = gpsd.lon_deg; + //Calculate Distance + dLat = (lat2-lat1)*(PI/180); + dLon = (lon2-lon1)*(PI/180); + a = sin(dLat/2) * sin(dLat/2) + + sin(dLon/2) * sin(dLon/2) * cos(lat1*(PI/180)) * cos(lat2*(PI/180)); + c = 2 * atan2(sqrt(a), sqrt(1-a)); + d = 6371000 * c; + + //GPS is only precise to 5 meters, so throw out bad data + if ( d <= 5) { + d = 0; + } + distance = distance + d; + // printf("distance: %f\r\n", gpsd.distance); + +} + +int check_gps(void) +{ + + char c; + int debug=0; + c = gpsd.read(); //queries the GPS + if (debug) + { + if (c) { + printf("%c", c); //this line will echo the GPS data if not paused + return 1; + + } + } + + //check if we recieved a new message from GPS, if so, attempt to parse it, + if ( gpsd.newNMEAreceived() ) { + if (r_latitude != 0) + { + find_distance(); + //printf("distance is %f\r\n",distance); + if (distance < 50000 ) + { + if (distance >= 0) + { + cLCD.setCursor(0,1); + cLCD.printf("d:%0.1fm per:%d ", distance,per); + } + } + } + + if ( !gpsd.parse(gpsd.lastNMEA()) ) + { + // radfta led = !led; + #if 0 + if (gpsd.lat_deg != 0) + { + cLCD.setCursor(0,1); + cLCD.printf("d:Nx per:%d ", per); + cLCD.printf("%0.4f %0.4f", gpsd.lat_deg, gpsd.lon_deg); + } + #endif + + + + return 0; + } + else + { + // printf("GPS %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds); + return 1; + } + + } + else + { + //printf("GPS %02d/%02d/20%02d_%02d:%02d:%02d (UTC)\r\n",gpsd.month,gpsd.day,gpsd.year,gpsd.hour,gpsd.minute,gpsd.seconds); + return 0; + } + +} +