niclabox_server_debug.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 import queue
4 import socket
5 import socketserver
6 from threading import Thread
7 import time
8 import struct
9 import numpy as np
10 
11 
12 import matplotlib.pyplot as plt
13 import matplotlib.animation as animation
14 import wave
15 
16 import cv2
17 from PIL import Image
18 import struct
19 
20 
21 IMAGE_TYPE = 0b00
22 AUDIO_TYPE = 0b01
23 RANGE_TYPE = 0b10
24 IMU_TYPE = 0b11
25 
26 
27 class TCPHandler(socketserver.BaseRequestHandler):
28  def handle(self):
29  # self.request.settimeout(15.0) # Set a timeout
30  self.server.nicla_disconnect = False
31 
32  while True:
33  try:
34  packet = self.request.recv(65000)
35  # print("LEN RECV: ", len(packet))
36  # print("IN RECV: ", np.frombuffer(packet, dtype="int16"))
37 
38  self.server.pdm_buffer.put_nowait(packet)
39 
40  # if not packet:
41  # break
42  # timestamp = time.time()
43  # timestamp = struct.pack('>d', timestamp)
44  # packet = timestamp + packet
45  # self.server.receiving_buffer.put_nowait(packet)
46  # except socket.timeout:
47  # print("Warning: Nicla disconnected! Resetting server... ")
48  # self.server.receiving_buffer.queue.clear()
49  # self.server.nicla_disconnect = True
50  # break
51  except Exception as e:
52  print(f"Exception: {e}")
53  self.server.receiving_buffer.queue.clear()
54  self.server.nicla_disconnect = True
55  break # Break the loop on any other exception
56 
57 
58 class NiclaReceiverTCP(socketserver.TCPServer):
59 
60  def __init__(
61  self,
62  server_ip,
63  server_port,
64  enable_range=False,
65  enable_image=False,
66  enable_audio=False,
67  enable_imu=False,
68  ):
69 
70  super().__init__((server_ip, server_port), TCPHandler)
71 
72  self.enable_range = enable_range
73  self.enable_image = enable_image
74  self.enable_audio = enable_audio
75  self.enable_imu = enable_imu
76 
77  if self.enable_range:
78  self.range_buffer = queue.Queue(maxsize=100)
79  if self.enable_image:
80  self.image_buffer = queue.Queue(maxsize=100)
81  if self.enable_audio:
82  self.audio_buffer = queue.Queue(maxsize=100)
83  if self.enable_imu:
84  self.imu_buffer = queue.Queue(maxsize=100)
85 
86  if (
88  or self.enable_image
89  or self.enable_audio
90  or self.enable_imu
91  ):
92  self.receiving_buffer = queue.Queue(maxsize=200)
93 
94  self.server_thread = None
95  self.nicla_disconnect = False
96 
97  # Set up the plot
98  self.max_points = 200
99  self.numbers = []
100 
101  self.pdm_buffer = queue.Queue(maxsize=60000)
102 
103  self.pdm_plotter = Thread(target=self.debug_recv)
104  self.pdm_plotter.daemon = True
105  self.pdm_plotter.start()
106 
107  def debug_recv(self):
108  first = True
109  size = 0
110 
111  bytes_arr = bytes([])
112 
113  packet = bytes([])
114 
115  cnt = 0
116  while cnt < 4:
117  try:
118  self.bytes_packets = self.pdm_buffer.get_nowait()
119 
120  bytes_arr = bytes_arr + self.bytes_packets
121 
122  if first:
123  first = False
124  # print(self.bytes_packets[0])
125  # print(self.bytes_packets[1])
126  size = int.from_bytes(bytes_arr[:4], "little")
127  bytes_arr = bytes_arr[4:]
128 
129  print("SIZE: ", size)
130 
131  print("BYTES LEN: ", len(bytes_arr))
132 
133  if len(bytes_arr) >= size:
134  print("DENTRO")
135  cnt += 1
136  first = True
137  packet = bytes_arr[:size] # 153600
138 
139  print("TIMESTAMP: ", int.from_bytes(bytes_arr[:4], "little"))
140  print("TYPE: ", int.from_bytes(bytes_arr[4:5], "little"))
141  # print(int.from_bytes(bytes_arr[5:9], "little"))
142 
143  with open("my_file_" + str(cnt) + ".txt", "wb") as binary_file:
144  # Write bytes to file
145  binary_file.write(packet[5:])
146 
147  bytes_arr = bytes_arr[size:]
148 
149  # print("LEN IS: ", len(bytes_arr))
150 
151  except:
152  continue
153 
154  def plotting(self):
155 
156  while True:
157  try:
158  self.bytes_packets = self.pdm_buffer.get_nowait()
159  # print("IN THREAD: ", np.frombuffer(self.bytes_packets, dtype="int16"))
160 
161  new = np.frombuffer(self.bytes_packets, dtype="int16")
162  new = new.tolist()
163  self.numbers.extend(new)
164  # if len(self.numbers) > self.max_points:
165  # # Plotting the data
166  # plt.figure(figsize=(50, 5))
167  # plt.plot(self.numbers, marker='o', linestyle='-', color='b')
168 
169  # # Adding titles and labels
170  # plt.title('Simple Plot of Data from a List')
171  # plt.xlabel('Index')
172  # plt.ylabel('Value')
173 
174  # # Display the plot
175  # plt.grid(True)
176  # plt.show()
177  # self.numbers = []
178 
179  if len(self.numbers) >= 16000 * 5:
180  # pcm_data = np.cumsum(self.numbers, dtype=np.int32)
181  # pcm_data = np.array(pcm_data, dtype=np.int16) >> 16
182 
183  self.numbers = np.array(self.numbers, dtype="int16")
184 
185  with wave.open("audio.wav", "w") as wf:
186  wf.setnchannels(1) # Mono
187  wf.setsampwidth(2) # 2 bytes (16 bits)
188  wf.setframerate(16000)
189  wf.writeframes(self.numbers.tobytes())
190 
191  break
192 
193  except:
194  continue
195 
196  def serve(self):
197  self.thread_regularizer = True
198  self.sorting_thread = Thread(target=self.sorting)
199  self.server_thread = Thread(target=self.serve_forever)
200  self.sorting_thread.start()
201  self.server_thread.start()
202 
203  def sorting(self):
204 
205  bkp_bytes_packets = bytes([])
206  timestamp = None
207 
208  while self.thread_regularizer:
209 
210  try:
211  bytes_packets = self.receiving_buffer.get_nowait()
212  timestamp = struct.unpack(">d", bytes_packets[:8])[0]
213  bytes_packets = bytes_packets[8:]
214 
215  if self.nicla_disconnect:
216  bytes_packets = bytes([])
217  bkp_bytes_packets = bytes([])
218  except:
219  continue
220 
221  bytes_packets = bkp_bytes_packets + bytes_packets
222  bkp_bytes_packets = bytes([])
223 
224  if len(bytes_packets) < 9:
225  print("Got a packet from receiver less than header size!")
226  continue
227  else:
228  total_length = len(bytes_packets)
229  loop_termination_flag = True
230 
231  while loop_termination_flag:
232  size_packet = int.from_bytes(bytes_packets[:4], "big")
233 
234  if total_length - 4 >= size_packet:
235  packet = bytes_packets[4 : size_packet + 4]
236  bytes_packets = bytes_packets[size_packet + 4 :]
237 
238  # timestamp = int.from_bytes(packet[:4], "big")
239 
240  data_type = packet[4]
241  data = packet[5:]
242 
243  if data_type == RANGE_TYPE:
244  if self.enable_range:
245  self.range_buffer.put_nowait((timestamp, data))
246  else:
247  pass
248 
249  elif data_type == IMAGE_TYPE:
250  if self.enable_image:
251  self.image_buffer.put_nowait((timestamp, data))
252  else:
253  pass
254 
255  elif data_type == AUDIO_TYPE:
256  if self.enable_audio:
257  self.audio_buffer.put_nowait((timestamp, data))
258  else:
259  pass
260 
261  elif data_type == IMU_TYPE:
262  if self.enable_imu:
263  self.imu_buffer.put_nowait((timestamp, data))
264  else:
265  pass
266 
267  else:
268  bkp_bytes_packets = bytes_packets
269  loop_termination_flag = False
270 
271  total_length = len(bytes_packets)
272  if total_length == 0:
273  loop_termination_flag = False
274 
275  def stop_serve(self):
276  print("stopping")
277  self.thread_regularizer = False
278  self.sorting_thread.join()
279  self.shutdown()
280  self.server_thread.join()
281  self.server_close()
282 
283  def get_range(self):
284 
285  if not self.range_buffer.empty():
286  return self.range_buffer.get_nowait()
287  else:
288  return None
289 
290  def get_image(self):
291  if not self.image_buffer.empty():
292  return self.image_buffer.get_nowait()
293  else:
294  return None
295 
296  def get_audio(self):
297  if not self.audio_buffer.empty():
298  return self.audio_buffer.get_nowait()
299  else:
300  return None
301 
302  def get_imu(self):
303  if not self.imu_buffer.empty():
304  return self.imu_buffer.get_nowait()
305  else:
306  return None
307 
308 
309 if __name__ == "__main__":
310 
311  nicla_receiver_server = NiclaReceiverTCP(
312  "10.240.23.49",
313  8002,
314  enable_range=False,
315  enable_image=False,
316  enable_audio=True,
317  enable_imu=False,
318  )
319 
320  try:
321  nicla_receiver_server.serve()
322  except Exception as e:
323  print(e)
324 
325  while True:
326  pass
327  # print("Server running!")
328 
329  nicla_receiver_server.stop()
330 
331 
332 
333 
334 # import time
335 # import socket
336 # import numpy as np
337 # import cv2
338 # from pydub import AudioSegment
339 
340 # IMAGE_TYPE = 0b00
341 # AUDIO_TYPE = 0b01
342 # DISTANCE_TYPE = 0b10
343 # IMU_TYPE = 0b11
344 
345 # FLAG = 1
346 # accumulated_audio_data = []
347 
348 
349 # # server address and port (the address of the machine running this code, any available port)
350 # ip = "10.240.23.87"
351 # port = 8002
352 
353 # # set maximum packet size
354 # packet_size = 65540
355 
356 # # image window init
357 # cv2.namedWindow("niclabox", cv2.WINDOW_NORMAL)
358 
359 # # server socket init
360 # server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
361 # server.bind((ip, port))
362 # print("Waiting for niclabox to stream on", ip, ":", port)
363 
364 # def receive_and_ros():
365 # global FLAG
366 
367 # packet, client_address = server.recvfrom(packet_size)
368 
369 # data_type = packet[0]
370 # packet = packet[1:]
371 
372 # # if len(packet) < 100: # a small packet is the distance
373 # if data_type == DISTANCE_TYPE:
374 # distance = packet
375 # distance = int.from_bytes(distance, "big")
376 
377 # # Print distance in terminal
378 # print("Distance (mm): ", distance)
379 
380 # elif data_type == IMAGE_TYPE:
381 # picture = packet
382 
383 # # Show image with numpy OpenCV
384 # image = cv2.imdecode(np.frombuffer(picture, np.uint8), cv2.IMREAD_COLOR)
385 # cv2.namedWindow("niclabox", cv2.WINDOW_NORMAL)
386 # cv2.imshow("niclabox", image)
387 # if cv2.waitKey(1) == ord('q'): # Press Q to exit
388 # exit(0)
389 
390 # # uncomment to output to a file without using numpy and OpenCV
391 # # distance_file = open("distance.txt", "w")
392 # # distance_file.write(str(distance))
393 # # distance_file.close()
394 # # picture_file = open("picture.jpg", "wb")
395 # # picture_file.write(picture)
396 # # picture_file.close()
397 # elif data_type == AUDIO_TYPE:
398 
399 # if FLAG == 1:
400 # # Convert PCM data to numpy array
401 # # pcm_data = np.array(packet, dtype=np.int16)
402 # pcm_data = np.frombuffer(packet, dtype=np.int16)
403 # accumulated_audio_data.append(pcm_data)
404 
405 # if len(accumulated_audio_data) > 100:
406 # FLAG = 2
407 
408 # elif FLAG == 2:
409 # pcm_data = np.concatenate(accumulated_audio_data)
410 
411 # # Create an AudioSegment from the PCM data
412 # audio_segment = AudioSegment(pcm_data.tobytes(), frame_rate=16000, sample_width=2, channels=1)
413 
414 # # Export AudioSegment to an MP3 file
415 # audio_segment.export("recording.mp3", format="mp3")
416 
417 # FLAG = 0
418 
419 
420 # while True:
421 # try:
422 # receive_and_ros()
423 
424 # except OSError as e:
425 # print("Error: ", e)
426 
427 # pass # try again
niclabox_server_debug.NiclaReceiverTCP.server_thread
server_thread
Definition: niclabox_server_debug.py:86
niclabox_server_debug.NiclaReceiverTCP.thread_regularizer
thread_regularizer
Definition: niclabox_server_debug.py:197
niclabox_server_debug.NiclaReceiverTCP.__init__
def __init__(self, server_ip, server_port, enable_range=False, enable_image=False, enable_audio=False, enable_imu=False)
Definition: niclabox_server_debug.py:60
niclabox_server_debug.NiclaReceiverTCP.imu_buffer
imu_buffer
Definition: niclabox_server_debug.py:76
niclabox_server_debug.TCPHandler
Definition: niclabox_server_debug.py:27
niclabox_server_debug.NiclaReceiverTCP.serve
def serve(self)
Definition: niclabox_server_debug.py:196
niclabox_server_debug.TCPHandler.handle
def handle(self)
Definition: niclabox_server_debug.py:28
niclabox_server_debug.NiclaReceiverTCP.audio_buffer
audio_buffer
Definition: niclabox_server_debug.py:74
niclabox_server_debug.NiclaReceiverTCP.stop_serve
def stop_serve(self)
Definition: niclabox_server_debug.py:275
niclabox_server_debug.NiclaReceiverTCP.enable_imu
enable_imu
Definition: niclabox_server_debug.py:67
niclabox_server_debug.NiclaReceiverTCP.get_range
def get_range(self)
Definition: niclabox_server_debug.py:283
niclabox_server_debug.NiclaReceiverTCP.plotting
def plotting(self)
Definition: niclabox_server_debug.py:154
niclabox_server_debug.NiclaReceiverTCP.enable_image
enable_image
Definition: niclabox_server_debug.py:65
niclabox_server_debug.NiclaReceiverTCP.image_buffer
image_buffer
Definition: niclabox_server_debug.py:72
niclabox_server_debug.NiclaReceiverTCP.receiving_buffer
receiving_buffer
Definition: niclabox_server_debug.py:84
niclabox_server_debug.NiclaReceiverTCP.bytes_packets
bytes_packets
Definition: niclabox_server_debug.py:118
nicla_receiver.str
str
Definition: nicla_receiver.py:13
niclabox_server_debug.NiclaReceiverTCP.pdm_buffer
pdm_buffer
Definition: niclabox_server_debug.py:93
niclabox_server_debug.NiclaReceiverTCP.pdm_plotter
pdm_plotter
Definition: niclabox_server_debug.py:95
niclabox_server_debug.NiclaReceiverTCP.get_image
def get_image(self)
Definition: niclabox_server_debug.py:290
niclabox_server_debug.NiclaReceiverTCP.nicla_disconnect
nicla_disconnect
Definition: niclabox_server_debug.py:87
niclabox_server_debug.NiclaReceiverTCP.enable_audio
enable_audio
Definition: niclabox_server_debug.py:66
niclabox_server_debug.NiclaReceiverTCP
Definition: niclabox_server_debug.py:58
niclabox_server_debug.NiclaReceiverTCP.sorting
def sorting(self)
Definition: niclabox_server_debug.py:203
niclabox_server_debug.NiclaReceiverTCP.range_buffer
range_buffer
Definition: niclabox_server_debug.py:70
niclabox_server_debug.NiclaReceiverTCP.max_points
max_points
Definition: niclabox_server_debug.py:90
niclabox_server_debug.NiclaReceiverTCP.numbers
numbers
Definition: niclabox_server_debug.py:91
niclabox_server_debug.NiclaReceiverTCP.enable_range
enable_range
Definition: niclabox_server_debug.py:64
niclabox_server_debug.NiclaReceiverTCP.get_imu
def get_imu(self)
Definition: niclabox_server_debug.py:302
niclabox_server_debug.NiclaReceiverTCP.sorting_thread
sorting_thread
Definition: niclabox_server_debug.py:198
niclabox_server_debug.NiclaReceiverTCP.get_audio
def get_audio(self)
Definition: niclabox_server_debug.py:296
niclabox_server_debug.NiclaReceiverTCP.debug_recv
def debug_recv(self)
Definition: niclabox_server_debug.py:107


nicla_vision_ros
Author(s): Davide Torielli , Damiano Gasperini , Edoardo Del Bianco , Federico Rollo
autogenerated on Sat Nov 16 2024 03:38:18