int main(void) { // Initialise the GPIO block gpioInit(); #ifdef GPS // Initialise the UART0 block for printf output uart0Init(9600); #else // Initialise the UART0 block for printf output uart0Init(115200); #endif // Configure the multi-rate timer for 1ms ticks mrtInit(__SYSTEM_CLOCK/1000); // Configure the switch matrix (setup pins for UART0 and SPI) configurePins(); //Seed random number generator, we can use our 'unique' ID random_output = NODE_ID[0] + NODE_ID[1] + NODE_ID[2]; //printf("random: %d\r\n", random_output); RFM69_init(); #ifdef GPS int navmode = 9; setupGPS(); #endif #ifdef DEBUG printf("Node initialized, version %s\r\n",GIT_VER); #endif while(1) { #ifdef GPS mrtDelay(5000); navmode = gps_check_nav(); if (navmode != 6){ setupGPS(); } mrtDelay(500); gps_get_position(); mrtDelay(500); gps_check_lock(); mrtDelay(500); //printf("Data: %d,%d,%d,%d,%d,%d\r\n", lat, lon, alt, navmode, lock, sats); //printf("Errors: %d,%d\r\n", GPSerror, serialBuffer_write); #endif incrementPacketCount(); //Clear buffer data_temp[0] = '\0'; uint8_t n; //Create the packet int int_temp = RFM69_readTemp(); // Read transmitter temperature rx_rssi = RFM69_lastRssi(); floor_rssi = RFM69_sampleRssi(); #ifdef GPS n = sprintf(data_temp, "%d%cL%d,%d,%dT%dR%d[%s]", NUM_REPEATS, data_count, lat, lon, alt, int_temp, rx_rssi, NODE_ID); #else if(data_count == 97) { n = sprintf(data_temp, "%d%cL%s[%s]", NUM_REPEATS, data_count, LOCATION_STRING, NODE_ID); } else { n = sprintf(data_temp, "%d%cT%dR%d,%dC%d[%s]", NUM_REPEATS, data_count, int_temp, rx_rssi, floor_rssi, rx_packets, NODE_ID); } #endif transmitData(n); awaitData(TX_GAP); } }
int main() { // Disable, configure, and start the watchdog timer wdt_disable(); wdt_reset(); wdt_enable(WDTO_8S); // Start and configure all hardware peripherals sei(); led_init(); radio_init(); gps_init(); radio_enable(); // Set the radio shift and baud rate _radio_dac_write(RADIO_COARSE, RADIO_CENTER_FREQ); _radio_dac_write(RADIO_FINE, 0); radio_set_shift(RADIO_SHIFT_425); radio_set_baud(RADIO_BAUD_50); // Radio chatter for(uint8_t i = 0; i < 5; i++) { radio_chatter(); wdt_reset(); } int32_t lat = 0, lon = 0, alt = 0; uint8_t hour = 0, minute = 0, second = 0, lock = 0, sats = 0; while(true) { led_set(LED_GREEN, 1); // Get the current system tick and increment uint32_t tick = eeprom_read_dword(&ticks) + 1; // Check that we're in airborne <1g mode if( gps_check_nav() != 0x06 ) led_set(LED_RED, 1); // Get information from the GPS gps_check_lock(&lock, &sats); if( lock == 0x02 || lock == 0x03 || lock == 0x04 ) { gps_get_position(&lat, &lon, &alt); gps_get_time(&hour, &minute, &second); } led_set(LED_GREEN, 0); // Format the telemetry string & transmit double lat_fmt = (double)lat / 10000000.0; double lon_fmt = (double)lon / 10000000.0; alt /= 1000; sprintf(s, "$$" CALLSIGN ",%lu,%02u:%02u:%02u,%02.7f,%03.7f,%ld,%u,%x", tick, hour, minute, second, lat_fmt, lon_fmt, alt, sats, lock); radio_chatter(); radio_transmit_sentence(s); radio_chatter(); led_set(LED_RED, 0); eeprom_update_dword(&ticks, tick); wdt_reset(); _delay_ms(500); } return 0; }
int main() { char state; int nlock_count = 0, n; setup(); for (;;) { wdt.kick(); ftdi.printf("Entering Loop.\r\n"); status_led = !status_led; write_rfm868(0x07, 0x01); // turn tx off - needed for below code write_rfm434(0x07, 0x01); // If GPS does not have lock for > 8 loops, restart it. if (nlock_count>8) { gpsPower(0); wait(2); gpsPower(1); nlock_count = 0; } wait(0.1); // wait for tx to turn off // Get temp while radio off temperature = (int16_t)((temp.read_u16()-9930)/19.9); battery_voltage = (int16_t)(battery.read()*BATT_MUL); rssi = ((int)read_rfm868(26)*51 - 12400)/100; // returned in dBm if (rssi > -50) { // if 868 channel is busy enable_868 = 0; } else { enable_868 = 1; write_rfm868(0x07, 0x08); // turn tx on } write_rfm434(0x07, 0x08); // turn tx on // Check for GPS lock gps_check_lock(); if (lock==0) { state='L'; nlock_count++; } else if (!enable_868) { state='O'; } else { nlock_count = 0; state='F'; } gps_get_position(); gps_get_time(); // Process triggers here if (config_err == 0) { ftdi.printf("Running triggers... "); runTrigger(0); runTrigger(1); runTrigger(2); ftdi.printf("Finished. \r\n"); } // Cutdown check if (cutdown_enabled && (alt>CUTDOWN_ALT)) { // Double check the altitude! gps_get_position(); if (alt>CUTDOWN_ALT) { ftdi.printf("Cutting wire!!!! \r\n"); cutdown = 1; // burn that wire!!!!!. .. ! wait(3); cutdown = 0; cutdown_enabled = 0; state = 'C'; } } // Do TX (always true, triggers not quite working) //if (send_gps) { if (1) { n = sprintf (buffer434, "$$VERTIGO,%d,%02d%02d%02d,%ld,%ld,%ld,%d,%c", count434, hour, minute, second, lat, lon, alt, sats, state); n = sprintf (buffer434, "%s*%04X\n", buffer434, (CRC16_checksum(buffer434) & 0xFFFF)); rtty_434_txstring(buffer434); save_434id(count434++); send_gps = 0; } // And for 868 if enabled if(enable_868) { ftdi.printf("Doing 868 now \r\n"); for (int count=0; count<10; count++) { ftdi.printf("\t loop %d\r\n", count); last_lon = lon; last_lat = lat; last_alt = alt; gps_get_position(); gps_get_time(); if ((lat==last_lat)&&(lon==last_lon)&&(alt==last_alt)) { gps_check_lock(); } else { state = 'F'; // cheat a second here. } n = sprintf (buffer868, "$$8VERTIGO,%d,%02d%02d%02d,%ld,%ld,%ld,%d,%c,%d,%d,%d", count868, hour, minute, second, lat, lon, alt, sats, state, temperature, battery_voltage, rssi); n = sprintf (buffer868, "%s*%04X\n", buffer868, (CRC16_checksum(buffer868) & 0xFFFF)); rtty_868_txstring(buffer868); save_868id(count868++); } } } return 0; }