void entry(void) { int8_t tag_angle; /* set advertisment packet */ radio_advertise(&g_beacon_pkt, sizeof(g_beacon_pkt)); /* run advertisement in background every 995ms */ radio_interval_ms(995); /* infinite foreground loop */ while(TRUE) { /* get tag angle from 3D accelerometer */ acc_magnitude(&tag_angle); /* only tx while beacon is worn (facing forward +/-45 degree) */ radio_enable(abs(tag_angle)<45); /* blink once every three seconds */ timer_wait_ms(3000); pin_set(CONFIG_LED_PIN); timer_wait_ms(1); pin_clear(CONFIG_LED_PIN); } }
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; }