chiark / gitweb /
do not show plat edges as rails
[trains.git] / hostside / output.c
1 /*
2  * transmissions to clients
3  */
4
5 #include <string.h>
6 #include <stdarg.h>
7
8 #include "hostside.h"
9 #include "auproto-pic.h"
10
11 #define FOR_OOS(s) do{                          \
12     Client *cl, *next_cl;                       \
13     for (cl= clients.head;                      \
14          cl;                                    \
15          cl= next_cl) {                         \
16       OutBufferChain *ch= &cl->ch;              \
17       next_cl= cl->next;                        \
18       if (!(sel & cl->sel)) continue;           \
19       s;                                        \
20     }                                           \
21   }while(0)
22
23 void oovprintf(Selector sel, const char *fmt, va_list al) {
24   FOR_OOS( ovprintf(ch, fmt, al) );
25 }
26
27 void ooprintf(Selector sel, const char *fmt, ...)
28   { va_list al; va_start(al,fmt); oovprintf(sel,fmt,al); va_end(al); }
29
30 void oowrite(Selector sel, const char *data, int l) {
31   FOR_OOS( owrite(ch, data, l) );
32 }
33
34 void output_hex(Selector sel, const char *word,
35                 const Byte *command, int length) {
36   ooprintf(sel, "%s", word);
37   while (length) {
38     ooprintf(sel, " %02x", *command++);
39     length--;
40   }
41   ooprintf(sel, "\n");
42 }
43
44 void serial_transmit(const PicInsn *pi) {
45   const PicInsnInfo *pii;
46   unsigned val;
47
48   pii= pi->l > 0 ? lookup_byopcode(pi->d[0], pic_command_infos) : 0;
49
50   if (pii) {
51     val= pi->d[0];
52     if (pii->argbits <= 6) {
53       if (pi->l != 1) pii= 0;
54     } else {
55       if (pi->l == 2) { val <<= 8; val |= pi->d[1]; }
56       else pii= 0;
57     }
58   }
59
60   if (!pii)
61     ooprintf(sel_picio, "picio out unknown\n");
62   else if (!pii->argbits)
63     ooprintf(sel_picio, "picio out %s\n", pii->name);
64   else
65     ooprintf(sel_picio, "picio out %s %u\n", pii->name,
66              val & ((1u << pii->argbits) - 1));
67
68   output_hex(sel_picioh, "picioh out", pi->d, pi->l);
69   serial_transmit_now(pi->d, pi->l);
70 }