diff --git a/run-solleroot.py b/run-solleroot.py index 74f3d4cae99f47a23e208ce78fd9ee94f812ecba..f2caeffb53f868590df3837d7571403f25dfabe3 100644 --- a/run-solleroot.py +++ b/run-solleroot.py @@ -11,6 +11,13 @@ uart_service_uuid = '6e400001-b5a3-f393-e0a9-e50e24dcca9e' tx_characteristic_uuid = '6e400002-b5a3-f393-e0a9-e50e24dcca9e' # Write rx_characteristic_uuid = '6e400003-b5a3-f393-e0a9-e50e24dcca9e' # Notify + +DATA_TYPE_COLOR_SENSOR = 4 +DATA_TYPE_BUMPER = 12 +DATA_TYPE_LIGHT = 13 +DATA_TYPE_TOUCH = 17 +DATA_TYPE_CLIFF = 20 + class BluetoothDeviceManager(gatt.DeviceManager): robot = None # root robot device @@ -24,6 +31,8 @@ class BluetoothDeviceManager(gatt.DeviceManager): class RootDevice(gatt.Device): message = "no message" + edge_following_enabled = False + def print_message(self): print(self.message) @@ -58,19 +67,78 @@ class RootDevice(gatt.Device): self.rx_characteristic.enable_notifications() # listen to RX messages def characteristic_value_updated(self, characteristic, value): - message = [] + new_data = [] type = "" for byte in value: - message.append(byte) + new_data.append(byte) # print ("Messages from Root:") - if message[0] == 4: type = "Color Sensor" - if message[0] == 12: type = "Bumper" - if message[0] == 13: type = "Light Sensor" - if message[0] == 17: type = "Touch Sensor" - if message[0] == 20: type = "Cliff Sensor" + # Print sensor data + if new_data[0] == DATA_TYPE_COLOR_SENSOR : type = "Color Sensor" + if new_data[0] == DATA_TYPE_BUMPER: type = "Bumper" + if new_data[0] == DATA_TYPE_LIGHT: type = "Light Sensor" + if new_data[0] == DATA_TYPE_TOUCH: type = "Touch Sensor" + if new_data[0] == DATA_TYPE_CLIFF: type = "Cliff Sensor" +# print("{}: {}".format(type, new_data)) + + # Do the thing! + if new_data[0] == DATA_TYPE_COLOR_SENSOR: + did_adjust = adjust_for_perimeter_if_needed(new_data) + if did_adjust: + return + if type == "Color Sensor" and self.edge_following_enabled: + self.follow_edge(new_data) + + + def adjust_for_perimeter_if_needed(self, data): + adjusted = False + + # TODO: Check to see if you're at perimeter! If you are, update your state and set + # adjusted = True - self.message = "YAY IT WORKED" #message - # print(type, message) + return adjusted + + + def follow_edge(self, message): + if message[3] != 0 or message[4] != 0: + #drive_root("l") + manager.robot.turn_rate(-45) + #manager.robot.drive_left_slow() + #drive_root("z") + turn_state = 1 + elif message[5] != 0 or message[6] != 0: + #drive_root("l") + manager.robot.turn_rate(-30) + #manager.robot.drive_left_slow_slow() + #drive_root("x") + turn_state = 1 + #drive_root("f") + #print("test1") + elif message[7] != 0 or message[8] != 0: + drive_root("f") + + elif message[9] != 0 or message[10] != 0: + manager.robot.turn_rate(30) + + elif message[12] != 0 or message[11] != 0: + manager.robot.turn_rate(45) + elif message[14] != 0 or message[13] != 0: + #drive_root("r") + manager.robot.turn_rate(60) + #manager.robot.drive_right_slow_slow() + #drive_root("c") + turn_state = 2 + #drive_root("f") + #print("test2") + elif message[16] != 0 or message[15] != 0: + #drive_root("r") + manager.robot.turn_rate(60) + #manager.robot.drive_right_slow() + #drive_root("v") + turn_state = 2 + else: + drive_root("f") + #manager.robot.drive_forward_slow() + #drive_root("a") def drive_forward(self): self.tx_characteristic.write_value([0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1]) @@ -151,7 +219,13 @@ def drive_root(command): if command == "p": print ("Steer") manager.robot.steer(30,40) - + if command == "clear": + print ("clear all") + manager.robot.edge_following_enabled = False + if command == "edge": + print ("edge") + manager.robot.edge_following_enabled = True + # start here if run as program / not imported as module if __name__ == "__main__": manager = BluetoothDeviceManager(adapter_name = 'hci0')