new rescue management

This commit is contained in:
sailoog 2024-04-13 19:47:29 +02:00
parent 45d95a0a1b
commit d1775dbdf9
6 changed files with 140 additions and 130 deletions

View File

@ -56,6 +56,15 @@ def main():
print(_('DONE')) print(_('DONE'))
except Exception as e: print(_('FAILED: ')+str(e)) except Exception as e: print(_('FAILED: ')+str(e))
print(_('Creating services...'))
try:
fo = open('/etc/systemd/system/openplotter-maiana-read.service', "w")
fo.write( '[Service]\nEnvironment=OPrescue=0\nEnvironmentFile=/boot/firmware/config.txt\nExecStart=openplotter-maiana-read $OPrescue\nUser='+conf2.user+'\nRestart=always\nRestartSec=3\n\n[Install]\nWantedBy=local-fs.target')
fo.close()
subprocess.call(['systemctl', 'daemon-reload'])
print(_('DONE'))
except Exception as e: print(_('FAILED: ')+str(e))
print(_('Setting version...')) print(_('Setting version...'))
try: try:
conf2.set('APPS', 'maiana', version) conf2.set('APPS', 'maiana', version)

View File

@ -28,12 +28,6 @@ def main():
language.Language(currentdir, package, currentLanguage) language.Language(currentdir, package, currentLanguage)
platform2 = platform.Platform() platform2 = platform.Platform()
print(_('Stopping OpenPlotter MAIANA service...'))
try:
subprocess.call(['pkill','-f','openplotter-maiana-read'])
print(_('DONE'))
except Exception as e: print(_('FAILED: ')+str(e))
print(_('Removing connection to Signal K server for MAIANA commands...')) print(_('Removing connection to Signal K server for MAIANA commands...'))
try: try:
data = {} data = {}
@ -57,6 +51,14 @@ def main():
print(_('DONE')) print(_('DONE'))
except Exception as e: print(_('FAILED: ')+str(e)) except Exception as e: print(_('FAILED: ')+str(e))
print(_('Removing services...'))
try:
subprocess.call(['systemctl', 'disable', 'openplotter-maiana-read'])
subprocess.call(['systemctl', 'stop', 'openplotter-maiana-read'])
subprocess.call(['systemctl', 'daemon-reload'])
print(_('DONE'))
except Exception as e: print(_('FAILED: ')+str(e))
print(_('Removing version...')) print(_('Removing version...'))
try: try:
conf2.set('APPS', 'maiana', '') conf2.set('APPS', 'maiana', '')

View File

@ -122,8 +122,11 @@ class MyFrame(wx.Frame):
webbrowser.open(url, new=2) webbrowser.open(url, new=2)
def restartRead(self): def restartRead(self):
subprocess.call(['pkill','-f','openplotter-maiana-read']) subprocess.call([self.platform.admin, 'python3', self.currentdir+'/service.py', 'enable'])
subprocess.Popen('openplotter-maiana-read') time.sleep(1)
def stopRead(self):
subprocess.call([self.platform.admin, 'python3', self.currentdir+'/service.py', 'disable'])
time.sleep(1) time.sleep(1)
def onRead(self): def onRead(self):
@ -191,12 +194,10 @@ class MyFrame(wx.Frame):
if deviceOld != self.device: if deviceOld != self.device:
if self.device: self.restartRead() if self.device: self.restartRead()
else: subprocess.call(['pkill','-f','openplotter-maiana-read']) else: self.stopRead()
else: else:
if self.device: if self.device: self.restartRead()
test = subprocess.check_output(['ps','aux']).decode(sys.stdin.encoding) else: self.stopRead()
if not 'openplotter-maiana-read' in test: self.restartRead()
else: subprocess.call(['pkill','-f','openplotter-maiana-read'])
if self.device: if self.device:
self.sock.sendto(b'sys?\r\n',(self.UDP_IP,self.UDP_PORT)) self.sock.sendto(b'sys?\r\n',(self.UDP_IP,self.UDP_PORT))
@ -213,7 +214,7 @@ class MyFrame(wx.Frame):
ts = datetime.datetime.utcnow().timestamp() ts = datetime.datetime.utcnow().timestamp()
timestamp = data['hardwareRevision']['timestamp'] timestamp = data['hardwareRevision']['timestamp']
ts2 = time.mktime(datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%fZ").timetuple()) ts2 = time.mktime(datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S.%fZ").timetuple())
if ts - ts2 > 3: if ts - ts2 > 5:
self.ShowStatusBarRED(_('Cannot connect with the device, try again by pressing "Refresh"')) self.ShowStatusBarRED(_('Cannot connect with the device, try again by pressing "Refresh"'))
return return
hardwareRevision = data['hardwareRevision']['value'] hardwareRevision = data['hardwareRevision']['value']
@ -424,12 +425,10 @@ class MyFrame(wx.Frame):
if deviceOld != self.device: if deviceOld != self.device:
if self.device: self.restartRead() if self.device: self.restartRead()
else: subprocess.call(['pkill','-f','openplotter-maiana-read']) else: self.stopRead()
else: else:
if self.device: if self.device: self.restartRead()
test = subprocess.check_output(['ps','aux']).decode(sys.stdin.encoding) else: self.stopRead()
if not 'openplotter-maiana-read' in test: self.restartRead()
else: subprocess.call(['pkill','-f','openplotter-maiana-read'])
self.onRead() self.onRead()

