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
|
#ifndef BOARD_H
#define BOARD_H
#include <stdbool.h>
// board spec from WDF rules
#define DIAMETER 451.0
#define WIRE_WIDTH 1.56
#define INNER_DIAMETER_BULL 12.7
#define INNER_DIAMETER_25 31.8
#define DOUBLE_OUTER_EDGE 170.0
#define TREBLE_OUTER_EDGE 107.4
#define DOUBLE_INSIDE_WIDTH 8.0
#define TREBLE_INSIDE_WIDTH 8.0
#define SEGMENT_MAX_LEN 5
#define FOREACH_SECTOR(M) \
M(1) M(2) M(3) M(4) M(5) M(6) M(7) M(8) M(9) M(10) \
M(11) M(12) M(13) M(14) M(15) M(16) M(17) M(18) M(19) M(20)
#define GEN_SECTOR_STR(X) #X,
#define GEN_SECTOR_STR_D(X) "D" #X,
#define GEN_SECTOR_STR_T(X) "T" #X,
// distance from centre to apex of outer wire
// must be ordered outwards from centre
#define FOREACH_RING(M) \
M(BULL, INNER_DIAMETER_BULL/2 + WIRE_WIDTH/2) \
M(25, INNER_DIAMETER_25/2 + WIRE_WIDTH/2) \
M(SMALL, TREBLE_OUTER_EDGE - WIRE_WIDTH - TREBLE_INSIDE_WIDTH - \
WIRE_WIDTH/2) \
M(TREBLE, TREBLE_OUTER_EDGE - WIRE_WIDTH/2) \
M(BIG, DOUBLE_OUTER_EDGE - WIRE_WIDTH - DOUBLE_INSIDE_WIDTH - \
WIRE_WIDTH/2) \
M(DOUBLE, DOUBLE_OUTER_EDGE - WIRE_WIDTH/2)
#define GEN_RING_ENUM(X, D) R_ ## X,
#define GEN_RING_STR(X, D) #X,
#define GEN_RING_OUTER_DIST(X, D) D,
enum ring {
FOREACH_RING(GEN_RING_ENUM)
R_OUT
};
struct segment {
enum ring ring;
int sector;
};
extern int SECTORS[];
extern double OUTER_DISTS[];
void init_board();
struct ccoords {
double x, y;
};
struct pcoords {
double a, r;
};
struct segment get_segment(struct pcoords c);
const char *segment_name(struct segment seg);
int segment_points(struct segment seg);
bool segment_is_double(struct segment seg);
struct pcoords segment_centre(struct segment seg);
struct segment segment_from_name(char *name);
#endif
|