class UartHandler(object): def __init__(self, logger, serial_line='/dev/ttyAMA0', baud_rate=115200, timeout=1): self.ser = serial.Serial(serial_line, baud_rate, timeout=timeout) self.logger = logger self.db = DB(logger=logger) self.audio = AudioDriver() self.logger.info('Opening serial line') def _serial_read_line(self): return self.ser.readline().strip() def _wait_for_begin(self): self.audio.prompt_begin() while True: if self._serial_read_line() == 'BEGIN': self.logger.info('Got BEGIN') return else: self.logger.info('Waiting for BEGIN') def _sync_acks(self): while True: self.ser.write('ACK') self.logger.info('Sent ACK') if self._serial_read_line() == 'ACK': self.logger.info('Got ACK') return else: self.logger.info('Waiting for ACK') def _parse_data(self, raw_data): data_components = raw_data.split('|') if len(data_components) == 2: packet_type = data_components[0] data = [int(d.strip()) for d in data_components[1].split(',')] return (packet_type, data) return (None, None) def perform_handshake(self): self._wait_for_begin() self._sync_acks() self.logger.info('Handshake done...') def read_origin_and_destination(self): self.logger.info('Waiting for origin and destination...') self.audio.prompt_enter_info() _input = self._serial_read_line() while not _input or _input.count('*') != 5: _input = self._serial_read_line() self.ser.write('ACK') self.logger.error('Got data %s', _input) o_bldg, o_level, o_node, d_bldg, d_level, d_node = _input.split('*') self.db.insert_origin_and_destination(o_bldg, o_level, o_node, d_bldg, d_level, d_node) self.logger.info('Got Origin [Building %s, Level %s, Node %s]', o_bldg, o_level, o_node) self.logger.info('Got Destination [Building %s, Level %s, Node %s]', d_bldg, d_level, d_node) def read_data(self): self.logger.info('Receiving data...') log_counter = 0 while True: data = self._serial_read_line() if data: (packet_type, data) = self._parse_data(data) self.db.insert_data(packet_type, data) log_counter += 1 if log_counter > 50: self.logger.info('Receiving data...') log_counter = 0