-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmonitor.py
executable file
·115 lines (99 loc) · 2.98 KB
/
monitor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#!/usr/bin/env python
import control
import curses
import sys
from collections import defaultdict
import gevent
WINSIZE = {'height':5, 'width':32}
def proc_default(rig, win, *args):
pass
def proc_buf(rig, win, bank, freq, step, dir_, rev, tone, ctcss, dcs, tone_idx,
dcs_idx, ctcss_idx, offset, mode):
freq = "%-3d.%03d" % (int(freq[2:5]), int(freq[5:8]))
dir_ = int(dir_)
win.addstr(int(bank),2,freq+(' ', '+', '-')[dir_])
def proc_mc(rig, win, bank, chan_num):
bank = int(bank)
chan_num = int(chan_num)
rig.vfos[bank].chan_num = chan_num
win.addstr(int(bank),11,"%03d" % (chan_num))
# get channel name
rig.sendline('MNA 0,%03d' % (chan_num))
def proc_mna(rig, win, bank, chan_num, chan_name):
bank = int(bank)
chan_num = int(chan_num)
# bah, need to save some state to do this properly :(
for n, vfo in enumerate(rig.vfos):
if vfo.chan_num == chan_num:
win.addstr(n, 15, ' ' * 8)
win.addstr(n, 15, chan_name)
def proc_bc(rig, win, ct, tx):
ct = bool(int(ct))
tx = bool(int(ct))
win.addstr(0,1, ' ')
win.addstr(1,1, ' ')
win.addstr(int(ct),1, 'C')
win.addstr(int(tx),1, '*')
def proc_by(rig, win, bank, status):
bank = int(bank)
status = bool(int(status))
win.addstr(bank, 0, 'B' if status else ' ')
#proc_bc(rig, win, '0', '0')
def proc_vmc(rig, win, bank, mode):
bank = int(bank)
mode = int(mode)
if mode == 0:
win.addstr(bank,11," ")
win.addstr(bank,15," " * 8)
procs = defaultdict(lambda: proc_default)
procs.update({
'BUF': proc_buf,
'MC': proc_mc,
'BC': proc_bc,
'BY': proc_by,
'VMC': proc_vmc,
'MNA': proc_mna,
})
def update_screen(rig, win, msg):
head, sep, tail=msg.partition(' ')
proc = procs[head]
args = ()
if tail != '':
args = tail.split(',')
proc(rig, win, *args)
win.refresh()
def main(win=None, argv=None):
if argv is None:
argv = sys.argv
curses.curs_set(0)
curses.resize_term(WINSIZE['height'], WINSIZE['width'])
dev = argv[1]
win = curses.newwin(WINSIZE['height'], WINSIZE['width'], 0, 0)
rig = control.Rig(dev)
for n in xrange(10):
rig.sendline('PS 1')
while True:
try:
rig.rxlines.get(timeout=0.5)
except gevent.queue.Empty:
break
rig.sendline('AI 1'); rig.rxlines.get()
rig.sendline('DL 1'); rig.rxlines.get()
rig.sendline('AG 0,1E'); rig.rxlines.get()
rig.sendline('AG 1,1B'); rig.rxlines.get()
rig.sendline('SQ 0,0A'); rig.rxlines.get()
rig.sendline('SQ 1,0A'); rig.rxlines.get()
rig.sendline('BC')
for n in xrange(2):
rig.sendline('BUF %s' % n)
rig.sendline('MC %s' % n)
rig.sendline('VMC %s' % n)
def rxloop():
while True:
msg = rig.rxlines.get()
update_screen(rig, win, msg)
gevent.spawn(rxloop).join()
raw_input()
if __name__ == '__main__':
print "starting"
curses.wrapper(main)