void rtx_init(void) { /* RTTY is driven by TIMER0 in CTC mode */ TCCR0A = _BV(WGM01); /* Mode 2, CTC */ TCCR0B = _BV(CS02) | _BV(CS00); /* prescaler 1024 */ OCR0A = F_CPU / 1024 / RTTY_BAUD - 1; TIMSK0 = _BV(OCIE0A); /* Enable interrupt */ /* We use Port B pins 1 and 2 */ TXBIT(1); rtx_enable(0); DDRB |= TXPIN | TXENABLE; }
int main(void) { uint32_t count = 0; int32_t lat, lon, alt, temp; uint8_t hour, minute, second; uint16_t mv; char msg[100]; uint8_t i, r; /* Set the LED pin for output */ DDRB |= _BV(DDB7); adc_init(); rtx_init(); gps_setup(); /* Enable the radio and let it settle */ rtx_enable(1); _delay_ms(1000); sei(); rtx_string_P(PSTR(RTTY_CALLSIGN " starting up\n")); rtx_string_P(PSTR("Scanning 1-wire bus:\n")); for(i = 0; i < 3; i++) { r = ds_search_rom(id[i], i); if(r == DS_OK || r == DS_MORE) { rtx_wait(); snprintf(msg, 100, "%i> %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n", i, id[i][0], id[i][1], id[i][2], id[i][3], id[i][4], id[i][5], id[i][6], id[i][7]); rtx_string(msg); } else { rtx_wait(); snprintf(msg, 100, "%i> Error %i\n", i, r); rtx_string(msg); } if(r != DS_MORE) break; } rtx_string_P(PSTR("Done\n")); while(1) { if(!gps_get_pos(&lat, &lon, &alt)) { rtx_string_P(PSTR("$$" RTTY_CALLSIGN ",No or invalid GPS response\n")); continue; } if(!gps_get_time(&hour, &minute, &second)) { rtx_string_P(PSTR("$$" RTTY_CALLSIGN ",No or invalid GPS response\n")); continue; } /* Read the battery voltage */ mv = adc_read(); /* Read the temperature from sensor 0 */ ds_read_temperature(&temp, id[0]); rtx_wait(); snprintf(msg, 100, "$$%s,%li,%02i:%02i:%02i,%s%li.%05li,%s%li.%05li,%li,%i.%02i,%li.%01li,%c", RTTY_CALLSIGN, count++, hour, minute, second, (lat < 0 ? "-" : ""), labs(lat) / 10000000, labs(lat) % 10000000 / 100, (lon < 0 ? "-" : ""), labs(lon) / 10000000, labs(lon) % 10000000 / 100, alt / 1000, mv / 1000, mv / 10 % 100, temp / 10000, labs(temp) / 1000 % 10, (geofence_uk(lat, lon) ? '1' : '0')); crccat(msg + 2); rtx_string(msg); } }
int main(void) { uint32_t count = 0; int32_t lat, lon, alt, temp1, temp2, pressure; uint8_t hour, minute, second; uint16_t mv; char msg[100]; uint8_t i, r; bmp085_t bmp; /* Set the LED pin for output */ DDRB |= _BV(DDB7); adc_init(); rtx_init(); bmp085_init(&bmp); #ifdef APRS_ENABLED ax25_init(); #endif #ifdef SSDV_ENABLED c3_init(); #endif sei(); gps_setup(); /* Enable the radio and let it settle */ rtx_enable(1); _delay_ms(1000); rtx_string_P(PSTR(RTTY_CALLSIGN " starting up\n")); /* Scan the 1-wire bus, up to 16 devices */ rtx_string_P(PSTR("Scanning 1-wire bus:\n")); for(i = 0; i < 16; i++) { r = ds_search_rom(id[i], i); if(r == DS_OK || r == DS_MORE) { /* A device was found, display the address */ rtx_wait(); snprintf_P(msg, 100, PSTR("%i> %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n"), i, id[i][0], id[i][1], id[i][2], id[i][3], id[i][4], id[i][5], id[i][6], id[i][7]); rtx_string(msg); } else { /* Device not responding or no devices found */ rtx_wait(); snprintf_P(msg, 100, PSTR("%i> Error %i\n"), i, r); rtx_string(msg); } /* No more devices? */ if(r != DS_MORE) break; } rtx_string_P(PSTR("Done\n")); while(1) { /* Set the GPS navmode every 10 strings */ if(count % 10 == 0) { /* Mode 6 is "Airborne with <1g Acceleration" */ if(gps_set_nav(6) != GPS_OK) { rtx_string_P(PSTR("$$" RTTY_CALLSIGN ",Error setting GPS navmode\n")); } } /* Get the latitude and longitude */ if(gps_get_pos(&lat, &lon, &alt) != GPS_OK) { rtx_string_P(PSTR("$$" RTTY_CALLSIGN ",No or invalid GPS response\n")); lat = lon = alt = 0; } /* Get the GPS time */ if(gps_get_time(&hour, &minute, &second) != GPS_OK) { rtx_string_P(PSTR("$$" RTTY_CALLSIGN ",No or invalid GPS response\n")); hour = minute = second = 0; } /* Read the battery voltage */ mv = adc_read(); /* Read the temperature from sensor 0 */ ds_read_temperature(&temp1, id[0]); /* Read the temperature from sensor 1 */ ds_read_temperature(&temp2, id[1]); /* Read the pressure from the BMP085 */ if(bmp085_sample(&bmp, 3) != BMP_OK) pressure = 0; else pressure = bmp085_calc_pressure(&bmp); /* Build up the string */ rtx_wait(); snprintf_P(msg, 100, PSTR("$$%s,%li,%02i:%02i:%02i,%s%li.%04li,%s%li.%04li,%li,%i.%01i,%li,%li,%li,%c"), RTTY_CALLSIGN, count++, hour, minute, second, (lat < 0 ? "-" : ""), labs(lat) / 10000000, labs(lat) % 10000000 / 1000, (lon < 0 ? "-" : ""), labs(lon) / 10000000, labs(lon) % 10000000 / 1000, alt / 1000, mv / 1000, mv / 100 % 10, temp1 / 10000, temp2 / 10000, pressure, (geofence_test(lat, lon) ? '1' : '0')); crccat(msg); rtx_string(msg); #ifdef APRS_ENABLED tx_aprs(lat, lon, alt); { int i; for(i = 0; i < 60; i++) _delay_ms(1000); } #endif #ifdef SSDV_ENABLED if(tx_image() == -1) { /* The camera goes to sleep while transmitting telemetry, * sync'ing here seems to prevent it. */ c3_sync(); } #endif } }