class NodeA(object): """ Node A radio. """ def __init__(self): self.data = NodeAData() self.packet = Packet('A') self.radio = RadioAPI() self.tx_packet_number = 1 def run(self): """ Run Node A. """ parser = argparse.ArgumentParser() parser.add_argument("-f", type=float, default=434e6, metavar='frequency', dest='frequency', nargs=1, help="Transmit frequency (default: %(default)s)") parser.add_argument( "-m", type=str, default='gfsk', metavar='modulation', dest='modulation', choices=['gfsk', 'fsk', 'ask'], help="Select modulation from [%(choices)s] (default: %(default)s)") parser.add_argument( "-p" "--power", type=int, default=17, metavar='power', dest='power', choices=[8, 11, 14, 17], help= "Select transmit power from [%(choices)s] (default: %(default)s)") parser.add_argument("-r" "--bitrate", type=float, default=4.8e3, metavar='bitrate', dest='bitrate', help="Set bitrate (default: %(default)s)") args = parser.parse_args() self.frequency = args.frequency modulation = args.modulation power = args.power data_rate = args.bitrate self.radio.startup() self.radio.configure_radio(power, self.frequency, data_rate, modulation) self.fsm() def _listen(self): status = self.radio.listen(rssi_threshold=100, timeout=0.1) if status == 'clear': pass # print "channel clear" def _receive_packet(self): """ Receive packet """ rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=None) pkt_num, t, loc, flags, data = self.packet.parse_packet(rx_packet) return pkt_num, loc, flags, data def _send_packet(self, mode, mod=None, eirp=None, bitrate=None): """ Transmit data. Parameters ---------- mode : str Mode of operation. Used to create appropriate packet header and payload. {`send_reconfig_command` | `request_data` | `stream_data`}. mod : str, opt Modulation, one of {`fsk` | `gfsk` | `ook` }. eirp : int, opt Transmit power, one of { 8 | 11 | 14 | 17 }. bitrate : float, opt Radio bitrate, one of {...} """ location = 1 if mode == 'stream_data': print "streaming data packets" self.packet.set_flags_node_a(send_stream=True) payload = self.data.pack_data(mode) elif mode == 'send_reconfig_command': self.packet.set_flags_node_a(send_command=True) payload = self.data.pack_data(mode, mod, eirp, bitrate) elif mode == 'request_data': self.packet.set_flags_node_a(request_data=True) payload = self.data.pack_data(mode) else: print 'error in _send_packet, no mode specified' raise ValueError tx_packet = self.packet.make_packet(self.tx_packet_number, location, payload) self.tx_packet_number += 1 self.radio.transmit(tx_packet) print "packet sent" def fsm(self): """ Node A finite state machine. """ index = 1 # while True: # self._send_packet('stream_data') # index += 1 while True: if index % 20 == 0: print "requesting data" self._send_packet('request_data') index += 1 pkt_num, loc, flags, data = self._receive_packet() packets_received = self.data.unpack_data(data) print "packets received by Node B", packets_received time.sleep(1) elif index == 35: print "changing waveform" mod = 'gfsk' eirp = 11 bitrate = 57.6e3 self._send_packet('send_reconfig_command', mod, eirp, bitrate) index += 1 pkt_num, loc, flags, data = self._receive_packet() if (flags & 0x04) == 0x04: print "node B acknowledged request, changing to new waveform" time.sleep(1) self.radio.configure_radio(eirp, self.frequency, bitrate, mod) self._send_packet('stream_data') index += 1 continue else: print "node B did not acknowledge request, continuing with current waveform" continue else: self._send_packet('stream_data') index += 1
class StandAloneRadioA(object): def __init__(self): self.kb = KnowledgeBase() self.lock = Lock() self.data = NodeAData() self.packet = Packet('A') self.radio = RadioAPI() self.tx_packet_number = 1 self.ack_packet_number = 0 self.goodput = 0 # self.data = [] # for i in range(50): # self.data.append(0xff) def _configure_radio(self, power, frequency, data_rate, modulation): """ Configure radio for operation. """ self.radio.configure_radio(power, frequency, data_rate, modulation) def _send_packet(self): """ Transmit packet. """ self.packet.set_flags_node_a() location = self.kb.get_state()['current_location'] data = self.data.pack_data() tx_packet = self.packet.make_packet(self.tx_packet_number, location, data) self.radio.transmit(tx_packet) def _receive_packet(self): """ Receive packet. """ rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=1.0) if rx_packet == []: # this occurs when timeout has been exceeded return else: packet_number, time_stamp, location, flags, data = self.packet.parse_packet(rx_packet) self.ack_packet_number, self.goodput = self.data.unpack_data(data) # print "packet_number=%d time_stamp=%f location=%d flags=0x%x" %(packet_number, time_stamp, # location, flags) print "goodput for acknowledged packet #%d = %f bits/second" %(self.ack_packet_number, self.goodput) def _listen(self): """ Listen before talk. """ status = self.radio.listen(rssi_threshold=100, timeout=1.0) if status == 'clear': print "channel clear" def _fsm(self): self._listen() time.sleep(0.01) self._send_packet() time.sleep(0.01) self._receive_packet() time.sleep(0.01) def run(self): """ Run the radio subsystem. """ self.radio.startup() default_radio_profile = location = self.kb.get_state()['default_radio_profile'] power = default_radio_profile['power'] frequency = default_radio_profile['frequency'] data_rate = default_radio_profile['data_rate'] modulation = default_radio_profile['modulation'] self._configure_radio(power, frequency, data_rate, modulation) # state = "listen" while True: self._fsm() self.lock.acquire() self.kb.sent_packets.append(self.tx_packet_number) self.kb.ack_packets.append((self.ack_packet_number, self.goodput)) self.lock.release() self.tx_packet_number += 1 def shutdown(self): self.kb.save_kb() self.radio.shutdown()
class StandAloneRadioA(object): def __init__(self): self.kb = KnowledgeBase() self.lock = Lock() self.data = NodeAData() self.packet = Packet('A') self.radio = RadioAPI() self.tx_packet_number = 1 self.ack_packet_number = 0 self.goodput = 0 # self.data = [] # for i in range(50): # self.data.append(0xff) def _configure_radio(self, power, frequency, data_rate, modulation): """ Configure radio for operation. """ self.radio.configure_radio(power, frequency, data_rate, modulation) def _send_packet(self): """ Transmit packet. """ self.packet.set_flags_node_a() location = self.kb.get_state()['current_location'] data = self.data.pack_data() tx_packet = self.packet.make_packet(self.tx_packet_number, location, data) self.radio.transmit(tx_packet) def _receive_packet(self): """ Receive packet. """ rx_packet = self.radio.receive(rx_fifo_threshold=64, timeout=1.0) if rx_packet == []: # this occurs when timeout has been exceeded return else: packet_number, time_stamp, location, flags, data = self.packet.parse_packet( rx_packet) self.ack_packet_number, self.goodput = self.data.unpack_data(data) # print "packet_number=%d time_stamp=%f location=%d flags=0x%x" %(packet_number, time_stamp, # location, flags) print "goodput for acknowledged packet #%d = %f bits/second" % ( self.ack_packet_number, self.goodput) def _listen(self): """ Listen before talk. """ status = self.radio.listen(rssi_threshold=100, timeout=1.0) if status == 'clear': print "channel clear" def _fsm(self): self._listen() time.sleep(0.01) self._send_packet() time.sleep(0.01) self._receive_packet() time.sleep(0.01) def run(self): """ Run the radio subsystem. """ self.radio.startup() default_radio_profile = location = self.kb.get_state( )['default_radio_profile'] power = default_radio_profile['power'] frequency = default_radio_profile['frequency'] data_rate = default_radio_profile['data_rate'] modulation = default_radio_profile['modulation'] self._configure_radio(power, frequency, data_rate, modulation) # state = "listen" while True: self._fsm() self.lock.acquire() self.kb.sent_packets.append(self.tx_packet_number) self.kb.ack_packets.append((self.ack_packet_number, self.goodput)) self.lock.release() self.tx_packet_number += 1 def shutdown(self): self.kb.save_kb() self.radio.shutdown()