mirror of
https://github.com/markqvist/Reticulum.git
synced 2025-07-30 01:58:48 -04:00
Serial interface and echo example
This commit is contained in:
parent
d4be407821
commit
e66622bd69
3 changed files with 62 additions and 38 deletions
|
@ -4,11 +4,12 @@ from time import sleep
|
|||
import sys
|
||||
import serial
|
||||
import threading
|
||||
import time
|
||||
import FPE
|
||||
|
||||
class SerialInterface(Interface):
|
||||
MAX_CHUNK = 32768
|
||||
TIMEOUT_SECONDS = 0.15
|
||||
TIMEOUT_SECONDS = 1.0
|
||||
|
||||
owner = None
|
||||
port = None
|
||||
|
@ -26,6 +27,8 @@ class SerialInterface(Interface):
|
|||
self.databits = databits
|
||||
self.parity = serial.PARITY_NONE
|
||||
self.stopbits = stopbits
|
||||
self.timeout = 100
|
||||
self.online = False
|
||||
|
||||
if parity.lower() == "e" or parity.lower() == "even":
|
||||
self.parity = serial.PARITY_EVEN
|
||||
|
@ -41,9 +44,10 @@ class SerialInterface(Interface):
|
|||
bytesize = self.databits,
|
||||
parity = self.parity,
|
||||
stopbits = self.stopbits,
|
||||
timeout = SerialInterface.TIMEOUT_SECONDS,
|
||||
xonxoff = False,
|
||||
rtscts = False,
|
||||
timeout = 0,
|
||||
inter_byte_timeout = None,
|
||||
write_timeout = None,
|
||||
dsrdtr = False,
|
||||
)
|
||||
|
@ -52,10 +56,11 @@ class SerialInterface(Interface):
|
|||
raise e
|
||||
|
||||
if self.serial.is_open:
|
||||
sleep(0.5)
|
||||
thread = threading.Thread(target=self.readLoop)
|
||||
thread.setDaemon(True)
|
||||
thread.start()
|
||||
sleep(0.5)
|
||||
self.online = True
|
||||
FPE.log("Serial port "+self.port+" is now open")
|
||||
else:
|
||||
raise IOError("Could not open serial port")
|
||||
|
@ -66,18 +71,29 @@ class SerialInterface(Interface):
|
|||
|
||||
|
||||
def processOutgoing(self,data):
|
||||
written = self.serial.write(data)
|
||||
if written != len(data):
|
||||
raise IOError("Serial interface only wrote "+str(written)+" bytes of "+str(len(data)))
|
||||
if self.online:
|
||||
written = self.serial.write(data)
|
||||
if written != len(data):
|
||||
raise IOError("Serial interface only wrote "+str(written)+" bytes of "+str(len(data)))
|
||||
|
||||
|
||||
def readLoop(self):
|
||||
#pass
|
||||
while self.serial.is_open:
|
||||
data = self.serial.read(size=self.owner.__class__.MTU)
|
||||
if not data == "":
|
||||
self.processIncoming(data)
|
||||
|
||||
|
||||
|
||||
try:
|
||||
data_buffer = ""
|
||||
last_read_ms = int(time.time()*1000)
|
||||
while self.serial.is_open:
|
||||
if self.serial.in_waiting:
|
||||
data = self.serial.read(size=self.serial.in_waiting)
|
||||
data_buffer += data
|
||||
last_read_ms = int(time.time()*1000)
|
||||
else:
|
||||
time_since_last = int(time.time()*1000) - last_read_ms
|
||||
if len(data_buffer) > 0 and time_since_last > self.timeout:
|
||||
self.processIncoming(data_buffer)
|
||||
data_buffer = ""
|
||||
sleep(0.08)
|
||||
except Exception as e:
|
||||
self.online = False
|
||||
FPE.log("A serial port error occurred, the contained exception was: "+str(e), FPE.LOG_ERROR)
|
||||
FPE.log("The interface "+str(self.name)+" is now offline. Restart FlexPE to attempt reconnection.", FPE.LOG_ERROR)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue