diff --git a/network_interface.py b/network_interface.py --- a/network_interface.py +++ b/network_interface.py @@ -36,13 +36,17 @@ class CanBusNetworkInterface(NetworkInte def __init__(self, network, interface_name): super(CanBusNetworkInterface, self).__init__(network) - # Bring up CAN interface (maybe do this in a systemd service file) - # Passing random arguments to sudo is super dangerous - os.system("sudo ip link set " + interface_name + " up type can bitrate 500000") - - self.interface_name = interface_name - self.dev = socketcan.SocketCanDev(interface_name) - self.queue = queue.CanQueue(self.dev) + try: + # Bring up CAN interface (maybe do this in a systemd service file) + # Passing random arguments to sudo is super dangerous + os.system("sudo ip link set " + interface_name + " up type can bitrate 500000") + + self.interface_name = interface_name + self.queue = None + self.dev = socketcan.SocketCanDev(interface_name) + self.queue = queue.CanQueue(self.dev) + except: + self.logger.error("Can Bus failed to initilize") #bidirectional address <==> uuid lookup self.address_lookup = {} @@ -51,37 +55,47 @@ class CanBusNetworkInterface(NetworkInte def start(self): super(CanBusNetworkInterface, self).start() self.logger.info("CanBusNetworkInterface: start") - self.queue.start() - _thread.start_new_thread(self.process_message, ()) + if self.queue != None: + self.queue.start() + _thread.start_new_thread(self.process_message, ()) + else: + self.logger.error("Can Bus failed to start") def send_message(self, message): address = self.uuid_lookup[message.module_uuid] can_frame = can.Frame(address, 8, [message.message_type, (message.data_key>>8) & 0xff, (message.data_key>>0) & 0xff, message.sensor_num] + list(struct.pack("f", message.data))) self.logger.debug("Send CAN message! CAN ID: " + hex(can_frame.id) + " Data: " + str(can_frame.data)) - self.queue.send(can_frame) + if self.queue != None: + self.queue.send(can_frame) + else: + self.logger.error("Can Bus is not initilized") def process_message(self): while True: - frame = self.queue.recv() - if frame != None: - - base_id = frame.id & 0x7fe + if self.queue != None: + frame = self.queue.recv() - if not base_id in self.address_lookup: - self.logger.debug("Uknown module address: " + hex(base_id)) - device_id = frame.data[0] & 0x7f - new_module = self.network.module_list.new_module(device_id, base_id, self) - self.address_lookup[base_id] = new_module.uuid - self.uuid_lookup[new_module.uuid] = base_id - - self.logger.debug("Received CAN message! ID: " + hex(frame.id)) - - data = [frame.data[7], frame.data[6], frame.data[5], frame.data[4]] - b = struct.pack('4B', *data) - f_data = struct.unpack('>f', b)[0] - message = HydroBotMessage(self.address_lookup[base_id], frame.data[0], ((frame.data[1] << 8) + frame.data[2]), frame.data[3], f_data) - self.logger.debug("Process message: " + str(message)) - self.network.process_message(message) + if frame != None: + + base_id = frame.id & 0x7fe + + if not base_id in self.address_lookup: + self.logger.debug("Uknown module address: " + hex(base_id)) + device_id = frame.data[0] & 0x7f + new_module = self.network.module_list.new_module(device_id, base_id, self) + self.address_lookup[base_id] = new_module.uuid + self.uuid_lookup[new_module.uuid] = base_id + + self.logger.debug("Received CAN message! ID: " + hex(frame.id)) + + data = [frame.data[7], frame.data[6], frame.data[5], frame.data[4]] + b = struct.pack('4B', *data) + f_data = struct.unpack('>f', b)[0] + message = HydroBotMessage(self.address_lookup[base_id], frame.data[0], ((frame.data[1] << 8) + frame.data[2]), frame.data[3], f_data) + self.logger.debug("Process message: " + str(message)) + self.network.process_message(message) + else: + self.logger.error("Can Bus is not initilized") class WifiNetworkInterface(NetworkInterface):