qmi-nmea.py (4797B)
1 #!/usr/bin/env python 2 3 import sys, signal, gi 4 from math import ceil 5 from collections import namedtuple 6 from sys import exit 7 import traceback 8 9 gi.require_version('Qmi', '1.0') 10 from gi.repository import GLib, Gio, Qmi 11 12 main_loop = None 13 device = None 14 15 def die(message): 16 sys.stderr.write("Quitting") 17 exit(1) 18 19 20 def signal_handler(data): 21 main_loop.quit() 22 23 def device_close_ready(dev,result,user_data=None): 24 try: 25 dev.close_finish(result) 26 except GLib.GError as error: 27 die(sys.stderr.write("error: couldn't close QMI device: %s\n" % error.message)) 28 main_loop.quit() 29 30 31 def device_close(): 32 device.close_async(10, None, device_close_ready, None) 33 34 35 def release_client_ready(dev,result,user_data=None): 36 try: 37 dev.release_client_finish(result) 38 except GLib.GError as error: 39 sys.stderr.write("error: couldn't release QMI client: %s\n" % error.message) 40 41 device_close() 42 43 44 def release_client(client): 45 device.release_client(client, Qmi.DeviceReleaseClientFlags.RELEASE_CID, 10, None, release_client_ready, None) 46 47 def get_operation_mode_ready(client, result, user_data=None): 48 try: 49 output = client.get_operation_mode_finish(result) 50 if output.get_result() != None: 51 die(sys.stderr.write("unexpected result from get_operation_mode:", output.get_result())) 52 53 except GLib.GError as error: 54 die(sys.stderr.write("error: couldn't get operation mode: %s\n" % error.message)) 55 56 def on_gnss_data(client, output, user_data=None): 57 sys.stdout.write(output.get_nmea_string()) 58 59 def register_events_ready(client, result, user_data=None): 60 try: 61 output = client.register_events_finish(result) 62 if output.get_result() != None: 63 die(sys.stderr.write("unexpected result from register_events:", output.get_result())) 64 65 client.connect("nmea", on_gnss_data) 66 except GLib.GError as error: 67 die(sys.stderr.write("error: couldn't register events: %s\n" % error.message)) 68 69 def start_streaming_ready(client, result, user_data=None): 70 try: 71 output = client.start_finish(result) 72 if output.get_result() == None: 73 events = Qmi.MessageLocRegisterEventsInput() 74 events.set_event_registration_mask(Qmi.LocEventRegistrationFlag.NMEA) 75 76 client.register_events(events, 10, None, register_events_ready, None) 77 78 except GLib.GError as error: 79 die(sys.stderr.write("error: couldn't start: %s\n" % error.message)) 80 81 def start_streaming(client): 82 fix_type = Qmi.LocFixRecurrenceType.PERIODIC_FIXES 83 nput = Qmi.MessageLocStartInput() 84 nput.set_minimum_interval_between_position_reports(1000) # milliseconds? 85 nput.set_intermediate_report_state(True) 86 nput.set_fix_recurrence_type(fix_type) 87 nput.set_session_id(9) 88 client.start(nput, 10, None, start_streaming_ready, None) 89 90 91 def on_get_operation_mode(client, output): 92 print("operation mode indication ", output.get_operation_mode(), file=sys.stderr) 93 start_streaming(client) 94 95 def allocate_client_ready(dev,result,user_data=None): 96 try: 97 client = dev.allocate_client_finish(result) 98 except GLib.GError as error: 99 sys.stderr.write("error: couldn't allocate QMI client: %s\n" % error.message) 100 device_close() 101 return 102 client.connect("get-operation-mode", on_get_operation_mode) 103 client.get_operation_mode(None, 10, None, get_operation_mode_ready, None) 104 105 106 def open_ready(dev,result,user_data=None): 107 try: 108 dev.open_finish(result) 109 except GLib.GError as error: 110 sys.stderr.write("error: couldn't open QMI device: %s\n" % error.message) 111 main_loop.quit() 112 return 113 114 device.allocate_client(Qmi.Service.LOC, Qmi.CID_NONE, 10, None, allocate_client_ready, None) 115 116 117 def new_ready(unused,result,user_data=None): 118 try: 119 global device 120 device = Qmi.Device.new_finish(result) 121 except GLib.GError as error: 122 sys.stderr.write("error: couldn't create QMI device: %s\n" % error.message) 123 main_loop.quit() 124 return 125 126 device.open(Qmi.DeviceOpenFlags.PROXY | Qmi.DeviceOpenFlags.AUTO, 10, None, open_ready, None) 127 128 129 if __name__ == "__main__": 130 131 # Process input arguments 132 if len(sys.argv) != 2: 133 sys.stderr.write('error: wrong number of arguments\n') 134 sys.stdout.write('usage: qmi-nmea <DEVICE>\n') 135 sys.exit(1) 136 137 # Create Qmi device asynchronously 138 file = Gio.File.new_for_path(sys.argv[1]) 139 Qmi.Device.new (file, None, new_ready, None) 140 141 # Main loop 142 main_loop = GLib.MainLoop() 143 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGHUP, signal_handler, None) 144 GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, signal_handler, None) 145 try: 146 main_loop.run() 147 except KeyboardInterrupt: 148 pass