kopia lustrzana https://github.com/projecthorus/radiosonde_auto_rx
pull/13/head
rodzic
79d96b171c
commit
7463998f5a
Plik binarny nie jest wyświetlany.
Po Szerokość: | Wysokość: | Rozmiar: 285 KiB |
Plik binarny nie jest wyświetlany.
|
@ -0,0 +1,205 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue