def xep_setup(device_name, baseband): reset(device_name) mc = ModuleConnector(device_name) app = mc.get_x4m300() try: app.set_sensor_mode(0x13, 0) # Make sure no profile is running. except RuntimeError: pass try: app.set_sensor_mode(0x12, 0) # Manual mode. except RuntimeError: pass xep = mc.get_xep() xep.mc = mc # Set DAC range xep.x4driver_set_dac_min(949) xep.x4driver_set_dac_max(1100) # Set integration xep.x4driver_set_iterations(16) xep.x4driver_set_pulses_per_step(10) xep.x4driver_set_downconversion(int(baseband)) # Set detection range xep.x4driver_set_frame_area(0, 8.0) return xep
def xep_setup(device_name, baseband): reset(device_name) mc = ModuleConnector(device_name) # Assume an X4M300/X4M200 module and try to enter XEP mode app = mc.get_x4m300() # Stop running application and set module in manual mode. try: app.set_sensor_mode(0x13, 0) # Make sure no profile is running. except RuntimeError: # Profile not running, OK pass try: app.set_sensor_mode(0x12, 0) # Manual mode. except RuntimeError: # Sensor already stopped, OK pass xep = mc.get_xep() xep.mc = mc # Set DAC range xep.x4driver_set_dac_min(949) xep.x4driver_set_dac_max(1100) # Set integration xep.x4driver_set_iterations(16) xep.x4driver_set_pulses_per_step(10) xep.x4driver_set_downconversion(int(baseband)) # Set detection range xep.x4driver_set_frame_area(0, 5.0) return xep
def set_certification_mode(device_name, mode_code): mc = ModuleConnector(device_name) xep = mc.get_xep() app = mc.get_x4m300() data = mcw.ucVector() app.system_run_test(mode_code, data) print("Set Mode:0x%X" % mode_code) xep.module_reset() mc.close()
def goto_bootloader(device_name): if device_name == "auto": devices = auto() if len(devices) == 0: print("Failed to find COM port matching known vid and pids") return 1 device_name = devices[0] log_level = 1 mc = ModuleConnector(device_name, log_level) x4m300 = mc.get_x4m300() sleep(1) # Allow for MC to read waiting messages from module. try: # if this fails it will throw x4m300.start_bootloader() except: print("Could not go to bootloader, may be there already.") mc.close()
class StreamData: sampling_frequency = 17 # frames per second def __init__(self, usb_port): ''' Parser for streaming data from Xethru X4M300 presence sensor from Novelda. :param usb_port: String ''' self.usb_port = usb_port self.mc = ModuleConnector(usb_port) self.x4m300 = self.mc.get_x4m300() self.x4m300.set_sensor_mode(XTID_SM_STOP, 0) self.x4m300.load_profile(XTS_ID_APP_PRESENCE_2) self.x4m300.set_output_control(XTS_ID_PRESENCE_SINGLE, 1) self.x4m300.set_output_control(XTS_ID_BASEBAND_IQ, 1) self.x4m300.set_sensor_mode(XTID_SM_RUN, 0) def __iter__(self): while True: yield self.read_sensor() def read_sensor(self): ''' Read data from sensor :return: ''' messege = self.x4m300.read_message_baseband_iq() i_data = [] q_data = [] for data in messege.i_data: i_data = np.append(i_data, data) for data in messege.q_data: q_data = np.append(q_data, data) return (i_data, q_data)
def main(): parser = OptionParser() parser.add_option( "-d", "--device", dest="device_name", help= "Seral port name used by target XeThru sensor, i.e com8, /dev/ttyACM0", metavar="FILE") parser.add_option("-r", "--record", action="store_true", default=False, dest="record", help="Enable recording") parser.add_option("-f", "--file", dest="meta_filename", metavar="FILE", help="meta file from recording") (options, args) = parser.parse_args() if not options.meta_filename: if options.device_name: device_name = options.device_name else: try: device_name = auto()[0] except: print("Fail to find serial port, please specify it by use -d!") raise print_module_info(device_name) x4m300 = configure_x4m300(device_name, options.record, x4m300_par_settings) else: player = start_player(meta_filename=options.meta_filename) mc = ModuleConnector(player, log_level=0) x4m300 = mc.get_x4m300() print_x4m300_messages(x4m300)
def start_playback(meta_filename, depth): print("start playback from: {}, depth: {}".format(meta_filename, depth)) ##! [Typical usage] player = DataPlayer(meta_filename, depth) mc = ModuleConnector(player, log_level=0) # Get read-only interface and receive telegrams / binary packets from recording x4m300 = mc.get_x4m300() # Control output player.set_filter(DataType.BasebandIqDataType | DataType.PresenceSingleDataType) player.play() # ... player.pause() # ... player.set_playback_rate(2.0) ##! [Typical usage] player.set_playback_rate(1.0) player.set_loop_mode_enabled(True) player.play() try: while True: if x4m300.peek_message_baseband_iq(): data = x4m300.read_message_baseband_iq() print("received baseband iq data, frame counter: {}".format( data.frame_counter)) if x4m300.peek_message_presence_single(): data = x4m300.read_message_presence_single() print( "received presence single data, frame counter: {}".format( data.frame_counter)) time.sleep(0.02) # Sleep 20 ms except (KeyboardInterrupt, SystemExit): del mc raise
def try_xep(device_name): log_level = 0 mc = ModuleConnector(device_name, log_level) x4m300 = mc.get_x4m300() # we have to go to manual mode x4m300.set_sensor_mode(XTS_SM_STOP, 0) x4m300.set_sensor_mode(XTS_SM_MANUAL, 0) xep = mc.get_xep() pong = xep.ping() print("Received pong:", hex(pong)) print('ItemNumber =', xep.get_system_info(XTID_SSIC_ITEMNUMBER)) print('OrderCode =', xep.get_system_info(XTID_SSIC_ORDERCODE)) print('FirmWareID =', xep.get_system_info(XTID_SSIC_FIRMWAREID)) print('Version =', xep.get_system_info(XTID_SSIC_VERSION)) print('Build =', xep.get_system_info(XTID_SSIC_BUILD)) print('SerialNumber =', xep.get_system_info(XTID_SSIC_SERIALNUMBER)) print('VersionList =', xep.get_system_info(XTID_SSIC_VERSIONLIST)) # inti x4driver xep.x4driver_init() # Set enable pin xep.x4driver_set_enable(1) # Set iterations xep.x4driver_set_iterations(16) # Set pulses per step xep.x4driver_set_pulses_per_step(256) # Set dac min xep.x4driver_set_dac_min(949) # Set dac max xep.x4driver_set_dac_max(1100) # Set TX power xep.x4driver_set_tx_power(2) # Enable downconversion xep.x4driver_set_downconversion(1) # Set frame area offset xep.x4driver_set_frame_area_offset(0.18) offset = xep.x4driver_get_frame_area_offset() print('x4driver_get_frame_area_offset returned: ', offset) # Set frame area xep.x4driver_set_frame_area(2, 6) frame_area = xep.x4driver_get_frame_area() print('x4driver_get_frame_area returned: [', frame_area.start, ', ', frame_area.end, ']') # Set TX center freq xep.x4driver_set_tx_center_frequency(3) # Set PRFdiv xep.x4driver_set_prf_div(16) prf_div = xep.x4driver_get_prf_div() print('x4driver_get_prf_div returned: ', prf_div) # Start streaming xep.x4driver_set_fps(20) fps = xep.x4driver_get_fps() print('xep_x4driver_get_fps returned: ', fps) # Wait 5 sec. time.sleep(5) # Stop streaming xep.x4driver_set_fps(0) # Read data float if available. if xep.peek_message_data_float() > 0: data_float = xep.read_message_data_float() else: print('No data float messages available.') # Reset module xep.module_reset()
def x4m300_presence_simpleoutput(device_name, detection_zone=(0.5, 9), sensitivity=5, num_messages=0): # User settings detzone_start = detection_zone[0] detzone_end = detection_zone[1] presence_state_text = [] presence_state_text.append("No presence") presence_state_text.append("Presence") presence_state_text.append("Initializing") mc = ModuleConnector(device_name, log_level=0) x4m300 = mc.get_x4m300() sleep(1) # Allow for MC to read waiting messages from module. try: x4m300.set_sensor_mode(XTID_SM_STOP, 0) # Make sure no profile is running. print("Stopped already running profile.") except RuntimeError: # If not initialized, stop returns error. Still OK, just wanted to make sure the profile was not running. pass # Now flush old messages from module print("Flushing any old data.") while x4m300.peek_message_presence_single(): presence_single = x4m300.read_message_presence_single() # Read module info print("FirmwareID:", x4m300.get_system_info(XTID_SSIC_FIRMWAREID)) print("Version:", x4m300.get_system_info(XTID_SSIC_VERSION)) print("Build:", x4m300.get_system_info(XTID_SSIC_BUILD)) print("Serial number:", x4m300.get_system_info(XTID_SSIC_SERIALNUMBER)) print("Loading new profile.") x4m300.load_profile(XTS_ID_APP_PRESENCE_2) print("Selecting module output.") x4m300.set_output_control(XTS_ID_PRESENCE_SINGLE, 1) # PresenceSingle x4m300.set_output_control(XTS_ID_PRESENCE_MOVINGLIST, 0) # PresenceMovingList print("Setting user settings: DetectionZone = " + str(detzone_start) + " to " + str(detzone_end) + ", Sensitivity = " + str(sensitivity)) x4m300.set_detection_zone(detzone_start, detzone_end) x4m300.set_sensitivity(sensitivity) print("Start profile execution.") x4m300.set_sensor_mode(XTID_SM_RUN, 0) # Make sure no profile is running. print("Waiting for data...") n = 0 while num_messages == 0 or n < num_messages: time.sleep(0.1) while x4m300.peek_message_presence_single(): presence_single = x4m300.read_message_presence_single() print("Presence ->" + " FrameCounter: " + str(presence_single.frame_counter) + ", State: " + presence_state_text[presence_single.presence_state] + ", Distance: " + str(round(presence_single.distance, 2)) + ", SignalQuality: " + str(presence_single.signal_quality)) n += 1 x4m300.set_sensor_mode(XTID_SM_STOP, 0)
def x4m300_presence_simpleoutput(device_name, detection_zone=(0.5,9), sensitivity=5): # User settings detzone_start = detection_zone[0] detzone_end = detection_zone[1] #Reset module reset(device_name) mc = ModuleConnector(device_name, log_level=0) x4m300 = mc.get_x4m300() try: x4m300.set_sensor_mode(13, 0) # Make sure no profile is running. print("Stopped already running profile.") except RuntimeError: # If not initialized, stop returns error. Still OK, just wanted to make sure the profile was not running. pass # Read module info print("FirmwareID: " + x4m300.get_system_info(2)) print("Version: " + x4m300.get_system_info(3)) print("Build: " + x4m300.get_system_info(4)) print("Serial number: " + x4m300.get_system_info(6)) print("Loading new profile.") x4m300.load_profile(0x014d4ab8) print("Selecting module output.") x4m300.set_output_control(0x723bfa1f, 1) # PresenceMovingList print("Setting user settings: DetectionZone = " + str(detzone_start) + " to " + str(detzone_end) + ", Sensitivity = " + str(sensitivity)) x4m300.set_detection_zone(detzone_start, detzone_end) x4m300.set_sensitivity(sensitivity) print("Start profile execution.") x4m300.set_sensor_mode(1, 0) # Make sure no profile is running. def clear_buffer(): """Clears the frame buffer""" while x4m300.peek_message_presence_movinglist(): x4m300.read_message_presence_movinglist() def read_movlist_fast(): d = x4m300.read_message_presence_movinglist() mfast = np.array(d.movement_fast_items) mslow = np.array(d.movement_slow_items) return mfast, mslow def animate(i): mfast, mslow = read_movlist_fast(); line1.set_ydata(mfast) # update the data line2.set_ydata(mslow) # update the data return line1, line2 d = x4m300.read_message_presence_movinglist() State = d.presence_state print("Initializing,this will take around 2mins") while State == 2: d = x4m300.read_message_presence_movinglist() State = d.presence_state print("Initializing Done!") print("Start streaming movinglist...") fig = plt.figure() fig.suptitle("PresenceMovingList example") ax1 = fig.add_subplot(2,1,1) ax2 = fig.add_subplot(2,1,2) ax2.set_xlabel('Distance') ax1.set_ylabel('Fast Movement Metric') ax2.set_ylabel('Slow Movement Metric') mfast, mslow = read_movlist_fast() #setting upperlimits for y-axsis ax1.set_ylim(0,100) ax2.set_ylim(0,100) line1, = ax1.plot(mfast) line2, = ax2.plot(mslow) clear_buffer() ani = FuncAnimation(fig, animate, interval=100) plt.show() # stop streaming x4m300.set_sensor_mode(0x13, 0)
def simple_xep_plot(device_name, bb=False): FPS = 10 reset(device_name) mc = ModuleConnector(device_name) # Assume an X4M300/X4M200 module and try to enter XEP mode app = mc.get_x4m300() # Stop running application and set module in manual mode. try: app.set_sensor_mode(0x13, 0) # Make sure no profile is running. except RuntimeError: # Profile not running, OK pass try: app.set_sensor_mode(0x12, 0) # Manual mode. except RuntimeError: # Sensor already stopped, OK pass r = mc.get_xep() # Set DAC range r.x4driver_set_dac_min(900) r.x4driver_set_dac_max(1150) # Set integration r.x4driver_set_iterations(16) r.x4driver_set_pulses_per_step(26) if bb: r.x4driver_set_downconversion(1) else: r.x4driver_set_downconversion(0) # Start streaming of data r.x4driver_set_fps(FPS) def clear_buffer(): """Clears the frame buffer""" while r.peek_message_data_float(): _ = r.read_message_data_float() def read_frame(): """Gets frame data from module""" d = r.read_message_data_float() frame = np.array(d.data) # Convert the resulting frame to a complex array if downconversion is enabled if bb: n = len(frame) frame = frame[:n / 2] + 1j * frame[n / 2:] return frame def animate(i): if bb: line.set_ydata(abs(read_frame())) # update the data else: line.set_ydata(read_frame()) # update the data return line, fig = plt.figure() fig.suptitle("BreathingDetection_V1 10 FPS") ax = fig.add_subplot(1, 1, 1) frame = read_frame() if bb: frame = abs(frame) line, = ax.plot(frame) clear_buffer() ani = FuncAnimation(fig, animate, interval=FPS) #plt.margins(0,0) plt.xlim(50, 200) plt.ylim(-0.07, 0.07) #print(frame) plt.show() # Stop streaming of data r.x4driver_set_fps(0)
def configure_x4m300(device_name, record=False, x4m300_settings=x4m300_par_settings): mc = ModuleConnector(device_name) x4m300 = mc.get_x4m300() print('Clearing buffer') while x4m300.peek_message_baseband_iq(): x4m300.read_message_baseband_iq() while x4m300.peek_message_baseband_ap(): x4m300.read_message_baseband_ap() while x4m300.peek_message_presence_single(): x4m300.read_message_presence_single() while x4m300.peek_message_presence_movinglist(): x4m300.read_message_presence_movinglist() while x4m300.peek_message_pulsedoppler_byte(): x4m300.read_message_pulsedoppler_byte() while x4m300.peek_message_pulsedoppler_float(): x4m300.read_message_pulsedoppler_float() while x4m300.peek_message_noisemap_byte(): x4m300.read_message_noisemap_byte() while x4m300.peek_message_noisemap_float(): x4m300.read_message_noisemap_float() print('Start recorder if recording is enabled') if record: start_record(mc) # , DataType.PresenceSingleDataType) print('Ensuring no Xethru profile running') try: x4m300.set_sensor_mode(XTID_SM_STOP, 0) except RuntimeError: print('Xethru module could not enter stop mode') print('Loading new Xethru profile') # Check XeThru Module Communication Protocal section 5.2.8 for more detail x4m300.load_profile(XTS_ID_APP_PRESENCE_2) print('Set specific parameters') for variable, value in x4m300_settings.items(): try: if 'output_control' in variable: variable = 'output_control' setter = getattr(x4m300, 'set_' + variable) except AttributeError as e: print("X4M300 does not have a setter function for '%s'." % variable) raise e if isinstance(value, tuple): setter(*value) else: setter(value) print("Setting %s to %s" % (variable, value)) print_sesnor_settings(x4m300) print('Set module to RUN mode') try: x4m300.set_sensor_mode(XTID_SM_RUN, 0) # RUN mode except RuntimeError: print('Xethru module cloud not enter run mode') return x4m300