Skip to content

Commit 315ce65

Browse files
committed
Move Ublox specific commands to their own class
1 parent 7db811d commit 315ce65

File tree

5 files changed

+234
-201
lines changed

5 files changed

+234
-201
lines changed

Hologram/Network/Modem/Modem.py

Lines changed: 18 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717

1818

1919
from collections import deque
20-
import binascii
2120
import datetime
22-
import logging
2321
import os
2422
import serial
2523
from serial.tools import list_ports
@@ -289,82 +287,29 @@ def _read_and_append_message_receive_buffer(self, socket_identifier, payload_len
289287
self.close_socket(socket_identifier=socket_identifier)
290288

291289
def create_socket(self):
292-
op = self._basic_set('+USOCR', '6', strip_val=False)
293-
if op is not None:
294-
self.socket_identifier = int(op)
290+
raise NotImplementedError("Modem does not have an AT Socket Mode")
295291

296292
# REQUIRES: The host and port.
297293
# EFFECTS: Issues an AT command to connect to the specified socket identifier.
298294
def connect_socket(self, host, port):
299-
at_command_val = "%d,\"%s\",%s" % (self.socket_identifier, host, port)
300-
ok, _ = self.set('+USOCO', at_command_val, timeout=20)
301-
if ok != ModemResult.OK:
302-
self.logger.error('Failed to connect socket')
303-
raise NetworkError('Failed to connect socket')
304-
else:
305-
self.logger.info('Connect socket is successful')
295+
raise NotImplementedError("Modem does not have an AT Socket Mode")
306296

307297
def listen_socket(self, port):
308-
at_command_val = "%d,%s" % (self.socket_identifier, port)
309-
self.listen_socket_identifier = self.socket_identifier
310-
ok, _ = self.set('+USOLI', at_command_val, timeout=5)
311-
if ok != ModemResult.OK:
312-
self.logger.error('Failed to listen socket')
313-
raise NetworkError('Failed to listen socket')
298+
raise NotImplementedError("Modem does not have an AT Socket Mode")
314299

315300
def write_socket(self, data):
316-
self.enable_hex_mode()
317-
hexdata = binascii.hexlify(data)
318-
# We have to do it in chunks of 510 since 512 is actually too long (CMEE error)
319-
# and we need 2n chars for hexified data
320-
for chunk in self._chunks(hexdata, 510):
321-
value = b'%d,%d,\"%s\"' % (self.socket_identifier,
322-
len(binascii.unhexlify(chunk)),
323-
chunk)
324-
ok, _ = self.set('+USOWR', value, timeout=10)
325-
if ok != ModemResult.OK:
326-
self.logger.error('Failed to write to socket')
327-
raise NetworkError('Failed to write socket')
328-
self.disable_hex_mode()
301+
raise NotImplementedError("Modem does not have an AT Socket Mode")
329302

330303
def _chunks(self, data, n):
331304
"""Yield successive n-sized chunks from lst."""
332305
for i in range(0, len(data), n):
333306
yield data[i:i + n]
334307

335308
def read_socket(self, socket_identifier=None, payload_length=None):
336-
337-
if socket_identifier is None:
338-
socket_identifier = self.socket_identifier
339-
340-
if payload_length is None:
341-
payload_length = self.last_read_payload_length
342-
343-
self.enable_hex_mode()
344-
345-
resp = self._basic_set('+USORD', '%d,%d' % (socket_identifier, payload_length))
346-
if resp is not None:
347-
resp = resp.strip('"')
348-
bytedata = binascii.unhexlify(resp)
349-
try:
350-
resp = bytedata.decode()
351-
except:
352-
# This is some sort of binary data that can't be decoded so just
353-
# return the bytes. We might want to make this happen via parameter
354-
# in the future so it is more deterministic
355-
resp = bytedata
356-
357-
self.disable_hex_mode()
358-
return resp
309+
raise NotImplementedError("Modem does not have an AT Socket Mode")
359310

360311
def close_socket(self, socket_identifier=None):
361-
362-
if socket_identifier is None:
363-
socket_identifier = self.socket_identifier
364-
365-
ok, r = self.set('+USOCL', "%s" % socket_identifier)
366-
if ok != ModemResult.OK:
367-
self.logger.info('Failed to close socket')
312+
raise NotImplementedError("Modem does not have an AT Socket Mode")
368313

369314
def debugwrite(self, x, hide=False):
370315
if not hide:
@@ -672,40 +617,13 @@ def is_registered(self):
672617
pass
673618

674619
def _is_pdp_context_active(self):
675-
if not self.is_registered():
676-
return False
677-
678-
ok, r = self.set('+UPSND', '0,8')
679-
if ok == ModemResult.OK:
680-
try:
681-
pdpstatus = int(r.lstrip('UPSND: ').split(',')[2])
682-
# 1: PDP active
683-
return pdpstatus == 1
684-
except (IndexError, ValueError) as e:
685-
self.logger.error(repr(e))
686620
return False
687621

688622
def _set_up_pdp_context(self):
689-
if self._is_pdp_context_active(): return True
690-
self.logger.info('Setting up PDP context')
691-
self.set('+UPSD', f'0,1,\"{self._apn}\"')
692-
self.set('+UPSD', '0,7,\"0.0.0.0\"')
693-
ok, _ = self.set('+UPSDA', '0,3', timeout=30)
694-
if ok != ModemResult.OK:
695-
self.logger.error('PDP Context setup failed')
696-
raise NetworkError('Failed PDP context setup')
697-
else:
698-
self.logger.info('PDP context active')
623+
raise NotImplementedError('Modem PDP context setup not implemented')
699624

700625
def _tear_down_pdp_context(self):
701-
if not self._is_pdp_context_active(): return True
702-
self.logger.info('Tearing down PDP context')
703-
ok, _ = self.set('+UPSDA', '0,4', timeout=30)
704-
if ok != ModemResult.OK:
705-
self.logger.error('PDP Context tear down failed')
706-
else:
707-
self.logger.info('PDP context deactivated')
708-
626+
raise NotImplementedError('Modem PDP context setup not implemented')
709627

710628
def __enforce_serial_port_open(self):
711629
if not (self.serial_port and self.serial_port.isOpen()):
@@ -807,13 +725,10 @@ def enable_at_sockets_mode(self):
807725
pass
808726

809727
def enable_hex_mode(self):
810-
self.__set_hex_mode(1)
728+
pass
811729

812730
def disable_hex_mode(self):
813-
self.__set_hex_mode(0)
814-
815-
def __set_hex_mode(self, enable_hex_mode):
816-
self.command('+UDCONF', '1,%d' % enable_hex_mode)
731+
pass
817732

818733
@property
819734
def serial_port(self):
@@ -865,27 +780,12 @@ def at_sockets_available(self):
865780
return self._at_sockets_available
866781

867782
@property
868-
def modem_mode(self):
869-
mode_number = None
870-
# trim:
871-
# +UUSBCONF: 0,"",,"0x1102" -> 0
872-
# +UUSBCONF: 2,"ECM",,"0x1104" -> 2
873-
try:
874-
ok, res = self.read('+UUSBCONF')
875-
if ok == ModemResult.OK:
876-
mode_number = int(res.lstrip('+UUSBCONF: ').split(',')[0])
877-
except (IndexError, ValueError) as e:
878-
self.logger.error(repr(e))
879-
return mode_number
783+
def modem_usb_mode(self):
784+
raise NotImplementedError('This modem does not support this property')
880785

881-
@modem_mode.setter
882-
def modem_mode(self, mode):
883-
self.set('+UUSBCONF', str(mode))
884-
self.logger.info('Restarting modem')
885-
self.reset()
886-
self.logger.info('Modem restarted')
887-
self.closeSerialPort()
888-
time.sleep(Modem.DEFAULT_MODEM_RESTART_TIME)
786+
@modem_usb_mode.setter
787+
def modem_usb_mode(self, mode):
788+
raise NotImplementedError('This modem does not support this property')
889789

890790
@property
891791
def localIPAddress(self):
@@ -903,7 +803,7 @@ def remoteIPAddress(self):
903803

904804
@property
905805
def version(self):
906-
raise NotImplementedError('This modem does not support this property')
806+
return self._basic_command('I9')
907807

908808
@property
909809
def imei(self):
@@ -917,3 +817,5 @@ def apn(self):
917817
def apn(self, apn):
918818
self._apn = apn
919819
return self.set('+CGDCONT', f'1,"IP","{self._apn}"')
820+
821+

Hologram/Network/Modem/Nova.py

Lines changed: 0 additions & 75 deletions
This file was deleted.

Hologram/Network/Modem/NovaM.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
# LICENSE: Distributed under the terms of the MIT License
99
#
1010

11-
from Hologram.Network.Modem.Nova import Nova
11+
from Hologram.Network.Modem.UBlox import Ublox
1212
from Hologram.Event import Event
1313
from Exceptions.HologramError import NetworkError
1414
from UtilClasses import ModemResult
1515

1616
DEFAULT_NOVAM_TIMEOUT = 200
1717

18-
class NovaM(Nova):
18+
class NovaM(Ublox):
1919

2020
usb_ids = [('05c6', '90b2')]
2121
module = 'option'

Hologram/Network/Modem/Nova_U201.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@
88
# LICENSE: Distributed under the terms of the MIT License
99
#
1010

11-
from Hologram.Network.Modem.Nova import Nova
11+
from Hologram.Network.Modem.UBlox import Ublox
1212
from Exceptions.HologramError import SerialError
1313
from Hologram.Event import Event
1414
from UtilClasses import Location
1515
from UtilClasses import ModemResult
1616

1717
DEFAULT_NOVA_U201_TIMEOUT = 200
1818

19-
class Nova_U201(Nova):
19+
class Nova_U201(Ublox):
2020
usb_ids = [('1546','1102'),('1546','1104')]
2121

2222
def __init__(self, device_name=None, baud_rate='9600',
@@ -26,7 +26,7 @@ def __init__(self, device_name=None, baud_rate='9600',
2626
chatscript_file=chatscript_file, event=event)
2727
# We need to enforce multi serial port support. We then reinstantiate
2828
# the serial interface with the correct device name.
29-
self.enforce_nova_modem_mode()
29+
self.enforce_nova_modem_usb_mode()
3030
self._at_sockets_available = True
3131
self.last_sim_otp_command_response = None
3232
self.last_location = None
@@ -59,14 +59,14 @@ def is_registered(self):
5959

6060
# EFFECTS: Enforces that the Nova modem be in the correct mode to support multiple
6161
# serial ports
62-
def enforce_nova_modem_mode(self):
62+
def enforce_nova_modem_usb_mode(self):
6363

64-
modem_mode = self.modem_mode
65-
self.logger.debug('USB modem mode: ' + str(modem_mode))
64+
modem_usb_mode = self.modem_usb_mode
65+
self.logger.debug('USB modem mode: ' + str(modem_usb_mode))
6666

6767
# Set the modem mode to 0 if necessary.
68-
if modem_mode == 2:
69-
self.modem_mode = 0
68+
if modem_usb_mode == 2:
69+
self.modem_usb_mode = 0
7070
devices = self.detect_usable_serial_port()
7171
self.device_name = devices[0]
7272
super().initialize_serial_interface()

0 commit comments

Comments
 (0)