From 189d57be93de5fc215c5062846094da11502e402 Mon Sep 17 00:00:00 2001 From: madsenco Date: Tue, 24 May 2011 22:31:52 +0200 Subject: [PATCH] Some start polish. GPS via bluetooth/rfcomm --- nmeamux/root/etc/cron.daily/nmemamux-restart | 3 +++ nmeamux/root/etc/init.d/S975nmeamux | 6 ++++++ nmeamux/root/usr/bin/nmeamux | 21 ++++++++++++------- nmeamux/root/usr/bin/rfcomm | Bin 0 -> 22664 bytes 4 files changed, 22 insertions(+), 8 deletions(-) create mode 100755 nmeamux/root/etc/cron.daily/nmemamux-restart create mode 100644 nmeamux/root/etc/init.d/S975nmeamux create mode 100755 nmeamux/root/usr/bin/rfcomm diff --git a/nmeamux/root/etc/cron.daily/nmemamux-restart b/nmeamux/root/etc/cron.daily/nmemamux-restart new file mode 100755 index 0000000..4663277 --- /dev/null +++ b/nmeamux/root/etc/cron.daily/nmemamux-restart @@ -0,0 +1,3 @@ +#!/bin/sh + +ps | grep 'lua.agent.*nmeamux' | grep -v grep | awk '{print $1}' | xargs kill diff --git a/nmeamux/root/etc/init.d/S975nmeamux b/nmeamux/root/etc/init.d/S975nmeamux new file mode 100644 index 0000000..1829c15 --- /dev/null +++ b/nmeamux/root/etc/init.d/S975nmeamux @@ -0,0 +1,6 @@ +#!/bin/ash + +modprobe rfcomm +rfcomm bind 0 00:0B:0D:6C:6B:EB + +start-stop --start --respawn /usr/bin/nmeamux diff --git a/nmeamux/root/usr/bin/nmeamux b/nmeamux/root/usr/bin/nmeamux index 79be8d5..ca761a4 100755 --- a/nmeamux/root/usr/bin/nmeamux +++ b/nmeamux/root/usr/bin/nmeamux @@ -145,7 +145,7 @@ function NmeaNode:start(str) self.mPortSock = assert(sock, ("Can not open listen on %d: %t"):_(self.mPortNo, err)) local subscr = appc.addFileIO(self.mPortSock:getfd(), function(subscr) local inp = self.mPortSock:accept() - log.notice(("PORT:%-12s Connection %d opened from %s"): + log.notice(("PORT:%-12s Connection %d opened from %t"): _(self.mName, inp:getfd(), inp:getpeername())) local subscr = appc.addFileIO(inp:getfd(), function(subscr) self:readClient(subscr, inp) @@ -209,7 +209,7 @@ local RawPort = Class(NmeaPort, "RawPort", {}) --- -- Create an output node function RawPort.new(_class, name, cfg) - return NmeaPort:getSuper().new(_class, name, cfg):_merge { + return NmeaNode.new(_class, name, cfg):_merge { mPath = assert(cfg.path), mSpeed = assert(cfg.speed), } @@ -233,7 +233,7 @@ end local function nmeaReadPort(self, port, subscr) local str, err = posix.read(port:getfd()) if not str or str == "" then - log.error(("PORT:%-12s REOPEN: Failed to read %s: %s"):_(self.mName, self.mPath, err)) + log.error(("PORT:%-12s REOPEN: Failed to read %t: %t"):_(self.mName, self.mPath, err)) port:close() self.mSerialPort = nil subscr:clear() @@ -280,7 +280,9 @@ function NmeaPort:reOpen() return end self.mSerialPort = port - os.execute(("stty %d raw -parenb cs8 min 50 time 1 < %s"):_(self.mSpeed, self.mPath)) + if self.mSpeed and self.mSpeed > 0 then + os.execute(("stty %d raw -parenb cs8 min 50 time 1 < %s"):_(self.mSpeed, self.mPath)) + end local subscr = appc.addFileIO(self.mSerialPort:getfd(), function(subscr) return nmeaReadPort(self, port, subscr) end) @@ -310,6 +312,8 @@ end function NmeaPort:readClient(subscr, inp) local str = NmeaPort:getSuper().readClient(self, subscr, inp) if str and not self.mLineBuffer then + log.debugonly(||("PORT:%-12s OUT:%d:%s: %s"): + _(self.mName, port:getfd(), err or "OK", (str or ""):quotebin())) posix.write(self.mSerialPort:getfd(), str) end end @@ -507,16 +511,17 @@ local sampleConf = { p_lospeed_1 = { path = "/dev/ttyusb/mos7840-9710-7840/0", speed=4800 , port=26001}, p_lospeed_2 = { path = "/dev/ttyusb/mos7840-9710-7840/1", speed=4800 , port=26002}, p_hispeed = { path = "/dev/ttyusb/mos7840-9710-7840/2", speed=38400 , port=26003}, - p_gps = { path = "/dev/ttyusb/pl2303-067b-2303/bus_usb_001_004:00", - speed=4800 , port=26004}, + p_gps = { path = "/dev/rfcomm0", speed=38400 , port=26004}, p_ais = { path = "/dev/ttyusb/ftdi_sio-0403-6001/0", speed=38400 , port=25001}, - p_bkhousemux = { path = "/dev/ttyusb/pl2303-067b-2303/bus_usb_001_011:00", + -- p_ais = { path = "/dev/ttyS1", speed=38400 , port=25001}, + -- p_gps = { path = "/dev/ttyS1", speed=38400 , port=26004}, + p_bkhousemux = { path = "/dev/ttyusb/pl2303-067b-2303/bus_usb_001_010:00", speed=38400 , port=25005}, }, rawports = { p_pactor = { path = "/dev/ttyusb/ftdi_sio-0403-d010/0", speed=9600 , port=25002}, p_garmin1 = { path = "/dev/ttyusb/mos7840-9710-7840/3", speed=9600 , port=25003}, - p_garmin2 = { path = "/dev/ttyS0", speed=9600 , port=25004}, + p_garmin2 = { path = "/dev/ttyS4", speed=0 , port=25004}, p_navtex = { path = "/dev/ttyusb/pl2303-067b-2303/bus_usb_001_012:00", speed=38400 , port=25006}, }, diff --git a/nmeamux/root/usr/bin/rfcomm b/nmeamux/root/usr/bin/rfcomm new file mode 100755 index 0000000000000000000000000000000000000000..a1a78f4807de55838e8f0c1d56277f6eb0cba23a GIT binary patch literal 22664 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 F{{Vn*as2=Q literal 0 HcmV?d00001