gpsd をアップデートする

# 目的
Raspberry Pi の apt に入っている gpsd は現状 3.16 なので 3.19 へアップデートする。

# ダウンロード先
[gpsd](https://gpsd.gitlab.io/gpsd/)/[download](http://download-mirror.savannah.gnu.org/releases/gpsd/) 

# インストール方法
[octave 5.1.0 のコンパイル](https://qiita.com/jp_yen/items/99b877d6bdd4264ec75b) にあるように `$HOME/opt/SRC` 以下でコンパイルし、`$HOME/opt` 以下にインストールします。また、ほぼ関係ないですが `tcsh` を使用しています。
INSTALL ドキュメントによると

```tcsh:
# apt-get update
# apt-get dist-upgrade
# rpi-update
# reboot

--------------------------------------------------------------
# apt-get install scons libncurses5-dev python-dev pps-tools
# apt-get install git-core
```
をした方が良いそうです。pps-tools は PPS を使う場合、git-core は git リポジトリを引っ張ってきてコンパイルする場合のみ必要です。
以下、tar ball を取ってきてコンパイルします。

## scons のアップデート
その前に [scons](https://sourceforge.net/projects/scons/) が古いので scons を入れる。(configure ツールと類似のもの)

```tcsh:
> tar xzvf scons-3.1.1.tar.gz
> cd scons-3.1.1
> sudo python setup.py install
> scons --version
SCons by Steven Knight et al.:
        script: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog
        engine: v2.5.1.rel_2.5.1:3735:9dc6cee5c168[MODIFIED], 2016/11/03 14:02:02, by bdbaddog on mongodog
        engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2016 The SCons Foundation
> rehash
> scons --version
SCons by Steven Knight et al.:
        script: v3.1.1.72ae09dc35ac2626f8ff711d8c4b30b6138e08e3, 2019-08-08 14:50:06, by bdeegan on octodog
        engine: v3.1.1.72ae09dc35ac2626f8ff711d8c4b30b6138e08e3, 2019-08-08 14:50:06, by bdeegan on octodog
        engine path: ['/home/pi/.local/lib/python2.7/site-packages/scons/SCons']
Copyright (c) 2001 - 2019 The SCons Foundation
```
## gpsd をダウンロード

```tcsh:
> wget http://download-mirror.savannah.gnu.org/releases/gpsd/gpsd-3.19.tar.gz
> tar axf gpsd-3.19.tar.gz
```
## シリアルポートのデフォルト値を書き換える
```diff:
> diff -u gps_json.h.orig gps_json.h
--- gps_json.h.orig     2019-10-04 03:54:29.629983015 +0900
+++ gps_json.h  2019-10-04 03:55:37.959770483 +0900
@@ -52,9 +52,9 @@
 #endif

 /* these values don't matter in themselves, they just have to be out-of-band */
-#define DEVDEFAULT_BPS         0
-#define DEVDEFAULT_PARITY      'X'
-#define DEVDEFAULT_STOPBITS    3
+#define DEVDEFAULT_BPS         115200
+#define DEVDEFAULT_PARITY      'N'
+#define DEVDEFAULT_STOPBITS    1
 #define DEVDEFAULT_NATIVE      -1

 /* gps_json.h ends here */
```
パッチは patch -ul で
## コンパイル & インストール
gcc 9 でうまくリンクできないので、システム標準の gcc 6 を利用。

```tcsh:
> setenv CC gcc-6
> scons prefix=$HOME/opt libdir=$HOME/opt/lib fixed_port_speed=115200 fixed_stop_bits=1 gpsd_user=gpsd max_clients=16 max_devices=4 python_libdir=$HOME/opt/lib/python2.7/site-packages
> scons install
```

# 設定ファイルを編集
(無ければ ./packaging/deb/etc_default_gpsd を元に編集)
本当であれば /etc/default/gpsd にはデフォルト値を設定、/etc/sysconfig/gpsd にシステム固有値を設定するべき。

```conf:/etc/default/gpsd
# Default settings for gpsd.
# Please do not edit this file directly - use `dpkg-reconfigure gpsd' to
# change the options.

# Start the gpsd daemon automatically at boot time
START_DAEMON="true"

# Use USB hotplugging to add new USB devices automatically to the daemon
USBAUTO="true"

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
#DEVICES=""
DEVICES="/dev/ttyS0 /dev/pps0 /dev/ttyUSB0 /dev/ttyUSB1"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-n "
GPSD_SOCKET="/var/run/gpsd.sock"
```
## systemd スクリプトを編集 & インストール
gpsd のパスを書き換え

```diff:
> cd ~/opt/SRC/gpsd-3.19/systemd
> diff -u gpsd.service.orig gpsd.service
--- gpsd.service.orig   2019-10-04 06:15:08.722135973 +0900
+++ gpsd.service        2019-10-04 06:16:28.911777447 +0900
@@ -8,7 +8,7 @@
 Type=forking
 EnvironmentFile=-/etc/default/gpsd
 EnvironmentFile=-/etc/sysconfig/gpsd
-ExecStart=/usr/local/sbin/gpsd $GPSD_OPTIONS $OPTIONS $DEVICES
+ExecStart=/home/pi/opt/sbin/gpsd $GPSD_OPTIONS $OPTIONS $DEVICES

 [Install]
 WantedBy=multi-user.target
```
systemd のファイル、設定ファイルをインストール & 反映 & 起動 & 起動確認

```tcsh:
> sudo install -o root -m 644 ~pi/opt/SRC/gpsd-3.19/systemd/gpsd.service /lib/systemd/system
> sudo install -o root -m 644 ~pi/opt/SRC/gpsd-3.19/systemd/gpsd.socket /lib/systemd/system/gpsd.socket
> sudo systemctl daemon-reload
> sudo systemctl restart gpsd
> ps -ef | grep '[g]psd'
gpsd      6758     1  3 Oct04 ?        00:15:49 /home/pi/opt/sbin/gpsd -n /dev/ttyS0 /dev/pps0 /dev/ttyUSB0 /dev/ttyUSB1
```
gpsd ユーザに chuid して起動してますね。本当は chroot したいところ。
# ntpd との接続状況は？

```tcsh:ntpq&nbsp;-p
> ntpq -p
     remote                                   refid      st t when poll reach   delay   offset   jitter
=======================================================================================================
-ntp-a3.nict.go.jp                       .NICT.           1 u  169  256  377  10.1366   1.1938   1.4570
-ntp-b2.nict.go.jp                       .NICT.           1 u   49  256  377   9.2388   1.0436   1.4419
+ntp-b3.nict.go.jp                       .NICT.           1 u   64  256  377   9.1811   0.4555   1.6960
-ntp-a2.nict.go.jp                       .NICT.           1 u  186  256  377  10.4030   1.4825   0.7268
-61-114-187-55.secomtrust.net            .PPS.            1 u  221  256  377  10.9200   0.6520   1.4305
-cwa225.bai.ne.jp                        210.171.0.34     4 u  204  256  377   3.2132   1.1935   1.3862
-cwa201.bai.ne.jp                        210.171.0.34     4 u  227  256  377   1.4529   5.6846   1.6168
xSHM(0)                                  .NEMA.           0 l    -    1  377   0.0000 -78.3350  13.1898
+SHM(2)                                  .PPS.            0 l    -    1  377   0.0000   0.2891   0.1488
xSHM(3)                                  .NEMA.           0 l    -    1  377   0.0000 -80.4701  12.9183
xSHM(4)                                  .PPS.            0 l    -    1  377   0.0000 -1000.37   0.0685
xSHM(5)                                  .NEMA.           0 l    -    1  377   0.0000 -86.9129   4.7834
*SHM(6)                                  .PPS.            0 l    -    1  377   0.0000  -0.3959   0.0899
```
SHM(4) が 1秒ずれてる。

# 1日程走らせて安定度は
NTPsec 付属の ntpviz コマンドで ntpd が正しいだろうと推測した時刻とのオフセットを確認。
 
```tcsh:ntpviz
> ntpviz -o . -T png -g -w l --peer-offsets="SHM(2),SHM(4),SHM(6)" -p 1 > plot_pps.png  ;\
? ntpviz -o . -T png -g -w l --peer-offsets="SHM(2)" -p 1 > "plot_SHM(2).png" ;\
? ntpviz -o . -T png -g -w l --peer-offsets="SHM(4)" -p 1 > "plot_SHM(4).png" ;\
? ntpviz -o . -T png -g -w l --peer-offsets="SHM(6)" -p 1 > "plot_SHM(6).png"
```
-o を指定していても標準出力に吐いてくるのは何故...

### SHM(2) が UART 直接接続、SHM(4), SHM(6) が USB ポート経由。
![plot_pps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/ab8946b6-b948-a279-723c-1cd1ab197cf2.png)
### SHM(4), SHM(6) 比較。大体同じ傾向ですね。
ntpviz -T png -g -w l --peer-offsets="SHM(4),SHM(6)" -p 1 > plot.png
![plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/2371ef2a-b30f-c0ef-b5a4-ca3c54e38ed4.png)

### SHM(2) 単独
![plot_SHM(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/44a67faa-de4a-e50e-98fb-db08eb25ccaa.png)

### SHM(4) 単独
![plot_SHM(4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/8627bc9a-0ac1-495a-4572-1130bd5e8348.png)
SHM(4) は、1秒ずれと正常値が行ったり来たり。

### SHM(6) 単独
![plot_SHM(6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/45b20354-45ed-f89d-85dd-c9a6573691b4.png)

SHM(2), SHM(4) は時々 1秒ずれが出てますが、SHM(6) は安定してますね。
通信速度の固定したのが悪いのかなぁ？

ntpviz は Raspberry Pi には結構重いですね。nice 19 とかされてるのに全く操作を受け付けなくなったりしますから。

# SHM(3) の jitter が大きくなった
ntpviz -T png -g -w l -c --peer-jitters="SHM(3)" -p 7 > "plot_SHM(3)_jitter.png"
![plot_SHM(3)_jitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/c6ab8780-e63e-30d4-37b1-b5305c2bfa2d.png)
gpsd を入れた辺りから誤差が大きくなってますね(>_<)

## build の回線速度固定を外してみる
fixed_port_speed=115200 fixed_stop_bits=1 を外して build して 6時間ほど実行。

```tcsh:
> scons prefix=$HOME/opt libdir=$HOME/opt/lib gpsd_user=gpsd max_clients=16 max_devices=4 python_libdir=$HOME/opt/lib/python2.7/site-packages
```
![plot_SHM(3)jitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/40adc019-6bc0-5a4b-f448-19088af5eb12.png)
治らないですね。

SHM(0) の offset 値も大きくなっている
![plot_SHM(0)_offset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/40ff5e36-05bd-0490-f205-354d46d4a506.png)


## gps_json.h のパッチも外してみる
何が悪いのか確認のため、gps_json.h のパッチを外してまっさらな状態で gpsd を build し、試す。

```tcsh:
> rm -rf gpsd-3.19
> tar axf gpsd-3.19.tar.gz
> cd gpsd-3.19
> scons prefix=$HOME/opt libdir=$HOME/opt/lib gpsd_user=gpsd python_libdir=$HOME/opt/lib/python2.7/site-packages
> scons install
> sudo systemctl restart gpsd
```

うーん、gpsd の出力の時刻が安定しないなぁ。

```tcsh:ntpq
     remote                                   refid      st t when poll reach   delay   offset   jitter
=======================================================================================================
*ntp-a3.nict.go.jp                       .NICT.           1 u  188  256   37  10.4783  91.2221  52.3003
+ntp-b2.nict.go.jp                       .NICT.           1 u   78  256   37   9.7220 126.0759  77.5309
+ntp-b3.nict.go.jp                       .NICT.           1 u   69  256   37   9.1375  97.5664  60.3534
+ntp-a2.nict.go.jp                       .NICT.           1 u  206  256   37  11.8291  27.5403  79.6273
+61-114-187-55.secomtrust.net            .PPS.            1 u   82  256   37  10.3482  97.4263  58.6047
+cwa225.bai.ne.jp                        210.171.0.34     4 u  176  256   37   3.3965  92.0291  44.4914
+cwa201.bai.ne.jp                        210.171.0.34     4 u  167  256   37   1.6718  97.1785  53.3047
xSHM(0)                                  .NEMA.           0 l    1    1  377   0.0000 -110.746  20.7629
xSHM(2)                                  .PPS.            0 l    1    1  377   0.0000 -1029.48   1.2930
xSHM(3)                                  .NEMA.           0 l    1    1  377   0.0000 -164.522  20.5476
xSHM(4)                                  .PPS.            0 l    -    1  377   0.0000 -1029.81   1.2421
xSHM(5)                                  .NEMA.           0 l    1    1  377   0.0000 -111.740  19.7739
xSHM(6)                                  .PPS.            0 l    -    1  377   0.0000 -29.7821   1.2062
 12:03:51 up 125 days,  7:00,  1 user,  load average: 0.09, 0.20, 0.09

     remote                                   refid      st t when poll reach   delay   offset   jitter
=======================================================================================================
*ntp-a3.nict.go.jp                       .NICT.           1 u  194  256   37  10.4783  91.2221  52.3003
+ntp-b2.nict.go.jp                       .NICT.           1 u   84  256   37   9.7220 126.0759  77.5309
+ntp-b3.nict.go.jp                       .NICT.           1 u   75  256   37   9.1375  97.5664  60.3534
+ntp-a2.nict.go.jp                       .NICT.           1 u  212  256   37  11.8291  27.5403  79.6273
+61-114-187-55.secomtrust.net            .PPS.            1 u   88  256   37  10.3482  97.4263  58.6047
+cwa225.bai.ne.jp                        210.171.0.34     4 u  182  256   37   3.3965  92.0291  44.4914
+cwa201.bai.ne.jp                        210.171.0.34     4 u  173  256   37   1.6718  97.1785  53.3047
xSHM(0)                                  .NEMA.           0 l    1    1  377   0.0000 -153.403  40.3798
xSHM(2)                                  .PPS.            0 l    1    1  377   0.0000 -30.2703 998.9187
xSHM(3)                                  .NEMA.           0 l    1    1  377   0.0000 -132.122  25.1655
xSHM(4)                                  .PPS.            0 l    -    1  377   0.0000 -31.6065 942.8735
xSHM(5)                                  .NEMA.           0 l    1    1  377   0.0000 -149.057  34.7033
xSHM(6)                                  .PPS.            0 l    -    1  377   0.0000 -31.6414   2.1491
 12:03:56 up 125 days,  7:00,  1 user,  load average: 0.08, 0.20, 0.09
```