alpha
Login
or
Join now
dunkirk.sh
/
inky
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
This repository has no description
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
feat: add proper shutdown sequence
author
Kieran Klukas
date
1 year ago
(Apr 11, 2025, 8:03 PM -0400)
commit
433d2b36
433d2b36563eac5427a25e9fae205ace5a615dc7
parent
db2dea2c
db2dea2c03eb7b12cfe28847afda3b63fc05ce10
+41
-2
1 changed file
Expand all
Collapse all
Unified
Split
src
camera_server.py
+41
-2
src/camera_server.py
Reviewed
···
171
171
except Exception as e:
172
172
logger.error(f"Server error: {str(e)}")
173
173
174
174
+
def cleanup():
175
175
+
try:
176
176
+
# Instead of getting/creating a new loop, we'll work with the running loop
177
177
+
loop = asyncio.get_running_loop()
178
178
+
179
179
+
# Create a new event loop for cleanup operations if needed
180
180
+
cleanup_loop = asyncio.new_event_loop()
181
181
+
asyncio.set_event_loop(cleanup_loop)
182
182
+
183
183
+
# Close all websocket connections
184
184
+
for websocket in connected_clients.copy():
185
185
+
cleanup_loop.run_until_complete(websocket.close())
186
186
+
187
187
+
# Cancel all tasks in the main loop
188
188
+
for task in asyncio.all_tasks(loop):
189
189
+
task.cancel()
190
190
+
191
191
+
cleanup_loop.close()
192
192
+
193
193
+
except RuntimeError:
194
194
+
# Handle case where there is no running loop
195
195
+
logger.info("No running event loop found during cleanup")
196
196
+
except Exception as e:
197
197
+
logger.error(f"Error during cleanup: {str(e)}")
198
198
+
174
199
def main():
175
200
logger.info("Camera and web server starting")
176
201
server = None
202
202
+
ws_server = None
203
203
+
loop = None
177
204
178
205
try:
206
206
+
socketserver.TCPServer.allow_reuse_port = True
207
207
+
179
208
# Start HTTP server
180
209
server = socketserver.TCPServer(("", Config.WEB_PORT), PhotoHandler)
181
210
server_thread = threading.Thread(target=server.serve_forever, daemon=True)
182
211
server_thread.start()
212
212
+
213
213
+
# Create new event loop for websockets
214
214
+
loop = asyncio.new_event_loop()
215
215
+
asyncio.set_event_loop(loop)
183
216
184
217
# Start WebSocket server
185
218
ws_server = websockets.serve(websocket_handler, "0.0.0.0", Config.WS_PORT)
186
186
-
asyncio.get_event_loop().run_until_complete(ws_server)
219
219
+
loop.run_until_complete(ws_server)
187
220
ws_thread = threading.Thread(
188
188
-
target=asyncio.get_event_loop().run_forever,
221
221
+
target=loop.run_forever,
189
222
daemon=True
190
223
)
191
224
ws_thread.start()
225
225
+
226
226
+
logger.info("Camera and web server started")
192
227
193
228
previous_state = GPIO.input(Config.BUTTON_PIN)
194
229
while True:
···
210
245
if server:
211
246
server.shutdown()
212
247
server.server_close()
248
248
+
if loop:
249
249
+
loop.stop()
213
250
GPIO.cleanup()
214
251
logger.info("GPIO cleaned up")
252
252
+
cleanup()
253
253
+
time.sleep(0.5)
215
254
216
255
if __name__ == "__main__":
217
256
main()