GPSのログを記録する

 

CFGPS2のログを取り出すプログラムを作りました。
カシミール3Dへの入力に使えるかもしれません。

●ダウンロード

gpstrack

●使い方

まずCFGPS2をSLザウルスのCFスロットに挿します。

次にダウンロードした「gpstrack」を適当なディレクトリにコピーし、
ターミナル等で、

chmod 755 gpstrack

として実行可能とし、

./gpstrack

などとして実行します。

画面に、CFGPS2のログが次々と表示されます。

衛星を補足できた頃を見計らって、1回スペースキーを押すと、カレントディレクトリに、yyyy.mm.dd.log(2003年9月20日に実行した場合、2003-09.20.log)という名前のファイルができ、その中にログが記録されます。

もう一度、スペースキーを押すと記録をやめます。

●ソースコード

/////////////////////////////////////////////////////////////////////////////
//
// CFGPS2 LOGGER for SL Zaurus
// (C)Tsuyoshi ABE 2003.9.20
//
/////////////////////////////////////////////////////////////////////////////

#include <time.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termio.h>
#include <unistd.h>

int main(int argc, char** argv) {

  const  char*   tty_name  = "/dev/ttyS3";
  int            tty_speed = B4800;
  int            tty_fd    = -1;
  struct termios tty_set;
  fd_set         fds;

  char buf[255];
  int num = 0;

  int status = 0;

  //// open logfile ///////////////////////////////////////////////////////
  const  time_t now = time(NULL);
  struct tm *now_tm = localtime(&now);
  char logfilename[15];
  FILE *fp;
  sprintf(logfilename, "%4d-%02d-%02d.log",
	  now_tm->tm_year+1900, now_tm->tm_mon+1, now_tm->tm_mday);
  fp = fopen(logfilename, "a");

  //// open ttyfd ///////////////////////////////////////////////////////
  system("cardctl resume");
  if ((tty_fd = open(tty_name, O_RDWR)) < 0) {
    fprintf(stderr, "can't open %s\n", tty_name);
    exit(0);
  }
  bzero(&tty_set, sizeof(tty_set));
  tty_set.c_cflag = tty_speed | CS8 | CREAD | CLOCAL;
  tty_set.c_iflag = IGNPAR | IGNCR;
  tty_set.c_oflag = 0;
  tty_set.c_lflag = ICANON;
  tcflush(tty_fd, TCIFLUSH);
  tcsetattr(tty_fd, TCSANOW, &tty_set);

  //// loop ///////////////////////////////////////////////////////////

  while(1) {
    FD_ZERO(&fds);
    FD_SET(tty_fd, &fds);
    FD_SET(0, &fds);

    select(tty_fd + 1, &fds, NULL, NULL, NULL);
    if (FD_ISSET(tty_fd, &fds)) {
      num = read(tty_fd, buf, 255);
      buf[num] = '\0';
      fprintf(stderr, "%d ", status);
      printf("%s", buf);
      if (status == 1) {
	fprintf(fp, "%s", buf);
      }
    }

    if (FD_ISSET(0, &fds)) {
      status++;
      fgets(buf, 255, stdin);
      if (status > 1) {
        system("cardctl suspend");
	fclose(fp);
        exit(1);
      }
    }

  }
}

●参考文献

(2003.10.21)