/* EIVA nav. data simulator writeeiva.c need to be linked with LatLong-UTMconversion.cpp, written by Chuck Gantz http://www.gpsy.com/gpsinfo/geotoutm/ To compile: g++ -c main.c g++ -c LatLong-UTMconversion.cpp g++ -o eivasim LatLong-UTMconversion.o main.o */ #include #include #include "readgps.c" #include "writeeiva.c" #define SERIALPORT "/dev/ttyS0" #define PARALLELPORT "/dev/parport0" int main(int argc, char *argv[]); int main(int argc, char *argv[]) { FILE *term; struct eivadata eiva; int err; int para; int delay; time_t tnow; time_t tlast = 0; struct tm mktmp; if ((term = readgps_serialsetup(SERIALPORT)) == NULL) { perror("Could not open serial port"); return 1; } if ((para = writeeiva_parsetup(PARALLELPORT)) == -1) { perror("Could not open paralell port"); return 1; } if (argc > 1) delay = atoi(argv[1]); else delay = 0; while (1) { /* Read next $PGRMF GPS data from serial port */ eiva = readgps_read(term); mktmp = eiva.time; /* Temporary tm struct because of mktime() */ tnow = mktime(&mktmp); /* mktime() changes the tm structure to wrong value */ /* Shoot if delay have passed */ if (difftime(tnow, tlast) >= delay) { if (writeeiva_ack(para) != 0) fprintf(stderr, "Failed to set ACK on parallel port\n"); if ((tnow - tlast) >= delay) { err = writeeiva_write(term, eiva); if (err == -1) fprintf(stderr, "Failed to format EIVA data\n"); else if (err > 0) fprintf(stderr, "Failed to write %i characters EIVA data to serial port\n", err); } printf("%.2i:%.2i:%.2i %.2i.%.2i.%.4i %.0f %.0f 0 0 \n", eiva.time.tm_hour, eiva.time.tm_min, eiva.time.tm_sec, eiva.time.tm_mday, eiva.time.tm_mon, eiva.time.tm_year + 1900, eiva.easting, eiva.northing); fflush(stdout); tlast = tnow; } else if (delay > 1) { printf("Next shot: %8.0f | Time: %.2i:%.2i:%.2i %.2i.%.2i.%.4i (%c) | Lat/lon.: %.4f %.4f \r", delay - difftime(tnow, tlast), eiva.time.tm_hour, eiva.time.tm_min, eiva.time.tm_sec, eiva.time.tm_mday, eiva.time.tm_mon, eiva.time.tm_year + 1900, eiva.tsource, eiva.latitude, eiva.longitude); fflush(stdout); } } if (readgps_close(term) != 0) perror("Could not close serial port"); if (writeeiva_close(para) != 0) perror("Could not close serial port"); return 0; } /* Seriall port: #include #include #include int seri; unsigned int bits; seri = open(SERIALPORT, O_WRONLY | O_NOCTTY); if (ioctl(seri, TIOCMGET, &bits)) { fprintf(stderr, "Failed to read status data from seriall port\n"); return 1; } bits |= (TIOCM_DTR); if (ioctl(seri, TIOCMSET, &bits)) fprintf(stderr, "Error setting DTR high\n"); usleep(1000); bits &= ~(TIOCM_DTR); if (ioctl(seri, TIOCMSET, &bits)) fprintf(stderr, "Error setting DTR low\n"); */