View File

@ -15,7 +15,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Openplotter. If not, see <http://www.gnu.org/licenses/>. # along with Openplotter. If not, see <http://www.gnu.org/licenses/>.
import os, socket, time, ssl, json, datetime import os, socket, time, ssl, json, datetime, sys
from openplotterSettings import conf from openplotterSettings import conf
from openplotterSettings import platform from openplotterSettings import platform
from openplotterSettings import language from openplotterSettings import language
@ -23,91 +23,92 @@ from websocket import create_connection
from openplotterSignalkInstaller import connections from openplotterSignalkInstaller import connections
def main(): def main():
platform2 = platform.Platform() if sys.argv[1] != '1':
conf2 = conf.Conf() platform2 = platform.Platform()
currentdir = os.path.dirname(os.path.abspath(__file__)) conf2 = conf.Conf()
currentLanguage = conf2.get('GENERAL', 'lang') currentdir = os.path.dirname(os.path.abspath(__file__))
package = 'openplotter-maiana' currentLanguage = conf2.get('GENERAL', 'lang')
language.Language(currentdir, package, currentLanguage) package = 'openplotter-maiana'
skConnections = connections.Connections('MAIANA') language.Language(currentdir, package, currentLanguage)
token = skConnections.token skConnections = connections.Connections('MAIANA')
device = conf2.get('MAIANA', 'device') token = skConnections.token
if conf2.get('GENERAL', 'debug') == 'yes': debug = True device = conf2.get('MAIANA', 'device')
else: debug = False if conf2.get('GENERAL', 'debug') == 'yes': debug = True
if token and device: else: debug = False
ws = False if token and device:
sock = False ws = False
while True: sock = False
try: while True:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try:
server_address = ('localhost', 10110) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(server_address) server_address = ('localhost', 10110)
sock.setblocking(0) sock.connect(server_address)
sock.setblocking(0)
uri = platform2.ws+'localhost:'+platform2.skPort+'/signalk/v1/stream?subscribe=none' uri = platform2.ws+'localhost:'+platform2.skPort+'/signalk/v1/stream?subscribe=none'
headers = {'Authorization': 'Bearer '+token} headers = {'Authorization': 'Bearer '+token}
ws = create_connection(uri, header=headers, sslopt={"cert_reqs": ssl.CERT_NONE}) ws = create_connection(uri, header=headers, sslopt={"cert_reqs": ssl.CERT_NONE})
tick = time.perf_counter() tick = time.perf_counter()
while True: while True:
time.sleep(0.01) time.sleep(0.01)
if (time.perf_counter() - tick) > 3: raise Exception('') if (time.perf_counter() - tick) > 3: raise Exception('')
data = False data = False
try: data = sock.recv(1024) try: data = sock.recv(1024)
except: pass except: pass
if data: if data:
tick = time.perf_counter() tick = time.perf_counter()
data = data.decode("utf-8") data = data.decode("utf-8")
if '$PA' in data: if '$PA' in data:
data = data.splitlines() data = data.splitlines()
for data2 in data: for data2 in data:
SKdata = {} SKdata = {}
data3 = data2.split('*') data3 = data2.split('*')
data3 = data3[0].split(',') data3 = data3[0].split(',')
#$PAINF,A,0x20*5B #$PAINF,A,0x20*5B
if data3[0] == '$PAINF': if data3[0] == '$PAINF':
try: try:
noiseValue = int(data3[2],16) noiseValue = int(data3[2],16)
SKdata.update({"MAIANA.channel"+data3[1]+".noiseFloor":noiseValue}) SKdata.update({"MAIANA.channel"+data3[1]+".noiseFloor":noiseValue})
if conf2.get('MAIANA', 'noiseDetect') == '1': if conf2.get('MAIANA', 'noiseDetect') == '1':
if noiseValue > 64: if noiseValue > 64:
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()
now = now.strftime("%Y-%m-%dT%H:%M:%S.%fZ") now = now.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
SKdata.update({"notifications.MAIANA.channel"+data3[1]+".noiseFloor":{"message":_("There may be electromagnetic interference near the MAIANA AIS antenna"),"state":"alert","method": ["visual", "sound"],"timestamp":now}}) SKdata.update({"notifications.MAIANA.channel"+data3[1]+".noiseFloor":{"message":_("There may be electromagnetic interference near the MAIANA AIS antenna"),"state":"alert","method": ["visual", "sound"],"timestamp":now}})
else: else:
SKdata.update({"notifications.MAIANA.channel"+data3[1]+".noiseFloor":None}) SKdata.update({"notifications.MAIANA.channel"+data3[1]+".noiseFloor":None})
except: pass except: pass
#$PAITX,A,18*1C #$PAITX,A,18*1C
elif data3[0] == '$PAITX': elif data3[0] == '$PAITX':
SKdata.update({"MAIANA.channel"+data3[1]+".transmittedMessageType":data3[2]}) SKdata.update({"MAIANA.channel"+data3[1]+".transmittedMessageType":data3[2]})
#$PAISYS,11.3.0,4.0.0,,STM32L422,1,1*05 #$PAISYS,11.3.0,4.0.0,,STM32L422,1,1*05
elif data3[0] == '$PAISYS': elif data3[0] == '$PAISYS':
try: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":data3[4],"MAIANA.breakoutGeneration":data3[5],"MAIANA.bootloader":data3[6]}) try: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":data3[4],"MAIANA.breakoutGeneration":data3[5],"MAIANA.bootloader":data3[6]})
except: except:
try: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":data3[4],"MAIANA.breakoutGeneration":'',"MAIANA.bootloader":''}) try: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":data3[4],"MAIANA.breakoutGeneration":'',"MAIANA.bootloader":''})
except: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":'',"MAIANA.breakoutGeneration":'',"MAIANA.bootloader":''}) except: SKdata.update({"MAIANA.hardwareRevision":data3[1],"MAIANA.firmwareRevision":data3[2],"MAIANA.serialNumber":data3[3],"MAIANA.MCUtype":'',"MAIANA.breakoutGeneration":'',"MAIANA.bootloader":''})
#$PAISTN,987654321,NAUT,,37,0,0,0,0*2A #$PAISTN,987654321,NAUT,,37,0,0,0,0*2A
elif data3[0] == '$PAISTN': elif data3[0] == '$PAISTN':
try: try:
SKdata.update({"MAIANA.station.MMSI":data3[1],"MAIANA.station.vesselName":data3[2],"MAIANA.station.callSign":data3[3],"MAIANA.station.vesselType":int(data3[4]),"MAIANA.station.LOA":int(data3[5]),"MAIANA.station.beam":int(data3[6]),"MAIANA.station.portOffset":int(data3[7]),"MAIANA.station.bowOffset":int(data3[8])}) SKdata.update({"MAIANA.station.MMSI":data3[1],"MAIANA.station.vesselName":data3[2],"MAIANA.station.callSign":data3[3],"MAIANA.station.vesselType":int(data3[4]),"MAIANA.station.LOA":int(data3[5]),"MAIANA.station.beam":int(data3[6]),"MAIANA.station.portOffset":int(data3[7]),"MAIANA.station.bowOffset":int(data3[8])})
except: pass except: pass
#$PAITXCFG,1,0,1,1,0*0 #$PAITXCFG,1,0,1,1,0*0
elif data3[0] == '$PAITXCFG': elif data3[0] == '$PAITXCFG':
try: try:
SKdata.update({"MAIANA.transmission.hardwarePresent":int(data3[1]),"MAIANA.transmission.hardwareSwitch":int(data3[2]),"MAIANA.transmission.softwareSwitch":int(data3[3]),"MAIANA.transmission.stationData":int(data3[4]),"MAIANA.transmission.status":int(data3[5])}) SKdata.update({"MAIANA.transmission.hardwarePresent":int(data3[1]),"MAIANA.transmission.hardwareSwitch":int(data3[2]),"MAIANA.transmission.softwareSwitch":int(data3[3]),"MAIANA.transmission.stationData":int(data3[4]),"MAIANA.transmission.status":int(data3[5])})
except: pass except: pass
keys = [] keys = []
for i in SKdata: for i in SKdata:
keys.append({"path":i,"value":SKdata[i]}) keys.append({"path":i,"value":SKdata[i]})
if keys: if keys:
SignalK = {"updates":[{"$source":"OpenPlotter.maiana","values":keys}]} SignalK = {"updates":[{"$source":"OpenPlotter.maiana","values":keys}]}
SignalK = json.dumps(SignalK) SignalK = json.dumps(SignalK)
ws.send(SignalK+'\r\n') ws.send(SignalK+'\r\n')
except Exception as e: except Exception as e:
if debug: print(str(e)) if debug: print(str(e))
if ws: ws.close() if ws: ws.close()
if sock: sock.close() if sock: sock.close()
time.sleep(5) time.sleep(5)

