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