char *opt_tty = argv[1];
int opt_device = atoi(argv[2]);
int opt_sync = argv[3] && !strcmp(argv[3], "sync") ?
- MSG_VALID_SYNC : 0;
+ MSG_CTL_VALID_SYNC : 0;
+ int opt_relay = opt_device == 2;
// Lookup current wall-clock time
struct timespec ts;
init_msg_t body = {};
// Set message header
- head.header = MSG_HEADER;
- head.msgid = MSG_ID_INIT;
- head.length = sizeof(init_msg_t);
- head.cksum = 0; // todo
+ head.header = MSG_HEADER;
+ head.msgid = MSG_ID_INIT;
+ head.length = sizeof(init_msg_t);
+ head.cksum = 0; // todo
// Set valid flags
- body.valid = MSG_VALID_DEVICE
- | MSG_VALID_START
- | MSG_VALID_PERIOD
- | MSG_VALID_WORLD
- | opt_sync;
+ body.control = MSG_CTL_VALID_DEVICE
+ | MSG_CTL_VALID_START
+ | MSG_CTL_VALID_PERIOD
+ | MSG_CTL_VALID_WORLD
+ | opt_relay
+ | opt_sync;
// Set message body
body.device = opt_device;
* Communication functions *
***************************/
-static uint32_t comm_device_id = 0;
+static int comm_device_id = 0;
+static int comm_relay_mode = 0;
const uint64_t comm_sync_delay = NSEC_PER_SEC / 100;
static uint64_t comm_sync_due = 0;
// Debug output
sirq_printf("initialize: %s %s %s %s %s\r\n",
- body->valid & MSG_VALID_DEVICE ? "DEV" : "dev",
- body->valid & MSG_VALID_START ? "START" : "start",
- body->valid & MSG_VALID_PERIOD ? "PERIOD" : "period",
- body->valid & MSG_VALID_WORLD ? "WORLD" : "world",
- body->valid & MSG_VALID_SYNC ? "SYNC" : "sync");
+ body->control & MSG_CTL_VALID_DEVICE ? "DEV" : "dev",
+ body->control & MSG_CTL_VALID_START ? "START" : "start",
+ body->control & MSG_CTL_VALID_PERIOD ? "PERIOD" : "period",
+ body->control & MSG_CTL_VALID_WORLD ? "WORLD" : "world",
+ body->control & MSG_CTL_VALID_SYNC ? "SYNC" : "sync");
sirq_printf(" dev -- %d\r\n", body->device);
time_printf(" start ", comm_read_time(body->start));
time_printf(" period", comm_read_time(body->period));
time_printf(" world ", comm_read_time(body->world));
// Validate message parts and initialize
- if (body->valid & MSG_VALID_DEVICE)
+ if (body->control & MSG_CTL_VALID_DEVICE)
comm_device_id = body->device;
- if (body->valid & MSG_VALID_START ||
- body->valid & MSG_VALID_PERIOD) {
+ if (body->control & MSG_CTL_VALID_START ||
+ body->control & MSG_CTL_VALID_PERIOD) {
uint64_t start = comm_read_time(body->start);
uint64_t period = comm_read_time(body->period);
emit_enable(start, period);
}
- if (body->valid & MSG_VALID_WORLD) {
+ if (body->control & MSG_CTL_VALID_WORLD) {
uint64_t world = comm_read_time(body->world);
uint64_t local = tdma_time();
time_ext_init(local, world);
}
- if (body->valid & MSG_VALID_SYNC)
+ if (body->control & MSG_CTL_RELAY_MODE)
+ comm_relay_mode = 1;
+ else
+ comm_relay_mode = 0;
+
+ if (body->control & MSG_CTL_VALID_SYNC)
comm_sync_due = tdma_time() + comm_sync_delay;
}
*/
void comm_handle_event(header_t *head, event_msg_t *body)
{
- // Relay event from mbed to bbb
- if (comm_device_id == 1) {
- sirq_write(comm_sirq_bbb, head, sizeof(*head));
- sirq_write(comm_sirq_bbb, body, sizeof(*body));
- }
+ // Relay events from other mbeds
+ sirq_write(comm_sirq_bbb, head, sizeof(*head));
+ sirq_write(comm_sirq_bbb, body, sizeof(*body));
}
* Message Definitions *
***********************/
-#define MSG_HEADER 0x1234
+#define MSG_HEADER 0x1234
-#define MSG_VALID_DEVICE 0x0001 // device id is valid
-#define MSG_VALID_WORLD 0x0002 // world time is valid
-#define MSG_VALID_START 0x0004 // start time is valid
-#define MSG_VALID_PERIOD 0x0008 // period is valid
-#define MSG_VALID_SYNC 0x8000 // begin time sync
+#define MSG_CTL_VALID_DEVICE 0x0001 // device id is valid
+#define MSG_CTL_VALID_WORLD 0x0002 // world time is valid
+#define MSG_CTL_VALID_START 0x0004 // start time is valid
+#define MSG_CTL_VALID_PERIOD 0x0008 // period is valid
+#define MSG_CTL_RELAY_MODE 0x4000 // relay output messages
+#define MSG_CTL_VALID_SYNC 0x8000 // begin time sync
#pragma pack(1)
} header_t;
typedef struct {
- uint16_t valid; // Message valid bits
+ uint16_t control; // Message control bits
uint16_t device; // Device ID to use
ntime_t world; // World time (since 1970)
ntime_t start; // Transmit start time