niclabox_server_debug_write_bin.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.plotting)
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  cond = True
114  while cond:
115  try:
116  self.bytes_packets = self.pdm_buffer.get_nowait()
117 
118  if first:
119  first = False
120  # print(self.bytes_packets[0])
121  # print(self.bytes_packets[1])
122  size = int.from_bytes(self.bytes_packets[:4], "little")
123  self.bytes_packets = self.bytes_packets[4:]
124 
125  print("SIZE: ", size)
126 
127  bytes_arr = bytes_arr + self.bytes_packets
128 
129  print("BYTES LEN: ", len(bytes_arr))
130 
131  if len(bytes_arr) >= size:
132  print("DENTRO")
133  bytes_arr = bytes_arr[:size] # 153600
134 
135  with open("my_file.txt", "wb") as binary_file:
136 
137  # Write bytes to file
138  binary_file.write(bytes_arr)
139 
140  # Convert Python list to NumPy array
141  # nparr = np.array(self.numbers, dtype="uint8")
142 
143  # Convert byte data to a numpy array
144  # raw_image = np.frombuffer(bytes_arr, dtype=np.uint8)#.reshape((240, 320))
145 
146  # image_rgb888 = cv2.imdecode(raw_image, cv2.IMREAD_COLOR)
147 
148  # # Display the image using OpenCV
149  # cv2.imshow('Image', rgb_image)
150  # cv2.waitKey(0)
151  # cv2.destroyAllWindows()
152 
153  # Decode the compressed image
154  # img_raw = cv2.imdecode(nparr, cv2.IMREAD_COLOR) #NOTE: BGR CONVENTION
155 
156  # To visualize the received img converted in img_raw
157  # cv2.imshow("Visualize img_raw", img_raw)
158  # cv2.waitKey(1)
159 
160  # print("ONE ARR: \n")
161  # print(self.numbers[:4000])
162  # print("\n")
163 
164  # print("TWO ARR: \n")
165  # print(self.numbers[4000:8000])
166  # print("\n")
167 
168  # print("THREE ARR: \n")
169  # print(self.numbers[8000:12000])
170  # print("\n")
171 
172  # print("FOUR ARR: \n")
173  # print(self.numbers[12000:16000])
174  # print("\n")
175 
176  cond = False
177 
178  except:
179  continue
180 
181  def plotting(self):
182 
183  while True:
184  try:
185  self.bytes_packets = self.pdm_buffer.get_nowait()
186  # print("IN THREAD: ", np.frombuffer(self.bytes_packets, dtype="int16"))
187  print("LEN CAL: ", len(self.bytes_packets))
188 
189  new = np.frombuffer(self.bytes_packets, dtype="int16")
190  new = new.tolist()
191  self.numbers.extend(new)
192  # if len(self.numbers) > self.max_points:
193  # # Plotting the data
194  # plt.figure(figsize=(50, 5))
195  # plt.plot(self.numbers, marker='o', linestyle='-', color='b')
196 
197  # # Adding titles and labels
198  # plt.title('Simple Plot of Data from a List')
199  # plt.xlabel('Index')
200  # plt.ylabel('Value')
201 
202  # # Display the plot
203  # plt.grid(True)
204  # plt.show()
205  # self.numbers = []
206 
207  print("LEN: ", len(self.numbers))
208 
209  if len(self.numbers) >= 10000 * 5:
210  # pcm_data = np.cumsum(self.numbers, dtype=np.int32)
211  # pcm_data = np.array(pcm_data, dtype=np.int16) >> 16
212 
213  self.numbers = np.array(self.numbers, dtype="int16")
214 
215  with wave.open("audio.wav", "w") as wf:
216  wf.setnchannels(1) # Mono
217  wf.setsampwidth(2) # 2 bytes (16 bits)
218  wf.setframerate(10000)
219  wf.writeframes(self.numbers.tobytes())
220 
221  print("recorded")
222 
223  break
224 
225  except:
226  continue
227 
228  def serve(self):
229  self.thread_regularizer = True
230  self.sorting_thread = Thread(target=self.sorting)
231  self.server_thread = Thread(target=self.serve_forever)
232  self.sorting_thread.start()
233  self.server_thread.start()
234 
235  def sorting(self):
236 
237  bkp_bytes_packets = bytes([])
238  timestamp = None
239 
240  while self.thread_regularizer:
241 
242  try:
243  bytes_packets = self.receiving_buffer.get_nowait()
244  timestamp = struct.unpack(">d", bytes_packets[:8])[0]
245  bytes_packets = bytes_packets[8:]
246 
247  if self.nicla_disconnect:
248  bytes_packets = bytes([])
249  bkp_bytes_packets = bytes([])
250  except:
251  continue
252 
253  bytes_packets = bkp_bytes_packets + bytes_packets
254  bkp_bytes_packets = bytes([])
255 
256  if len(bytes_packets) < 9:
257  print("Got a packet from receiver less than header size!")
258  continue
259  else:
260  total_length = len(bytes_packets)
261  loop_termination_flag = True
262 
263  while loop_termination_flag:
264  size_packet = int.from_bytes(bytes_packets[:4], "big")
265 
266  if total_length - 4 >= size_packet:
267  packet = bytes_packets[4 : size_packet + 4]
268  bytes_packets = bytes_packets[size_packet + 4 :]
269 
270  # timestamp = int.from_bytes(packet[:4], "big")
271 
272  data_type = packet[4]
273  data = packet[5:]
274 
275  if data_type == RANGE_TYPE:
276  if self.enable_range:
277  self.range_buffer.put_nowait((timestamp, data))
278  else:
279  pass
280 
281  elif data_type == IMAGE_TYPE:
282  if self.enable_image:
283  self.image_buffer.put_nowait((timestamp, data))
284  else:
285  pass
286 
287  elif data_type == AUDIO_TYPE:
288  if self.enable_audio:
289  self.audio_buffer.put_nowait((timestamp, data))
290  else:
291  pass
292 
293  elif data_type == IMU_TYPE:
294  if self.enable_imu:
295  self.imu_buffer.put_nowait((timestamp, data))
296  else:
297  pass
298 
299  else:
300  bkp_bytes_packets = bytes_packets
301  loop_termination_flag = False
302 
303  total_length = len(bytes_packets)
304  if total_length == 0:
305  loop_termination_flag = False
306 
307  def stop_serve(self):
308  print("stopping")
309  self.thread_regularizer = False
310  self.sorting_thread.join()
311  self.shutdown()
312  self.server_thread.join()
313  self.server_close()
314 
315  def get_range(self):
316 
317  if not self.range_buffer.empty():
318  return self.range_buffer.get_nowait()
319  else:
320  return None
321 
322  def get_image(self):
323  if not self.image_buffer.empty():
324  return self.image_buffer.get_nowait()
325  else:
326  return None
327 
328  def get_audio(self):
329  if not self.audio_buffer.empty():
330  return self.audio_buffer.get_nowait()
331  else:
332  return None
333 
334  def get_imu(self):
335  if not self.imu_buffer.empty():
336  return self.imu_buffer.get_nowait()
337  else:
338  return None
339 
340 
341 if __name__ == "__main__":
342 
343  nicla_receiver_server = NiclaReceiverTCP(
344  "10.240.23.49",
345  8002,
346  enable_range=False,
347  enable_image=False,
348  enable_audio=True,
349  enable_imu=False,
350  )
351 
352  try:
353  nicla_receiver_server.serve()
354  except Exception as e:
355  print(e)
356 
357  while True:
358  pass
359  # print("Server running!")
360 
361  nicla_receiver_server.stop()
362 
363 
364 
365 
366 # import time
367 # import socket
368 # import numpy as np
369 # import cv2
370 # from pydub import AudioSegment
371 
372 # IMAGE_TYPE = 0b00
373 # AUDIO_TYPE = 0b01
374 # DISTANCE_TYPE = 0b10
375 # IMU_TYPE = 0b11
376 
377 # FLAG = 1
378 # accumulated_audio_data = []
379 
380 
381 # # server address and port (the address of the machine running this code, any available port)
382 # ip = "10.240.23.87"
383 # port = 8002
384 
385 # # set maximum packet size
386 # packet_size = 65540
387 
388 # # image window init
389 # cv2.namedWindow("niclabox", cv2.WINDOW_NORMAL)
390 
391 # # server socket init
392 # server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
393 # server.bind((ip, port))
394 # print("Waiting for niclabox to stream on", ip, ":", port)
395 
396 # def receive_and_ros():
397 # global FLAG
398 
399 # packet, client_address = server.recvfrom(packet_size)
400 
401 # data_type = packet[0]
402 # packet = packet[1:]
403 
404 # # if len(packet) < 100: # a small packet is the distance
405 # if data_type == DISTANCE_TYPE:
406 # distance = packet
407 # distance = int.from_bytes(distance, "big")
408 
409 # # Print distance in terminal
410 # print("Distance (mm): ", distance)
411 
412 # elif data_type == IMAGE_TYPE:
413 # picture = packet
414 
415 # # Show image with numpy OpenCV
416 # image = cv2.imdecode(np.frombuffer(picture, np.uint8), cv2.IMREAD_COLOR)
417 # cv2.namedWindow("niclabox", cv2.WINDOW_NORMAL)
418 # cv2.imshow("niclabox", image)
419 # if cv2.waitKey(1) == ord('q'): # Press Q to exit
420 # exit(0)
421 
422 # # uncomment to output to a file without using numpy and OpenCV
423 # # distance_file = open("distance.txt", "w")
424 # # distance_file.write(str(distance))
425 # # distance_file.close()
426 # # picture_file = open("picture.jpg", "wb")
427 # # picture_file.write(picture)
428 # # picture_file.close()
429 # elif data_type == AUDIO_TYPE:
430 
431 # if FLAG == 1:
432 # # Convert PCM data to numpy array
433 # # pcm_data = np.array(packet, dtype=np.int16)
434 # pcm_data = np.frombuffer(packet, dtype=np.int16)
435 # accumulated_audio_data.append(pcm_data)
436 
437 # if len(accumulated_audio_data) > 100:
438 # FLAG = 2
439 
440 # elif FLAG == 2:
441 # pcm_data = np.concatenate(accumulated_audio_data)
442 
443 # # Create an AudioSegment from the PCM data
444 # audio_segment = AudioSegment(pcm_data.tobytes(), frame_rate=16000, sample_width=2, channels=1)
445 
446 # # Export AudioSegment to an MP3 file
447 # audio_segment.export("recording.mp3", format="mp3")
448 
449 # FLAG = 0
450 
451 
452 # while True:
453 # try:
454 # receive_and_ros()
455 
456 # except OSError as e:
457 # print("Error: ", e)
458 
459 # pass # try again
niclabox_server_debug_write_bin.NiclaReceiverTCP.range_buffer
range_buffer
Definition: niclabox_server_debug_write_bin.py:70
niclabox_server_debug_write_bin.TCPHandler.handle
def handle(self)
Definition: niclabox_server_debug_write_bin.py:28
niclabox_server_debug_write_bin.NiclaReceiverTCP.serve
def serve(self)
Definition: niclabox_server_debug_write_bin.py:228
niclabox_server_debug_write_bin.NiclaReceiverTCP.pdm_buffer
pdm_buffer
Definition: niclabox_server_debug_write_bin.py:93
niclabox_server_debug_write_bin.NiclaReceiverTCP.sorting_thread
sorting_thread
Definition: niclabox_server_debug_write_bin.py:230
niclabox_server_debug_write_bin.NiclaReceiverTCP.pdm_plotter
pdm_plotter
Definition: niclabox_server_debug_write_bin.py:95
niclabox_server_debug_write_bin.NiclaReceiverTCP.get_range
def get_range(self)
Definition: niclabox_server_debug_write_bin.py:315
niclabox_server_debug_write_bin.NiclaReceiverTCP.enable_range
enable_range
Definition: niclabox_server_debug_write_bin.py:64
niclabox_server_debug_write_bin.NiclaReceiverTCP.audio_buffer
audio_buffer
Definition: niclabox_server_debug_write_bin.py:74
niclabox_server_debug_write_bin.NiclaReceiverTCP.get_audio
def get_audio(self)
Definition: niclabox_server_debug_write_bin.py:328
niclabox_server_debug_write_bin.NiclaReceiverTCP.imu_buffer
imu_buffer
Definition: niclabox_server_debug_write_bin.py:76
niclabox_server_debug_write_bin.NiclaReceiverTCP.receiving_buffer
receiving_buffer
Definition: niclabox_server_debug_write_bin.py:84
niclabox_server_debug_write_bin.NiclaReceiverTCP.enable_image
enable_image
Definition: niclabox_server_debug_write_bin.py:65
niclabox_server_debug_write_bin.NiclaReceiverTCP.numbers
numbers
Definition: niclabox_server_debug_write_bin.py:91
niclabox_server_debug_write_bin.NiclaReceiverTCP.stop_serve
def stop_serve(self)
Definition: niclabox_server_debug_write_bin.py:307
niclabox_server_debug_write_bin.NiclaReceiverTCP.get_imu
def get_imu(self)
Definition: niclabox_server_debug_write_bin.py:334
niclabox_server_debug_write_bin.NiclaReceiverTCP.server_thread
server_thread
Definition: niclabox_server_debug_write_bin.py:86
niclabox_server_debug_write_bin.NiclaReceiverTCP.enable_audio
enable_audio
Definition: niclabox_server_debug_write_bin.py:66
niclabox_server_debug_write_bin.NiclaReceiverTCP.debug_recv
def debug_recv(self)
Definition: niclabox_server_debug_write_bin.py:107
niclabox_server_debug_write_bin.NiclaReceiverTCP.nicla_disconnect
nicla_disconnect
Definition: niclabox_server_debug_write_bin.py:87
niclabox_server_debug_write_bin.NiclaReceiverTCP
Definition: niclabox_server_debug_write_bin.py:58
niclabox_server_debug_write_bin.NiclaReceiverTCP.sorting
def sorting(self)
Definition: niclabox_server_debug_write_bin.py:235
niclabox_server_debug_write_bin.NiclaReceiverTCP.plotting
def plotting(self)
Definition: niclabox_server_debug_write_bin.py:181
niclabox_server_debug_write_bin.NiclaReceiverTCP.max_points
max_points
Definition: niclabox_server_debug_write_bin.py:90
niclabox_server_debug_write_bin.TCPHandler
Definition: niclabox_server_debug_write_bin.py:27
niclabox_server_debug_write_bin.NiclaReceiverTCP.image_buffer
image_buffer
Definition: niclabox_server_debug_write_bin.py:72
niclabox_server_debug_write_bin.NiclaReceiverTCP.get_image
def get_image(self)
Definition: niclabox_server_debug_write_bin.py:322
niclabox_server_debug_write_bin.NiclaReceiverTCP.enable_imu
enable_imu
Definition: niclabox_server_debug_write_bin.py:67
niclabox_server_debug_write_bin.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_write_bin.py:60
niclabox_server_debug_write_bin.NiclaReceiverTCP.bytes_packets
bytes_packets
Definition: niclabox_server_debug_write_bin.py:116
niclabox_server_debug_write_bin.NiclaReceiverTCP.thread_regularizer
thread_regularizer
Definition: niclabox_server_debug_write_bin.py:229


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