5 string timed_read(file f, int timeout) {
6 thread reader = fork func() {
9 } catch Thread::signal(int i) {
14 thread killer = fork func() {
17 Thread::send_signal(reader, 1);
18 } catch Thread::signal(int i) {
23 poly v = Thread::join(reader);
24 Thread::send_signal(killer, 1);
31 void flush_input(file f) {
33 string s = timed_read(f, 200);
39 string[*] settings(file f) {
43 fprintf (f, "c s\nv\n");
46 string l = File::fgets(f);
48 if (String::index(l, "software-version") == 0)
54 string[*] find_setting(string[*] s, string match) {
55 for (int i = 0; i < dim(s); i++)
56 if (String::index(s[i], match) == 0)
57 return String::split(s[i], " ");
58 return (string[*]) {};
64 fprintf(f, "E 1\nc a 0\n");
70 thread put = fork func() {
76 } catch Thread::signal(int i) {
86 s = s + String::new(c);
87 putchar(c); flush(stdout);
88 if (String::index(s, "press a key...") >= 0)
90 if (String::index(s, "Invalid") >= 0)
92 if (running && String::index(s, ">") >= 0)
99 Thread::send_signal(put, 1);
106 string name = argv[1];
107 file f = open(name, "r+");
110 string[*] s = settings(f);
111 string[*] ac = find_setting(s, "Accel cal");
112 printf ("Calibration value +1g %s -1g %s saved\n", ac[3], ac[5]);
115 printf ("Calibration failed\n");