hamnet70-gnuradio-legacy/controller/Hamnet70Controller.py

131 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python2
import fcntl
import struct
import os
import socket
import threading
from select import select
import sys
import logging as log
sys.path.append(os.environ.get('GRC_HIER_PATH', os.path.expanduser('~/.grc_gnuradio')))
from hamnet70_demod import hamnet70_demod # grc-generated hier_block
from hamnet70_mod import hamnet70_mod # grc-generated hier_block
import pmt
from gnuradio import gr
from gnuradio import blocks
import numpy as np
TUNSETIFF = 0x400454ca
TUNSETOWNER = TUNSETIFF + 2
IFF_TUN = 0x0001
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000
class Hamnet70Controller(gr.basic_block):
def _tuntap_setup(self):
tun = open('/dev/net/tun', 'r+b', buffering=0)
ifr = struct.pack('16sH', self._tuntap_name, IFF_TUN | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)
fcntl.ioctl(tun, TUNSETOWNER, 1000)
self._tuntap = tun
def _handle_rx_pdu(self, pdu):
print(msg)
os.write(self._tuntap.fileno(), pdu)
def _txthread_func(self):
log.info("tx thread started.")
while not self.shutdown:
rlist = [self._tuntap]
rready, wready, eready = select(rlist, [], [], 0.1)
log.info("select returned: {}, {}, {}".format(rready, wready, eready))
if rready:
data = os.read(self._tuntap.fileno(), 65536)
log.info("packet from TAP: {}".format(data))
# convert data to numpy
npdata = np.zeros(len(data), dtype=np.uint8)
for i in range(len(data)):
npdata[i] = ord(data[i])
pmt_data = pmt.to_pmt(npdata)
pmt_pdu = pmt.cons(pmt.PMT_NIL, pmt_data)
self.message_port_pub(pmt.intern("packet_tx"), pmt_pdu)
def __init__(self, tuntap_name='hamnet70'):
gr.basic_block.__init__(self, name="Hamnet70 Controller", in_sig=None, out_sig=None)
self._tuntap_name = tuntap_name
self._txthread = None
self._tuntap_setup()
self.message_port_register_out(pmt.intern("packet_tx"))
self.message_port_register_in(pmt.intern("packet_rx"))
self.set_msg_handler(pmt.intern("packet_rx"), self._handle_rx_pdu)
self.start_txthread()
def __del__(self):
self.stop_txthread()
tun.close()
def start_txthread(self):
if not self._txthread:
self.shutdown = False
self._txthread = threading.Thread(target=self._txthread_func)
self._txthread.daemon = False
self._txthread.start()
def stop_txthread(self):
if self._txthread:
self.shutdown = True
self._txthread.join()
self._txthread = None
class Hamnet70TopBlock(gr.top_block):
def __init__(self):
gr.top_block.__init__(self, "Top Block")
# Create blocks
self._controller = Hamnet70Controller()
self._mod = hamnet70_mod(samp_rate_0=200e3)
self._demod = hamnet70_demod(samp_rate=200e3)
self._input_fifo = blocks.file_source(gr.sizeof_gr_complex*1, 'rx.fifo', True)
self._output_fifo = blocks.file_sink(gr.sizeof_gr_complex*1, 'tx.fifo', False)
self._throttle = blocks.throttle(gr.sizeof_gr_complex*1, 200e3)
# Connect blocks
self.connect((self._input_fifo, 0), (self._throttle, 0))
self.connect((self._throttle, 0), (self._demod, 0))
self.msg_connect((self._demod, 'message_out'), (self._controller, 'packet_rx'))
self.msg_connect((self._controller, 'packet_tx'), (self._mod, 'packet_in'))
self.connect((self._mod, 0), (self._output_fifo, 0))
if __name__ == "__main__":
top_block = Hamnet70TopBlock()
top_block.start()
try:
top_block.wait()
except KeyboardInterrupt:
top_block.stop()