#!/usr/bin/env python3 import serial import os import time import configparser import sys CONFIG = '/etc/sim.conf' SERIAL_DEV = '/dev/ttyACM0' GPIO_PATH = '/sys/class/gpio/' GPIO_SIM_SW = '44' GPIO_SIM_RST = '57' RST_FILE = '/tmp/modem-reset-required' rst = False def write_to_file(file, value): f = open(file, 'w') f.write(value) f.close() def reset_modem(): print("modem reset") write_to_file(GPIO_PATH + 'export', GPIO_SIM_RST) write_to_file(GPIO_PATH + 'gpio' + GPIO_SIM_RST + '/direction', 'out') write_to_file(GPIO_PATH + 'gpio' + GPIO_SIM_RST + '/value', '1') time.sleep(2) write_to_file(GPIO_PATH + 'gpio' + GPIO_SIM_RST + '/value', '0') print("reset done") # Wait until modem rebooted while True: dirs = os.listdir("/dev") for file in dirs: if file == 'ttyACM2': sys.exit(0); time.sleep(1) def is_rst_required(): global rst if rst: return True elif os.path.exists(RST_FILE): return True else: return False def switch_sim(): global rst write_to_file(GPIO_PATH + 'export', GPIO_SIM_SW) write_to_file(GPIO_PATH + 'gpio' + GPIO_SIM_SW + '/direction', 'out') write_to_file(GPIO_PATH + 'gpio' + GPIO_SIM_SW + '/value', '0') rst = True def sim_present(ser): cmd = b'AT+CCID?' while True: try: ser.flushInput() ser.write(cmd) ser.write(b'\r') s = ser.read_until(b'OK') if b'ERROR' in s: return False elif b'OK' in s: return True except Exception as e: print("Exception : " + str(e)) time.sleep(1) return s def check_sim_presence(): while not os.path.exists(SERIAL_DEV): time.sleep(1) ser = serial.Serial(SERIAL_DEV, 115200, timeout=0.5) while True: try: ser.read() break except Exception: pass if sim_present(ser): print("sim present") else: print("no sim, switching to esim") switch_sim() ser.close() def read_config(): config = configparser.ConfigParser() config.read(CONFIG) print(config.get('default', 'SIM')) sim = config.get('default', 'SIM') if sim == 'auto': check_sim_presence() elif sim == 'esim' or sim == 'ui-top': switch_sim() # ui-btm and main are default if is_rst_required(): reset_modem() read_config();