Ejemplo n.º 1
0
Archivo: tests.c Proyecto: eketh/minmea
END_TEST

START_TEST(test_minmea_parse_gst1)
{
    const char *sentence = "$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58";
    struct minmea_sentence_gst frame = {};
    struct minmea_sentence_gst expected = {
        .time = { 2, 46, 3, 0 },
        .rms_deviation = 32,
        .rms_deviation_scale = 10,
        .semi_major_deviation = 66,
        .semi_major_deviation_scale = 10,
        .semi_minor_deviation = 47,
        .semi_minor_deviation_scale = 10,
        .semi_major_orientation = 473,
        .semi_major_orientation_scale = 10,
        .latitude_error_deviation = 58,
        .latitude_error_deviation_scale = 10,
        .longitude_error_deviation = 56,
        .longitude_error_deviation_scale = 10,
        .altitude_error_deviation = 220,
        .altitude_error_deviation_scale = 10,
    };
    ck_assert(minmea_check(sentence) == true);
    ck_assert(minmea_parse_gst(&frame, sentence) == true);
    ck_assert(!memcmp(&frame, &expected, sizeof(frame)));
}
Ejemplo n.º 2
0
Archivo: tests.c Proyecto: eketh/minmea
END_TEST

START_TEST(test_minmea_usage1)
{
    const char *sentences[] = {
        "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62",
        "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47",
        "$GNGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1",
        "$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58",
        NULL,
    };

    for (const char **sentence=sentences; *sentence; sentence++) {
        switch (minmea_sentence_id(*sentence)) {
            case MINMEA_SENTENCE_RMC: {
                struct minmea_sentence_rmc frame;
                ck_assert(minmea_parse_rmc(&frame, *sentence) == true);
            } break;

            case MINMEA_SENTENCE_GGA: {
                struct minmea_sentence_gga frame;
                ck_assert(minmea_parse_gga(&frame, *sentence) == true);
            } break;

            case MINMEA_SENTENCE_GSA: {
                struct minmea_sentence_gsa frame;
                ck_assert(minmea_parse_gsa(&frame, *sentence) == true);
            } break;

            case MINMEA_SENTENCE_GST: {
                struct minmea_sentence_gst frame;
                ck_assert(minmea_parse_gst(&frame, *sentence) == true);
            } break;

            default: {
            } break;
        }

        char talker[3];
        char expected[3] = { (*sentence)[1], (*sentence)[2], '\0' };
        ck_assert(minmea_talker_id(talker, *sentence) == true);
        ck_assert_str_eq(talker, expected);
    }
}
Ejemplo n.º 3
0
void decode_NMEA(char *buffer, FILE *fp)
{
    struct timespec next;

    clock_gettime(CLOCK_MONOTONIC, &next);
    switch (minmea_sentence_id(buffer, false)) {
        case MINMEA_SENTENCE_RMC: {
            struct minmea_sentence_rmc frame;
            if (minmea_parse_rmc(&frame, buffer)) {
                fprintf(fp, "$RMC: %ld.%ld\t coordinates and speed: (%f,%f) %f\tDate: %d/%d/%d\n",
                        (long) next.tv_sec, (long) next.tv_nsec,
                        minmea_tocoord(&frame.latitude),
                        minmea_tocoord(&frame.longitude),
                        minmea_tofloat(&frame.speed),
                        frame.date.day, frame.date.month, frame.date.year
                        );
            }else {
                fprintf(fp, "$RMC sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_GGA: {
            struct minmea_sentence_gga frame;
            if (minmea_parse_gga(&frame, buffer)) {
                fprintf(fp, "$GGA: %ld.%ld\t fix quality: %d\t Altitude: %0.8f\t Time: %02d:%02d:%02d.%06d\n",
                        (long) next.tv_sec, (long) next.tv_nsec,
                        frame.fix_quality,
                        minmea_tofloat(&frame.altitude),
                        frame.time.hours, frame.time.minutes, frame.time.seconds, frame.time.microseconds);
            }
            else {
                fprintf(fp, "$GGA sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_GST: {
            struct minmea_sentence_gst frame;
            if (minmea_parse_gst(&frame, buffer)) {
                fprintf(fp, "$GST: %ld.%ld\t floating point degree latitude, longitude and altitude error deviation: (%f,%f,%f)\n",
                        (long) next.tv_sec, (long) next.tv_nsec,
                        minmea_tofloat(&frame.latitude_error_deviation),
                        minmea_tofloat(&frame.longitude_error_deviation),
                        minmea_tofloat(&frame.altitude_error_deviation));
            }
            else {
                fprintf(fp, "$GST sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_GSV: {
            struct minmea_sentence_gsv frame;
            if (minmea_parse_gsv(&frame, buffer)) {
                if (frame.msg_nr == frame.total_msgs)
                    fprintf(fp, "$GSV: %ld.%ld\t satellites in view: %d\n",
                        (long) next.tv_sec, (long) next.tv_nsec, frame.total_sats);
            }
            else {
                fprintf(fp, "$GSV sentence is not parsed\n");
            }
        } break;

        case MINMEA_SENTENCE_GSA: {
            struct minmea_sentence_gsa frame;
            if (minmea_parse_gsa(&frame, buffer)) {
                fprintf(fp, "$GSA: %ld.%ld\t Fix quality:\t %f, %f, %f\n",
                        (long) next.tv_sec, (long) next.tv_nsec,
                        minmea_tofloat(&frame.pdop),
                        minmea_tofloat(&frame.hdop),
                        minmea_tofloat(&frame.vdop));
            }
            else {
                fprintf(fp, "$GSA sentence not parsed\n");
            }
        } break;

        case MINMEA_INVALID: {
            fprintf(fp, "$xxxxx sentence is not valid:\n\t%s\n", buffer);
        } break;

        default: {
            buffer[6] = '\0';
            fprintf(fp, "%s sentence is not parsed\n", buffer);
        } break;

    }

}