from compLib.LogstashLogging import Logging from compLib.MetricsLogging import MetricsLogging from compLib.Spi import Spi, Register SENSOR_COUNT = 5 class IRSensor(object): """Access the different IR Sensors of the robot """ @staticmethod def read(sensor: int) -> int: """Read one infrared sensor :param sensor: Which sensor to read. Between 1 and 5 :raises: IndexError :return: Sensor value. 10 bit accuracy :rtype: int """ if sensor <= 0 or sensor > SENSOR_COUNT: raise IndexError("Invalid sensor specified!") result = 0 if sensor == 1: result = Spi.read(Register.IR_1_H, 2) elif sensor == 2: result = Spi.read(Register.IR_2_H, 2) elif sensor == 3: result = Spi.read(Register.IR_3_H, 2) elif sensor == 4: result = Spi.read(Register.IR_4_H, 2) elif sensor == 5: result = Spi.read(Register.IR_5_H, 2) MetricsLogging.put("Infrared", result, sensor) return result @staticmethod def read_all(): """Read all IR sensors at once. This is faster than read as it only uses one SPI call for all sensors! :return: Tuple of all current ir sensors """ sensors = Spi.read_array(Register.IR_1_H, 5 * 2) sensor_1 = int.from_bytes( sensors[0:2], byteorder='big', signed=False) sensor_2 = int.from_bytes( sensors[2:4], byteorder='big', signed=False) sensor_3 = int.from_bytes( sensors[4:6], byteorder='big', signed=False) sensor_4 = int.from_bytes( sensors[6:8], byteorder='big', signed=False) sensor_5 = int.from_bytes( sensors[8:10], byteorder='big', signed=False) return (sensor_1, sensor_2, sensor_3, sensor_4, sensor_5) @staticmethod def set(sensor: int, on: bool): """Turn on / off a IR emitter :param sensor: Which sensor to read. Between 1 and 5 :raises: IndexError """ if sensor <= 0 or sensor > SENSOR_COUNT: raise IndexError("Invalid sensor specified!") if sensor == 1: Spi.write(Register.IR_1_LED, 1, on) elif sensor == 2: Spi.write(Register.IR_2_LED, 1, on) elif sensor == 3: Spi.write(Register.IR_3_LED, 1, on) elif sensor == 4: Spi.write(Register.IR_4_LED, 1, on) elif sensor == 5: Spi.write(Register.IR_5_LED, 1, on)