1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
/*
* A prototype driver. Doesn't run, doesn't even compile.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <stdio.h>
#include "gpsd.h"
#if defined(PROTO_ENABLE) && defined(BINARY_ENABLE)
#define GET_ORIGIN 1
#include "bits.h"
/*@ +charint -usedef -compdef @*/
static bool proto_write(int fd, unsigned char *msg, size_t msglen) {
bool ok;
/* CONSTRUCT THE MESSAGE */
/* we may need to dump the message */
gpsd_report(4, "writing proto control type %02x:%s\n",
msg[0], gpsd_hexdump(msg, msglen));
ok = (write(fd, msg, msglen) == (ssize_t)msglen);
(void)tcdrain(fd);
return(ok);
}
/*@ -charint +usedef +compdef @*/
/*@ +charint @*/
gps_mask_t proto_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
{
size_t i;
int used, visible;
double version;
if (len == 0)
return 0;
/* we may need to dump the raw packet */
gpsd_report(5, "raw proto packet type 0x%02x length %d: %s\n", buf[0], len, buf2);
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
"PROTO%d",(int)buf[0]);
switch (getub(buf, 0))
{
/* DISPATCH ON FIRST BYTE OF PAYLOAD */
default:
gpsd_report(3, "unknown Proto packet id %d length %d: %s\n", buf[0], len, gpsd_hexdump(buf, len));
return 0;
}
}
/*@ -charint @*/
static gps_mask_t proto_parse_input(struct gps_device_t *session)
{
gps_mask_t st;
if (session->packet_type == PROTO_PACKET){
st = proto_parse(session, session->outbuffer, session->outbuflen);
session->gpsdata.driver_mode = 1;
return st;
#ifdef NMEA_ENABLE
} else if (session->packet_type == NMEA_PACKET) {
st = nmea_parse((char *)session->outbuffer, session);
session->gpsdata.driver_mode = 0;
return st;
#endif /* NMEA_ENABLE */
} else
return 0;
}
static bool proto_set_mode(struct gps_device_t *session,
speed_t speed, bool mode)
{
/*@ +charint @*/
unsigned char msg[] = {/* FILL ME*/};
/* HACK THE MESSAGE */
return proto_write(session->gpsdata.gps_fd, msg, sizeof(msg));
/*@ +charint @*/
}
static bool proto_speed(struct gps_device_t *session, speed_t speed)
{
return proto_set_mode(session, speed, true);
}
static void proto_mode(struct gps_device_t *session, int mode)
{
if (mode == 0) {
(void)gpsd_switch_driver(session, "Generic NMEA");
(void)proto_set_mode(session, session->gpsdata.baudrate, false);
session->gpsdata.driver_mode = 0;
}
}
static void proto_initializer(struct gps_device_t *session)
/* poll for software version in order to check for old firmware */
{
if (session->packet_type == NMEA_PACKET)
(void)proto_set_mode(session, session->gpsdata.baudrate, true);
}
/* this is everything we export */
struct gps_type_t proto_binary =
{
.typename = "Prototype driver", /* full name of type */
.trigger = NULL, /* recognize the type */
.channels = 12, /* consumer-grade GPS */
.probe = NULL, /* no probe */
.initializer = proto_initializer,/* initialize the device */
.get_packet = packet_get, /* use generic packet getter */
.parse_packet = proto_parse_input,/* parse message packets */
.rtcm_writer = pass_rtcm, /* send RTCM data straight */
.speed_switcher = proto_speed, /* we can change baud rates */
.mode_switcher = proto_mode, /* there is a mode switcher */
.rate_switcher = NULL, /* no rate switcher */
.cycle_chars = -1, /* not relevant, no rate switcher */
.wrapup = NULL, /* no close hook */
.cycle = 1, /* updates every second */
};
#endif /* defined(PROTO_ENABLE) && defined(BINARY_ENABLE) */
|