diff --git a/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.py b/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.py index d0c049b..1101547 100755 --- a/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.py +++ b/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.py @@ -6,6 +6,7 @@ import time import os import configparser import gpiod +import signal config_dump = __import__("modem-config-dump") SERIAL_DEV = '/dev/ttyACM0' @@ -13,6 +14,9 @@ WWAN_DEV = '/sys/class/net/wwan0' SIM_CONFIG = '/etc/sim.conf' APN_CONFIG = '/etc/apn.conf' +sim_sw = gpiod.find_line('SIM_SW') +gsm_pwr_en = gpiod.find_line('GSM_SUP_EN') + def execute_and_check(ser, cmd): tries = 0 MAX_TRY = 5 @@ -32,14 +36,10 @@ def execute_and_check(ser, cmd): tries = 0 def init_sim_sw(): - line = gpiod.find_line('SIM_SW') - line.request(consumer='ublox-config', type=gpiod.LINE_REQ_DIR_OUT) - line.set_value(1) + sim_sw.request(consumer='ublox-config', type=gpiod.LINE_REQ_DIR_OUT, default_vals=[ 1 ]) def switch_sim(): - line = gpiod.find_line('SIM_SW') - line.request(consumer='ublox-config', type=gpiod.LINE_REQ_DIR_OUT) - line.set_value(0) + sim_sw.set_value(0) def sim_present(ser): cmd = b'AT+CCID?' @@ -138,11 +138,11 @@ def factory_reset(): execute_and_check(ser, b'AT+UFACTORY=2,1') reset_modem(ser) -def poweroff(gpio): +def poweroff(): print('poweroff') if not os.path.exists(SERIAL_DEV): print('serial interface is not available') - gpio.set_value(0) + gsm_pwr_en.set_value(0) return -1 ser = serial.Serial(SERIAL_DEV, 115200, timeout=0.5) ser.write(b'AT+CPWROFF\r') @@ -150,15 +150,27 @@ def poweroff(gpio): time.sleep(7.5) - gpio.set_value(0) + gsm_pwr_en.set_value(0) + +def signal_handler(sig, frame): + poweroff() + sys.exit(0) + +def daemonize(): + n = os.fork() + if n > 0: + f = open('/run/ublox-gsm-config.pid', 'w') + f.write(str(n)) + return + + signal.signal(signal.SIGTERM, signal_handler) + while True: + time.sleep(10) def help(): print('Usage : {} [stop|factory-reset]'.format(sys.argv[0])) def main(): - line = gpiod.find_line('GSM_SUP_EN') - line.request(consumer='ublox-config', type=gpiod.LINE_REQ_DIR_OUT) - init_sim_sw() if len(sys.argv) == 2: if sys.argv[1] == 'stop': return poweroff(line) @@ -167,8 +179,9 @@ def main(): else: return help() - # Power on - line.set_value(1) + # Power modem + init_sim_sw() + gsm_pwr_en.request(consumer='ublox-config', type=gpiod.LINE_REQ_DIR_OUT, default_vals= [ 1 ]) # Wait on device while not os.path.exists(SERIAL_DEV): @@ -195,6 +208,7 @@ def main(): apn_setup(ser) config_dump.dump_modem_config(ser) ser.close() + daemonize() if __name__ == '__main__': main() diff --git a/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.service b/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.service index fd0bbfd..4c818ee 100644 --- a/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.service +++ b/recipes-connectivity/ublox-gsm-config/files/ublox-gsm-config.service @@ -3,11 +3,9 @@ Description=ublox GSM Modem configuration Before=ModemManager.service [Service] -Type=oneshot +Type=forking ExecStart=/usr/bin/ublox-gsm-config -ExecStop=/usr/bin/ublox-gsm-config stop -RemainAfterExit=yes -TimeoutStopSec=20 +PIDFile=/run/ublox-gsm-config.pid [Install] RequiredBy=ModemManager.service