biscuit

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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