View File

@ -23,3 +23,10 @@ if sys.argv[1]=='sk':
subprocess.call(['systemctl', 'stop', 'signalk.socket']) subprocess.call(['systemctl', 'stop', 'signalk.socket'])
subprocess.call(['systemctl', 'start', 'signalk.socket']) subprocess.call(['systemctl', 'start', 'signalk.socket'])
subprocess.call(['systemctl', 'start', 'signalk.service']) subprocess.call(['systemctl', 'start', 'signalk.service'])
if sys.argv[1]=='enable':
subprocess.call(['systemctl', 'restart', 'openplotter-maiana-read.service'])
subprocess.call(['systemctl', 'enable', 'openplotter-maiana-read.service'])
elif sys.argv[1]=='disable':
subprocess.call(['systemctl', 'stop', 'openplotter-maiana-read.service'])
subprocess.call(['systemctl', 'disable', 'openplotter-maiana-read.service'])

View File

@ -22,21 +22,12 @@ from openplotterSignalkInstaller import connections
class Start(): class Start():
def __init__(self, conf, currentLanguage): def __init__(self, conf, currentLanguage):
self.conf = conf self.initialMessage = ''
currentdir = os.path.dirname(os.path.abspath(__file__))
language.Language(currentdir,'openplotter-maiana',currentLanguage)
self.initialMessage = _('Starting MAIANA transponder...')
def start(self): def start(self):
green = '' green = ''
black = '' black = ''
red = '' red = ''
subprocess.call(['pkill', '-f', 'openplotter-maiana-read'])
subprocess.Popen('openplotter-maiana-read')
time.sleep(1)
return {'green': green,'black': black,'red': red} return {'green': green,'black': black,'red': red}
class Check(): class Check():
@ -157,24 +148,25 @@ class Check():
if not black: black = msg if not black: black = msg
else: black+= ' | '+msg else: black+= ' | '+msg
# check service #service
test = subprocess.check_output(['ps','aux']).decode(sys.stdin.encoding) if device and result[0] == 'validated':
if device and (result[0] == 'approved' or result[0] == 'validated'): try:
if 'openplotter-maiana-read' in test: subprocess.check_output(['systemctl', 'is-active', 'openplotter-maiana-read.service']).decode(sys.stdin.encoding)
msg = _('running') msg = _('service running')
if not green: green = msg if not green: green = msg
else: green+= ' | '+msg else: green+= ' | '+msg
else: except:
msg = _('not running') msg = _('service not running')
if red: red += '\n '+msg if red: red += '\n '+msg
else: red = msg else: red = msg
else: else:
if 'openplotter-maiana-read' in test: try:
msg = _('running') subprocess.check_output(['systemctl', 'is-active', 'openplotter-maiana-read.service']).decode(sys.stdin.encoding)
msg = _('service running')
if red: red += '\n '+msg if red: red += '\n '+msg
else: red = msg else: red = msg
else: except:
msg = _('not running') msg = _('service not running')
if not black: black = msg if not black: black = msg
else: black+= ' | '+msg else: black+= ' | '+msg