Skip to content

Commit

Permalink
Merge pull request #78 from lucidcode/multi-stream
Browse files Browse the repository at this point in the history
Add second video stream
  • Loading branch information
IAmCoder authored Sep 28, 2024
2 parents e3f71b5 + e8a944a commit 5c73e81
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 40 deletions.
Binary file modified images/settings/network.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified release/firmware.bin
Binary file not shown.
2 changes: 2 additions & 0 deletions software/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ def __init__(self):
self.default['GainCeiling'] = 16
self.default['HorizontalMirror'] = 1
self.default['VerticalFlip'] = 0
self.default['SecondStream'] = 0

config_exists = False
entries = os.listdir()
Expand All @@ -69,6 +70,7 @@ def get(self, setting):
if self.config[setting] != None:
return self.config[setting]
except Exception as e:
self.config[setting] = self.default[setting]
print(str(e))

if self.default[setting] != None:
Expand Down
7 changes: 5 additions & 2 deletions software/inspec.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,13 @@ def send_stream(self):
if not self.config.get('AccessPoint') and not self.config.get('WiFi'):
return

if not self.stream.connected:
self.stream.start_server()
if not self.stream.connected[0]:
self.stream.start_server(0)
if self.stream.error:
self.stream.error = None
self.comms.send_data(f'ip:{self.stream.ip}')
else:
self.stream.send_image(self.img)

if not self.stream.connected[1] and self.config.get('SecondStream'):
self.stream.start_server(1)
84 changes: 46 additions & 38 deletions software/wifi.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
class inspec_stream:

def __init__(self, interface, ssid, password):
self.connected = False
self.error = None

if interface == "AccessPoint":
Expand All @@ -18,9 +17,10 @@ def __init__(self, interface, ssid, password):
self.ip = self.wlan.ifconfig()[0]
print("IP", self.ip)

self.server = None

self.start_server()
self.servers = [None, None]
self.clients = [None, None]
self.ports = [8080, 8082]
self.connected = [False, False]

def start_access_point(self, ssid, password):
self.wlan = network.WLAN(network.AP_IF)
Expand All @@ -40,55 +40,55 @@ def connect_network(self, ssid, password):
if attempts > 10:
raise Exception("Failed to connect to " + ssid)

def start_server(self):
if self.server == None:
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
def start_server(self, id):
if self.servers[id] == None:
self.servers[id] = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.servers[id].setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

host = ""
port = 8080
self.server.bind([host, port])
self.server.listen(1)
self.servers[id].bind([host, self.ports[id]])
self.servers[id].listen(1)

print(f'Waiting for connection on {self.ip}:{port}')
print(f'Waiting for connection on {self.ip}:{self.ports[id]}')

try:
sockets, w, err = select.select((self.server,), (), (), 0)
sockets, w, err = select.select((self.servers[id],), (), (), 0)

if sockets:
for entry in sockets:
self.client, self.addr = self.server.accept()

self.clients[id], addr = self.servers[id].accept()
try:
self.client.settimeout(5.0)
print("Connected to " + self.addr[0] + ":" + str(self.addr[1]))
self.start_streaming()
self.clients[id].settimeout(5.0)
print("Connected to " + addr[0] + ":" + str(addr[1]))
self.start_streaming(id)
self.connected[id] = True
except OSError as e:
self.connected = False
self.client.close()
print("client socket error:", e)
self.start_server()
self.connected[id] = False
self.clients[id].close()
print("client socket error:", id, e)
self.start_server(id)

except OSError as e:
self.connected = False
self.server.close()
self.server = None
print("server socket error:", e)
self.start_server()

def start_streaming(self):
data = self.client.recv(1024)
self.client.send(
self.connected[id] = False
self.servers[id].close()
self.servers[id] = None
self.start_server(id)

def start_streaming(self, id):
data = self.clients[id].recv(1024)
self.clients[id].send(
"HTTP/1.1 200 OK\r\n"
"Server: INSPEC\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: multipart/x-mixed-replace;boundary=inspec\r\n"
"Cache-Control: no-cache\r\n"
"Pragma: no-cache\r\n\r\n"
)
self.connected = True

def send_image(self, image):
if self.connected == False:
if self.connected[0] == False:
return

cframe = image.to_jpeg(quality=35, copy=True)
Expand All @@ -97,12 +97,20 @@ def send_image(self, image):
"Content-Type: image/jpeg\r\n"
"Content-Length:" + str(cframe.size()) + "\r\n\r\n"
)
self.send_data(0, cframe, header)
self.send_data(1, cframe, header)

def send_data(self, id, cframe, header):
if self.connected[id] == False:
return

try:
self.client.sendall(header)
self.client.sendall(cframe)
self.clients[id].sendall(header)
self.clients[id].sendall(cframe)
except OSError as e:
self.connected = False
self.start_server()
self.error = e
print("client socket error:", e)
self.connected[id] = False
self.start_server(id)

if id == 0:
self.error = e
print("client socket error", id, e)

0 comments on commit 5c73e81

Please sign in to comment.