Example #1
0
    def update(self):
        upd_list = [
        ]  # list of nodes with new laps (node, new_lap_id, lap_timestamp)
        cross_list = []  # list of nodes with crossing-flag changes
        for index, node in enumerate(self.nodes):
            if node.frequency:
                readtime = monotonic()

                node_data = self.data[index]
                if not node_data:
                    break

                data_line = node_data.readline()
                if data_line == '':
                    node_data.seek(0)
                    data_line = node_data.readline()
                data_columns = data_line.split(',')
                lap_id = int(data_columns[1])
                ms_val = int(data_columns[2])
                rssi_val = int(data_columns[3])
                node.node_peak_rssi = int(data_columns[4])
                node.pass_peak_rssi = int(data_columns[5])
                node.loop_time = int(data_columns[6])
                cross_flag = True if data_columns[7] == 'T' else False
                node.pass_nadir_rssi = int(data_columns[8])
                node.node_nadir_rssi = int(data_columns[9])
                pn_history = PeakNadirHistory()
                pn_history.peakRssi = int(data_columns[10])
                pn_history.peakFirstTime = int(data_columns[11])
                pn_history.peakLastTime = int(data_columns[12])
                pn_history.nadirRssi = int(data_columns[13])
                pn_history.nadirTime = int(data_columns[14])

                if node.is_valid_rssi(rssi_val):
                    node.current_rssi = rssi_val
                    self.process_lap_stats(node, readtime, lap_id, ms_val,
                                           cross_flag, pn_history, cross_list,
                                           upd_list)
                else:
                    self.log(
                        'RSSI reading ({0}) out of range on Node {1}; rejected'
                        .format(rssi_val, node.index + 1))

        # process any nodes with crossing-flag changes
        self.process_crossings(cross_list)

        # process any nodes with new laps detected
        self.process_updates(upd_list)
Example #2
0
    def update(self):
        upd_list = [
        ]  # list of nodes with new laps (node, new_lap_id, lap_timestamp)
        cross_list = []  # list of nodes with crossing-flag changes
        for node in self.nodes:
            if node.frequency:
                if node.api_valid_flag or node.api_level >= 5:
                    if node.api_level >= 18:
                        data = self.read_block(node.i2c_addr, READ_LAP_STATS,
                                               19)
                    elif node.api_level >= 17:
                        data = self.read_block(node.i2c_addr, READ_LAP_STATS,
                                               28)
                    elif node.api_level >= 13:
                        data = self.read_block(node.i2c_addr, READ_LAP_STATS,
                                               20)
                    else:
                        data = self.read_block(node.i2c_addr, READ_LAP_STATS,
                                               18)
                    server_roundtrip = self.i2c_response - self.i2c_request
                    server_oneway = server_roundtrip / 2
                    readtime = self.i2c_response - server_oneway
                else:
                    data = self.read_block(node.i2c_addr, READ_LAP_STATS, 17)

                if data != None:
                    lap_id = data[0]

                    if node.api_level >= 18:
                        offset_rssi = 3
                        offset_nodePeakRssi = 4
                        offset_passPeakRssi = 5
                        offset_loopTime = 6
                        offset_crossing = 8
                        offset_passNadirRssi = 9
                        offset_nodeNadirRssi = 10
                        offset_peakRssi = 11
                        offset_peakFirstTime = 12
                        offset_peakLastTime = 14
                        offset_nadirRssi = 16
                        offset_nadirTime = 17
                    else:
                        offset_rssi = 5
                        offset_nodePeakRssi = 7
                        offset_passPeakRssi = 9
                        offset_loopTime = 11
                        offset_crossing = 15
                        offset_passNadirRssi = 16
                        offset_nodeNadirRssi = 18
                        offset_peakRssi = 20
                        offset_peakTime = 22
                        offset_nadirRssi = 24
                        offset_nadirTime = 26

                    rssi_val = unpack_rssi(node, data[offset_rssi:])
                    if node.is_valid_rssi(rssi_val):
                        node.current_rssi = rssi_val

                        cross_flag = None
                        pn_history = None
                        if node.api_valid_flag:  # if newer API functions supported
                            if node.api_level >= 18:
                                ms_val = unpack_16(data[1:])
                                pn_history = PeakNadirHistory()
                                pn_history.peakRssi = unpack_rssi(
                                    node, data[offset_peakRssi:])
                                pn_history.peakFirstTime = unpack_16(
                                    data[offset_peakFirstTime:]
                                )  # ms *since* the first peak time
                                pn_history.peakLastTime = unpack_16(
                                    data[offset_peakLastTime:]
                                )  # ms *since* the last peak time
                                pn_history.nadirRssi = unpack_rssi(
                                    node, data[offset_nadirRssi:])
                                pn_history.nadirTime = unpack_16(
                                    data[offset_nadirTime:])
                            else:
                                ms_val = unpack_32(data[1:])

                            node.node_peak_rssi = unpack_rssi(
                                node, data[offset_nodePeakRssi:])
                            node.pass_peak_rssi = unpack_rssi(
                                node, data[offset_passPeakRssi:])
                            node.loop_time = unpack_16(data[offset_loopTime:])
                            if data[offset_crossing]:
                                cross_flag = True
                            else:
                                cross_flag = False
                            node.pass_nadir_rssi = unpack_rssi(
                                node, data[offset_passNadirRssi:])

                            if node.api_level >= 13:
                                node.node_nadir_rssi = unpack_rssi(
                                    node, data[offset_nodeNadirRssi:])

                            if node.api_level >= 18:
                                data_logger = self.data_loggers[node.index]
                                if data_logger:
                                    data_logger.write(
                                        "{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}\n"
                                        .format(readtime, lap_id, int(ms_val),
                                                node.current_rssi,
                                                node.node_peak_rssi,
                                                node.pass_peak_rssi,
                                                node.loop_time,
                                                'T' if cross_flag else 'F',
                                                node.pass_nadir_rssi,
                                                node.node_nadir_rssi, peakRssi,
                                                peakFirstTime, peakLastTime,
                                                nadirRssi, nadirTime))

                        else:  # if newer API functions not supported
                            ms_val = unpack_32(data[1:])
                            node.pass_peak_rssi = unpack_rssi(node, data[11:])
                            node.loop_time = unpack_32(data[13:])

                        self.process_lap_stats(node, readtime, lap_id, ms_val,
                                               cross_flag, pn_history,
                                               cross_list, upd_list)

                    else:
                        self.log(
                            'RSSI reading ({0}) out of range on Node {1}; rejected'
                            .format(rssi_val, node.index + 1))

        # process any nodes with crossing-flag changes
        self.process_crossings(cross_list)

        # process any nodes with new laps detected
        self.process_updates(upd_list)