2 * Copyright © 2023 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22 #include "test-frame.c"
24 #define BIG_FONT BitstreamVeraSans_Roman_58_font
25 #define VOLT_FONT BitstreamVeraSans_Roman_58_font
26 #define SMALL_FONT BitstreamVeraSans_Roman_12_font
27 #define TINY_FONT BitstreamVeraSans_Roman_12_font
28 #define LOGO_FONT BenguiatGothicStd_Bold_26_font
30 #define LABEL_Y (int16_t) (SMALL_FONT.ascent)
31 #define VALUE_Y (int16_t) (LABEL_Y + BIG_FONT.ascent + 3)
34 #define BOX_LABEL_X 30
35 #define VOLT_LABEL_X 25
36 #define RSSI_LABEL_X 15
37 #define PAD_LABEL_X 95
38 #define SEP_X (PAD_X - 10)
39 #define SCAN_X (WIDTH - 100) / 2
43 #define FOUND_WIDTH 21
44 #define MAX_VALID (WIDTH / FOUND_WIDTH)
46 static int box_number = 1;
47 static int pad_number = 1;
48 static int do_polys = 1;
49 static int scan_number = 0;
51 static const struct ao_coord trek[] = {
55 { .x = 120, .y = 40 },
58 #define NCOORD_TREK (sizeof(trek)/sizeof(trek[0]))
60 static const struct ao_coord donut[] = {
73 #define NCOORD_DONUT (sizeof(donut)/sizeof(donut[0]))
75 static const struct ao_coord bowtie[] = {
82 #define NCOORD_BOWTIE (sizeof(bowtie)/sizeof(bowtie[0]))
84 static const struct ao_transform logo_transform = {
85 .x_scale = 48, .x_off = 0,
86 .y_scale = 48, .y_off = 0,
89 static const struct ao_transform bowtie_transform = {
90 .x_scale = 1, .x_off = 50,
91 .y_scale = 1, .y_off = 20,
94 static const float pad_volts = 12.3f;
95 static const float lco_volts = 4.1f;
96 static const int rssi = -30;
98 static int boxes[] = { 1, 2, 3, 5, 8, 11, 13, 17, 19, 23, 29, 31, 37, 62, 97 };
100 static int max_box = 97;
102 #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
110 for (i = 0; i < ARRAYSIZE(boxes); i++)
119 for (int n = box_number + 1; n <= max_box; n++)
130 for (int n = box_number - 1; n >= 0; n--)
135 box_number = max_box;
138 static bool redraw_all = true;
140 void HandleExpose(Display *dpy, Window win, GC gc)
149 ao_rect(&fb, 0, 0, WIDTH, HEIGHT, 0xffffffff, AO_COPY);
152 current_timeout = TIMEOUT;
158 ao_logo(&fb, &logo_transform, &LOGO_FONT, 0x00000000, AO_COPY);
160 ao_rect(&fb, 0, SCAN_Y, WIDTH, HEIGHT-SCAN_Y, 0xffffffff, AO_COPY);
162 ao_rect(&fb, SCAN_X, SCAN_Y, (int16_t) scan_number, SCAN_HEIGHT, 0x00000000, AO_COPY);
166 for (i = scan_number; i > 1; i--) {
175 for (; i <= scan_number; i++) {
177 sprintf(str, "%02d%s", i, i == last_box ? "" : ",");
178 ao_text(&fb, &TINY_FONT, 0 + FOUND_WIDTH * b, FOUND_Y, str, 0x00000000, AO_COPY);
186 ao_poly(&fb, trek, NCOORD_TREK, NULL, 0x00000000, AO_COPY);
187 ao_poly(&fb, donut, NCOORD_DONUT, NULL, 0x00000000, AO_COPY);
190 ao_poly(&fb, bowtie, NCOORD_BOWTIE, &bowtie_transform, 0x00000000, AO_COPY);
194 switch (box_number) {
196 sprintf(str, "%4.1f", lco_volts);
197 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, 0x00000000, AO_COPY);
198 ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "LCO Battery", 0x00000000, AO_COPY);
201 switch (pad_number) {
203 sprintf(str, "%4.1f", pad_volts);
204 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, 0x00000000, AO_COPY);
205 ao_text(&fb, &SMALL_FONT, VOLT_LABEL_X, LABEL_Y, "Pad Battery", 0x00000000, AO_COPY);
208 sprintf(str, "%4d", rssi);
209 ao_text(&fb, &VOLT_FONT, BOX_X, VALUE_Y, str, 0x00000000, AO_COPY);
210 ao_text(&fb, &SMALL_FONT, RSSI_LABEL_X, LABEL_Y, "Signal Strength", 0x00000000, AO_COPY);
213 sprintf(str, "%02d", box_number);
214 ao_text(&fb, &BIG_FONT, BOX_X, VALUE_Y, str, 0x00000000, AO_COPY);
215 ao_text(&fb, &SMALL_FONT, BOX_LABEL_X, LABEL_Y, "Box", 0x00000000, AO_COPY);
217 sprintf(str, "%d", pad_number);
218 ao_text(&fb, &BIG_FONT, PAD_X, VALUE_Y, str, 0x00000000, AO_COPY);
219 ao_text(&fb, &SMALL_FONT, PAD_LABEL_X, LABEL_Y, "Pad", 0x00000000, AO_COPY);
221 ao_rect(&fb, SEP_X, 0, 2, HEIGHT, 0x00000000, AO_COPY);
228 DoDisplay(dpy, win, gc);
232 HandleKeyPress(Display *dpy, Window win, GC gc, XEvent *ev)
237 if (XLookupString ((XKeyEvent *) ev, string, sizeof (string), 0, 0) >= 1) {
242 if (box_number != 0) {
249 if (box_number != 0) {
276 if (scan_number < 99)
286 HandleExpose(dpy, win, gc);
291 HandleKeyRelease(Display *dpy, Window win, GC gc, XEvent *ev)
300 HandleTimeout(Display *dpy, Window win, GC gc)
303 if (scan_number < 99)
307 box_number = boxes[0];
311 HandleExpose(dpy, win, gc);