class TestSensors(unittest.TestCase): def setUp(self): self._start_time = time.time() self._sensors = Sensors() def tearDown(self): self._sensors.close() def test_all_tubes_have_enough_sensors(self): tubes = self._sensors.tubes_with_enough_sensors() for i in range(constants.NUMBER_OF_PATIENTS): with self.subTest(i=i): self.assertIn(i, tubes, f"Port {i} is missing sensors.") def test_calibration_pressure_sensor_present(self): self.assertTrue(self._sensors.calibration_pressure_sensor_connected(), "Calibration pressure sensor is missing.") def test_poll_and_connected_sensors_are_same_shape(self): connected_sensors = self._sensors.connected_sensors() sensor_data = self._sensors.poll() for i in range(len(connected_sensors)): with self.subTest(i=i): self.assertEqual(len(connected_sensors[i]), len(sensor_data[i]), f"Contradicting shapes on port {i}.")
def main(): sensors = Sensors() calculator = Calculator() communicator = Communicator() running = True while running: try: start_time = time.time() data = sensors.poll() calculator.add_datum(data) datum = calculator.get_datum() communicator.publish_message(datum) while (time.time() - start_time < 1.0): time.sleep(0.1) except KeyboardInterrupt: running = False sensors.close() communicator.close()
def run(self): sensors = None datalogger = None try: # initialise objects sensors = Sensors(self.T_OFFSET,self.P_OFFSET,self.H_OFFSET) datalogger = DataLogger(self.DATALOGFILE, self.DATALOGKEYS, self.DATALOGMAXFILESIZE) self.scheduler = HeaterScheduler() self.modemanager = ModeManager( scheduler=self.scheduler, callbackfunc=self.modemanagercallbackfunc) self.mqttclient = MqttClient(subscribelist=self.SUBSCRIBELIST) self.heatercontroller = HeaterController() # initialise state self.modemanager.setMode(self.modemanager.AUTO) # initial data t_avg,p_avg,h_avg = sensors.getData() # present ourselves self.mqttclient.publish({topics.IOTHERMSTATUS:'Active'}) self.mqttclient.publish({topics.IOTHERMVERSION:__version__ +' '+ __status__}) self.mqttclient.publish({topics.MODE:self.modemanager.currentmode.name}) self.mqttclient.publish({topics.TARGETTEMPERATURE:self.modemanager.currentmode.targettemperature}) t = 0 while True: t_,p,h = sensors.getData() messages = self.mqttclient.getData() # use temperature value from mqtt if self.USE_OTHERTEMPERATURE and topics.OTHERTEMPERATURE in messages: t = float( messages[topics.OTHERTEMPERATURE] ) if not self.USE_OTHERTEMPERATURE: t = t_ # calculate averages t_avg = (t_avg + t)/2 p_avg = (p_avg + p)/2 h_avg = (h_avg + h)/2 # calculate derivatives d_t = (t - t_avg)/self.REFRESH_SECONDS d_p = (p - p_avg)/self.REFRESH_SECONDS d_h = (h - h_avg)/self.REFRESH_SECONDS # process data from subscribed topics self.processMessages( messages ) # prepare for publishing messages = self.prepareMessages(t, p, h, d_t, d_p, d_h) datalogger.log(messages) self.mqttclient.publish(messages) # update the heatercontroller with the current and target temperatures #print('targettemperature = {}'.format(self.modemanager.currentmode.targettemperature)) self.heatercontroller.update(t,self.modemanager.currentmode.targettemperature) sleep(self.REFRESH_SECONDS) finally: print('IOThermostat: Stopping IOThermostat..') if datalogger: datalogger.close() if sensors: sensors.close() if self.scheduler: self.scheduler.close() if self.heatercontroller: self.heatercontroller.close() if self.mqttclient: self.mqttclient.close()
def main(): parser = argparse.ArgumentParser() parser.add_argument('file', nargs='?', default=None, help="Name of the file to save") args = parser.parse_args() filename = args.file if filename is None: i = 1 while os.path.exists("data/data%d.csv" % i): i += 1 filename = "data/data%d.csv" % i # Create directory if it doesn't exist if not os.path.exists(os.path.dirname(filename)): try: os.makedirs(os.path.dirname(filename)) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise sensors = Sensors() video_flags = OPENGL | DOUBLEBUF | RESIZABLE pygame.init() pygame.display.set_mode((900, 500), video_flags) title = "Press Esc to quit" pygame.display.set_caption(title) sim = Simulation(900, 500) frames = 0 fps = 0 ticks = pygame.time.get_ticks() sensor_data = SensorData() activity = 0 while True: sensor_data = sensors.read() or sensor_data event = pygame.event.poll() if event.type == QUIT or (event.type == KEYDOWN and (event.key == K_ESCAPE or event.key == K_q)): break elif event.type == VIDEORESIZE: pygame.display.set_mode(event.dict['size'], video_flags) sim.resize(*event.dict['size']) elif event.type == KEYDOWN and event.key == K_r: sim.recenter() elif event.type == KEYDOWN and event.key in range(K_0, K_9 + 1): activity = int(event.key - K_0) elif event.type == KEYDOWN and event.key in range(K_KP0, K_KP9 + 1): activity = int(event.key - K_KP0) elif event.type == KEYDOWN and (event.key == K_RETURN or event.key == K_KP_ENTER): print("\n - ACTIVITY %d:" % (activity), end='') save_data = list(sensor_data.clf_data()) with open(filename, "a", newline='') as csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow([activity] + save_data) print(" Saved %s " % save_data, end='\n\n') if sensor_data is not None: sim.sensor_data = sensor_data sim.draw() pygame.display.flip() if (pygame.time.get_ticks() - ticks) >= 250: fps = ((frames * 1000) // (pygame.time.get_ticks() - ticks)) ticks = pygame.time.get_ticks() frames = 0 pygame.display.set_caption(title + " | FPS: %d | Activity %d" % (fps, activity)) frames = frames + 1 sensors.close()
from sensors import Sensors import time sensors = Sensors() sensors.boot() while True: sensors.read_data() print(sensors.mag, sensors.acc, sensors.gyro) time.sleep(0.02) sensors.close() print("sensor closed")
def main(): parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument('--net', metavar='port', const=5000, default=None, type=int, nargs='?', help='Listen to sensor data over UDP') group.add_argument('--serial', metavar='port', const=True, default=None, nargs='?', help='Listen to sensor data over serial (default)') group.add_argument('--demo', action='store_const', dest='demo', const=True, help='Only show 3D model with no sensor data') args = parser.parse_args() if not args.net and not args.serial and not args.demo: args = parser.parse_args(['--serial']) if not args.demo: sensors = Sensors(net_port=args.net, serial_port=args.serial) video_flags = OPENGL | DOUBLEBUF | RESIZABLE pygame.init() pygame.display.set_mode((900, 500), video_flags) title = "AutomailX" pygame.display.set_caption(title) sim = Simulation(900, 500) frames = 0 fps = 0 ticks = pygame.time.get_ticks() sensor_data = SensorData() if args.demo: sensor_data.setdata(flex=sim.flex_straight) prediction = None try: predictor = Predict() except Exception as exception: print("Predictor failed:", exception.with_traceback) predictor = None while True: if not args.demo: sensor_data = sensors.read() or sensor_data event = pygame.event.poll() if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): break # if event.type == KEYDOWN and event.key == K_z: # ser.write("z") elif event.type == VIDEORESIZE: pygame.display.set_mode(event.dict['size'], video_flags) sim.resize(*event.dict['size']) elif event.type == KEYDOWN and event.key == K_r: sim.recenter() else: keys = pygame.key.get_pressed() # checking pressed keys if keys[pygame.K_RIGHT]: sensor_data.flex = \ min(sim.flex_straight, max(sim.flex_bent, sensor_data.flex + 600)) elif keys[pygame.K_LEFT]: sensor_data.flex = \ min(sim.flex_straight, max(sim.flex_bent, sensor_data.flex - 600)) elif args.demo: if event.type == KEYDOWN and event.key == K_UP: sim.nextPose() elif event.type == KEYDOWN and event.key == K_DOWN: sim.prevPose() if sensor_data is not None: sim.sensor_data = sensor_data if not args.demo and predictor is not None: prediction = predictor.predict(sensor_data) or 0 sim.setPose(prediction) print(" Prediction: %s " % prediction, end='') sim.draw() pygame.display.flip() if (pygame.time.get_ticks()-ticks) >= 250: fps = ((frames*1000)//(pygame.time.get_ticks()-ticks)) ticks = pygame.time.get_ticks() frames = 0 prediction_title = ("| Prediction: %d" % prediction) if prediction is not None else "" pygame.display.set_caption("%s | FPS: %3d %s" % (title, fps, prediction_title)) frames = frames+1 if not args.demo: sensors.close()