01234567890123456789012345678901234567890123456789012345678901234567890123456789
4567891011121314151617181920212223 2425262728293031323334353637383940414243 4445464748495051525354555657585960616263 300301302303304305306307308309310311312313314315316317318319320 321322 323 324325 326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 364365366367368369370371372373374375376377378379380381382 383384 385386387388389390391392393394395396397398399400401402403404 |
<----SKIPPED LINES---->
import os
import random
import struct
import subprocess
import sys
import termios
import time
import psutil
import serial
import serial.tools.list_ports
from pySerialTransfer import pySerialTransfer
from constants import (
RASPBERRY_PI, MESSAGEBOARD_PATH, WEBSERVER_PATH, SHUTDOWN_TEXT)
import messageboard
ARDUINO_LOG = 'arduino_log.txt'
ARDUINO_ROLLING_LOG = 'secure/arduino_rolling_log.txt'
SERIALS_LOG = 'secure/arduino_serials_log.txt'
VERBOSE = False # log additional fine-grained details into ARDUINO_LOG
LOG_SERIALS = False # log serial data sent from Arduino to ARDUINO_LOG
SIMULATE_ARDUINO = False
REMOTE_DISPLAY_MODE = 'display_mode.txt'
SERVO_SIMULATED_IN = 'servo_in.txt'
SERVO_SIMULATED_OUT = 'servo_out.txt'
REMOTE_SIMULATED_IN = 'remote_in.txt'
REMOTE_SIMULATED_OUT = 'remote_out.txt'
if RASPBERRY_PI:
ARDUINO_LOG = MESSAGEBOARD_PATH + ARDUINO_LOG
SERVO_SIMULATED_OUT = MESSAGEBOARD_PATH + SERVO_SIMULATED_OUT
SERVO_SIMULATED_IN = MESSAGEBOARD_PATH + SERVO_SIMULATED_IN
REMOTE_SIMULATED_OUT = MESSAGEBOARD_PATH + REMOTE_SIMULATED_OUT
REMOTE_SIMULATED_IN = MESSAGEBOARD_PATH + REMOTE_SIMULATED_IN
REMOTE_DISPLAY_MODE = MESSAGEBOARD_PATH + REMOTE_DISPLAY_MODE
ARDUINO_ROLLING_LOG = WEBSERVER_PATH + ARDUINO_ROLLING_LOG
SERIALS_LOG = WEBSERVER_PATH + SERIALS_LOG
CONNECTION_FLAG_BLUETOOTH = 1
CONNECTION_FLAG_USB = 2
CONNECTION_FLAG_SIMULATED = 3
RASPBERRY_PI = psutil.sys.platform.title() == 'Linux'
SN_SERVO = '5583834303435111C1A0'
SERVO_CONNECTION = (CONNECTION_FLAG_BLUETOOTH, (2, '98:D3:11:FC:42:16', 1))
SN_REMOTE = '75835343130351802272'
REMOTE_CONNECTION = (CONNECTION_FLAG_BLUETOOTH, (1, '98:D3:91:FD:B3:C9', 1))
LASER_OFF = (False, False, False)
LASER_ALL = (True, True, True)
LASER_RED = (True, False, False)
LASER_GREEN = (False, True, False)
LASER_BLUE = (False, False, True)
<----SKIPPED LINES---->
return next_line[1]
return ()
if not format_string:
format_string = self.read_format
try:
data = Read(self.link, format_string, bytes_read=bytes_read)
# on OSError, record a disconnection and attempt to reconnect & re-read
except OSError as e:
failure_message = 'Failed to read from %s: %s' % (self.name, e)
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
return self.Read(format_string=format_string)
self.last_read = time.time()
if data:
self.last_receipt = time.time()
if LOG_SERIALS:
ts = time.time() - self.start_time
str_data = str(
['%7.2f' % d if isinstance(d, float) else str(d) for d in data])
message = '%10.3f RECD@%s: %s\n' % (ts, self.name, str_data)
with open(SERIALS_LOG, 'a') as f:
f.write(message)
# If we haven't received data (despite reading) in more than the timeout,
# close and reopen.
if (
self.read_timeout and
self.last_read - self.last_receipt > self.read_timeout):
failure_message = (
'Heartbeat not received in %.2f seconds (expected: %.2f) on %s' % (
self.last_read - self.last_receipt, self.read_timeout, self.name))
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
return self.Read(format_string=format_string)
if self.read_timeout and VERBOSE:
Log('%s: last_read: %.1f; last_receipt: %.1f; '
'delta: %.1f; read_timeout: %.1f' % (
self.name, self.last_read, self.last_receipt,
self.last_read - self.last_receipt, self.read_timeout))
elif VERBOSE:
Log('%s: read_timeout: %s' % (self.name, self.read_timeout))
return data
def Write(self, values, format_string=None):
"""Writes to an open serial.
Writes to an open serial values as identified in the format_string
provided here, or if not provided in this call, as saved on the
Serial instance. If an OSError exception is detected, this method
will attempt to reopen the connection.
Args:
values: tuple of values to send matching that as identified
in format_string.
format_string: String of the form expected by struct.pack
"""
ts = time.time() - self.start_time
str_values = str(
['%7.2f' % v if isinstance(v, float) else str(v) for v in values])
if self.connection_type == CONNECTION_FLAG_SIMULATED:
with open(self.connection_tuple[1], 'a') as f:
f.write('%10.3f: %s\n' % (ts, str_values))
return
if not format_string:
format_string = self.write_format
try:
Write(self.link, values, format_string)
except OSError as e:
failure_message = 'Failed to write: %s' % e
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
self.Write(values)
if LOG_SERIALS:
message = '%10.3f SENT@%s: %s\n' % (ts, self.name, str_values)
with open(SERIALS_LOG, 'a') as f:
f.write(message)
def HasReset(self):
"""Indicates exactly once whether serial has reset since last called."""
if self.connection_type == CONNECTION_FLAG_SIMULATED:
raise NotImplementedError('Not implemented for simulations')
flag = self.reset_flag
self.reset_flag = False
return flag
def RunCommand(cmd, sleep_seconds=1, log=True):
"""Runs shell command, checking if it completed within timeout."""
conn = subprocess.Popen(cmd, shell=True)
time.sleep(sleep_seconds)
conn.poll()
if conn.returncode is None:
Log('ERROR: %s did not complete within %d seconds'
% (cmd, sleep_seconds))
<----SKIPPED LINES---->
|
01234567890123456789012345678901234567890123456789012345678901234567890123456789
4567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
<----SKIPPED LINES---->
import os
import random
import struct
import subprocess
import sys
import termios
import time
import psutil
import serial
import serial.tools.list_ports
from pySerialTransfer import pySerialTransfer
from constants import (
RASPBERRY_PI, MESSAGEBOARD_PATH, WEBSERVER_PATH, SHUTDOWN_TEXT)
import messageboard
ARDUINO_LOG = 'arduino_log.txt'
SERIALS_LOG = 'arduino_serials_log.txt'
ARDUINO_ROLLING_LOG = 'secure/arduino_rolling_log.txt'
ROLLING_SERIALS_LOG = 'secure/arduino_rolling_serials_log.txt'
VERBOSE = False # log additional fine-grained details into ARDUINO_LOG
LOG_SERIALS = False # log serial data sent from Arduino to ARDUINO_LOG
SIMULATE_ARDUINO = False
REMOTE_DISPLAY_MODE = 'display_mode.txt'
SERVO_SIMULATED_IN = 'servo_in.txt'
SERVO_SIMULATED_OUT = 'servo_out.txt'
REMOTE_SIMULATED_IN = 'remote_in.txt'
REMOTE_SIMULATED_OUT = 'remote_out.txt'
if RASPBERRY_PI:
ARDUINO_LOG = MESSAGEBOARD_PATH + ARDUINO_LOG
SERVO_SIMULATED_OUT = MESSAGEBOARD_PATH + SERVO_SIMULATED_OUT
SERVO_SIMULATED_IN = MESSAGEBOARD_PATH + SERVO_SIMULATED_IN
REMOTE_SIMULATED_OUT = MESSAGEBOARD_PATH + REMOTE_SIMULATED_OUT
REMOTE_SIMULATED_IN = MESSAGEBOARD_PATH + REMOTE_SIMULATED_IN
REMOTE_DISPLAY_MODE = MESSAGEBOARD_PATH + REMOTE_DISPLAY_MODE
SERIALS_LOG = MESSAGEBOARD_PATH + SERIALS_LOG
ARDUINO_ROLLING_LOG = WEBSERVER_PATH + ARDUINO_ROLLING_LOG
SERIALS_LOG = WEBSERVER_PATH + SERIALS_LOG
CONNECTION_FLAG_BLUETOOTH = 1
CONNECTION_FLAG_USB = 2
CONNECTION_FLAG_SIMULATED = 3
RASPBERRY_PI = psutil.sys.platform.title() == 'Linux'
SN_SERVO = '5583834303435111C1A0'
SERVO_CONNECTION = (CONNECTION_FLAG_BLUETOOTH, (2, '98:D3:11:FC:42:16', 1))
SN_REMOTE = '75835343130351802272'
REMOTE_CONNECTION = (CONNECTION_FLAG_BLUETOOTH, (1, '98:D3:91:FD:B3:C9', 1))
LASER_OFF = (False, False, False)
LASER_ALL = (True, True, True)
LASER_RED = (True, False, False)
LASER_GREEN = (False, True, False)
LASER_BLUE = (False, False, True)
<----SKIPPED LINES---->
return next_line[1]
return ()
if not format_string:
format_string = self.read_format
try:
data = Read(self.link, format_string, bytes_read=bytes_read)
# on OSError, record a disconnection and attempt to reconnect & re-read
except OSError as e:
failure_message = 'Failed to read from %s: %s' % (self.name, e)
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
return self.Read(format_string=format_string)
self.last_read = time.time()
if data:
self.last_receipt = time.time()
if LOG_SERIALS:
now = time.time()
elapsed = now - self.start_time
str_data = str(
['%7.2f' % d if isinstance(d, float) else str(d) for d in data])
now_time = messageboard.EpochDisplayTime(now, '%d %H%M%S.%f')
message = '%s %10.3f RECD@%s: %s\n' % (
now_time, elapsed, self.name, str_data)
with open(SERIALS_LOG, 'a') as f:
f.write(message)
messageboard.Tail(
SERIALS_LOG,
ROLLING_SERIALS_LOG,
max_line_length=130,
lines_to_keep=messageboard.ROLLING_LOG_SIZE)
# If we haven't received data (despite reading) in more than the timeout,
# close and reopen.
if (
self.read_timeout and
self.last_read - self.last_receipt > self.read_timeout):
failure_message = (
'Heartbeat not received in %.2f seconds (expected: %.2f) on %s' % (
self.last_read - self.last_receipt, self.read_timeout, self.name))
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
return self.Read(format_string=format_string)
if self.read_timeout and VERBOSE:
Log('%s: last_read: %.1f; last_receipt: %.1f; '
'delta: %.1f; read_timeout: %.1f' % (
self.name, self.last_read, self.last_receipt,
self.last_read - self.last_receipt, self.read_timeout))
elif VERBOSE:
Log('%s: read_timeout: %s' % (self.name, self.read_timeout))
return data
def Write(self, values, format_string=None):
"""Writes to an open serial.
Writes to an open serial values as identified in the format_string
provided here, or if not provided in this call, as saved on the
Serial instance. If an OSError exception is detected, this method
will attempt to reopen the connection.
Args:
values: tuple of values to send matching that as identified
in format_string.
format_string: String of the form expected by struct.pack
"""
now = time.time()
elapsed = now - self.start_time
str_values = str(
['%7.2f' % v if isinstance(v, float) else str(v) for v in values])
if self.connection_type == CONNECTION_FLAG_SIMULATED:
with open(self.connection_tuple[1], 'a') as f:
f.write('%10.3f: %s\n' % (elapsed, str_values))
return
if not format_string:
format_string = self.write_format
try:
Write(self.link, values, format_string)
except OSError as e:
failure_message = 'Failed to write: %s' % e
if self.error_pin:
self.to_parent_q.put(('pin', (self.error_pin, True, failure_message)))
self.Reopen(log_message=failure_message)
self.Write(values)
if LOG_SERIALS:
now_time = messageboard.EpochDisplayTime(now, '%d %H%M%S.%f')
message = '%s %10.3f SENT@%s: %s\n' % (
now_time, elapsed, self.name, str_values)
with open(SERIALS_LOG, 'a') as f:
f.write(message)
messageboard.Tail(
SERIALS_LOG,
ROLLING_SERIALS_LOG,
max_line_length=130,
lines_to_keep=messageboard.ROLLING_LOG_SIZE)
def HasReset(self):
"""Indicates exactly once whether serial has reset since last called."""
if self.connection_type == CONNECTION_FLAG_SIMULATED:
raise NotImplementedError('Not implemented for simulations')
flag = self.reset_flag
self.reset_flag = False
return flag
def RunCommand(cmd, sleep_seconds=1, log=True):
"""Runs shell command, checking if it completed within timeout."""
conn = subprocess.Popen(cmd, shell=True)
time.sleep(sleep_seconds)
conn.poll()
if conn.returncode is None:
Log('ERROR: %s did not complete within %d seconds'
% (cmd, sleep_seconds))
<----SKIPPED LINES---->
|