ao-tools: complain if st-flash is not available
[fw/altos] / ao-bringup / get-radio-cal
1 #!/usr/bin/nickle
2
3 import File;
4
5 string timed_read(file f, int timeout) {
6         thread reader = fork func() { try { return fgets(f); } catch Thread::signal(int i) { return ""; } }();
7         thread killer = fork func() { sleep (timeout); Thread::send_signal(reader, 1); }();
8         poly v = Thread::join(reader);
9         if (is_string(v))
10                 return v;
11         return "";
12 }
13
14 void flush_input(file f) {
15         for (;;) {
16                 string s = timed_read(f, 100);
17                 if (s == "")
18                         break;
19         }
20 }
21
22 string[*] settings(file f) {
23         string[...] x = {};
24
25         flush_input(f);
26         fprintf (f, "c s\nv\n");
27         flush(f);
28         for (;;) {
29                 string l = File::fgets(f);
30                 x[dim(x)] = l;
31                 if (String::index(l, "software-version") == 0)
32                         break;
33         }
34         return x;
35 }
36
37 string[*] find_setting(string[*] s, string match) {
38         for (int i = 0; i < dim(s); i++)
39                 if (String::index(s[i], match) == 0)
40                         return String::split(s[i], " ");
41         return (string[*]) {};
42 }
43
44 int[*]
45 get_radio (file f) {
46         string[*] s = settings(f);
47
48         string[*] cal = find_setting(s, "Radio cal:");
49         string[*] freq = find_setting(s, "Frequency:");
50         if (dim(cal) == 0 || dim(freq) == 0)
51                 return (int[2]) { 0, 0 };
52
53         int cal_val = string_to_integer(cal[2]);
54         int freq_val = string_to_integer(freq[1]);
55         return (int[2]) { cal_val, freq_val };
56 }
57
58 void main () {
59         string  name = argv[1];
60         file    f = open(name, "r+");
61
62         int[*] vals = get_radio(f);
63         printf ("cal %d freq %f\n", vals[0], vals[1] / 1000);
64 }
65
66 main();