RS-tracker/m10/m10c_part.c

206 wiersze
3.9 KiB
C

/*
* radiosonde M10 (Trimble GPS)
* author: zilog80
*
* big endian forest
*/
typedef struct {
int week; int gpssec;
int jahr; int monat; int tag;
int wday;
int std; int min; int sek;
double lat; double lon; double h;
} datum_t;
datum_t datum;
#define BAUD_RATE 4800
unsigned char header_bytes[] = { 0x64, 0x9F, 0x20 };
char header[] = "011001001001111100100000";
#define FRAME_LEN 102
int framebytes[FRAME_LEN];
int bits2bytes(char *bits) {
// big endian
// framebytes[pos] = byteval;
}
/* -------------------------------------------------------------------------- */
#define pos_GPSTOW 0x0A // 4 byte
#define pos_GPSlat 0x0E // 4 byte
#define pos_GPSlon 0x12 // 4 byte
#define pos_GPSheight 0x16 // 4 byte
#define pos_GPSweek 0x20 // 2 byte
char weekday[7][3] = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
double B60B60 = 0xB60B60; // 2^32/360 = 0xB60B60.xxx
void Gps2Date(long GpsWeek, long GpsSeconds, int *Year, int *Month, int *Day) {
//
}
int get_GPSweek() {
//
for (i = 0; i < 2; i++) {
gpsweek_bytes[i] = framebytes[pos_GPSweek + i];
}
datum.week = (gpsweek_bytes[0] << 8) + gpsweek_bytes[1];
return 0;
}
int get_GPStime() {
//
for (i = 0; i < 4; i++) {
gpstime_bytes[i] = framebytes[pos_GPSTOW + i];
}
gpstime = 0;
for (i = 0; i < 4; i++) {
gpstime |= gpstime_bytes[i] << (8*(3-i));
}
//ms = gpstime % 1000;
gpstime /= 1000;
datum.gpssec = gpstime;
day = gpstime / (24 * 3600);
gpstime %= (24*3600);
datum.wday = day;
datum.std = gpstime/3600;
datum.min = (gpstime%3600)/60;
datum.sek = gpstime%60;
return 0;
}
int get_GPSlat() {
//
for (i = 0; i < 4; i++) {
gpslat_bytes[i] = framebytes[pos_GPSlat + i];
}
gpslat = 0;
for (i = 0; i < 4; i++) {
gpslat |= gpslat_bytes[i] << (8*(3-i));
}
datum.lat = gpslat / B60B60;
return 0;
}
int get_GPSlon() {
//
for (i = 0; i < 4; i++) {
gpslon_bytes[i] = framebytes[pos_GPSlon + i];
}
gpslon = 0;
for (i = 0; i < 4; i++) {
gpslon |= gpslon_bytes[i] << (8*(3-i));
}
datum.lon = gpslon / B60B60;
return 0;
}
int get_GPSheight() {
//
for (i = 0; i < 4; i++) {
gpsheight_bytes[i] = framebytes[pos_GPSheight + i];
}
gpsheight = 0;
for (i = 0; i < 4; i++) {
gpsheight |= gpsheight_bytes[i] << (8*(3-i));
}
datum.h = gpsheight / 1000.0;
return 0;
}
/* -------------------------------------------------------------------------- */
int print_pos() {
int err;
err = 0;
err |= get_GPSweek();
err |= get_GPStime();
err |= get_GPSlat();
err |= get_GPSlon();
err |= get_GPSheight();
if (!err) {
Gps2Date(datum.week, datum.gpssec, &datum.jahr, &datum.monat, &datum.tag);
printf(" (W %d) ", datum.week);
printf("%s ", weekday[datum.wday]);
printf("%04d-%02d-%02d (%02d:%02d:%02d) ",
datum.jahr, datum.monat, datum.tag, datum.std, datum.min, datum.sek);
printf(" lat: %.6f ", datum.lat);
printf(" lon: %.6f ", datum.lon);
printf(" h: %.2f ", datum.h);
printf("\n");
}
return err;
}
void print_frame() {
int i;
ui8_t byte;
for (i = 0; i < FRAME_LEN; i++) {
byte = framebytes[i];
fprintf(stdout, "%02x", byte);
}
fprintf(stdout, "\n");
}
int main(int argc, char **argv) {
while ( !read_bits_psk() ) {
//
// read_bit_PSK:
/*
synch: ...,du,ud,du oder ...,ud,du,ud
bit 0: ud,du oder du,ud
bit 1: du,du oder ud,ud (phase shift)
Header
_uuddu udududduududduud udduudududududud duududduudduuddu (oder:)
_dduud dududuudduduuddu duuddudududududu udduduudduudduud (invers)
0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0
*/
// header_found
// bits2byte
// framebytes
//
if (option_raw) print_frame();
else print_pos();
}
return 0;
}