#ifndef TELEMETRIE_H_ #define TELEMETRIE_H_ /* * 0: this is a request (host -> board) * 1: this is a reply (board -> host) */ #define TDC_DIR 0x80 #define TDC_REPLY TDC_DIR /* * TDC_DIR = 0: destination address * TDC_DIR = 1: source address */ #define TDC_ADDRMASK 0x70 #define TDC_ADDR0 0x00 // host (dynamic!, sends to interface of last hello) #define TDC_ADDR1 0x10 // flightcontrol #define TDC_ADDR2 0x20 // missioncontrol #define TDC_ADDR3 0x30 // videocontrol #define TDC_ADDR4 0x40 #define TDC_ADDR5 0x50 #define TDC_ADDR6 0x60 #define TDC_ADDR7 0x70 #define TDC_OPCODEMASK 0x0F #define TDC_HELLO 0x00 // sets the path/interface to the host, reply is a info string #define TDC_GETVARS 0x01 // request variable names, many replies #define TDC_GETVALUE 0x02 // get one value, one reply #define TDC_SETVALUE 0x03 // set one value, no reply #define TDC_REQVALUES 0x04 // registers a periodic update, timed replies #define TDC_TERMINAL 0x05 // stdout data #define TDC_USERDATA 0x0F // user-defined data e.g. between boards struct tdc_pkt_header { uint8_t cmd; // TDC_* uint8_t size; // bytes after size } __attribute__ ((packed)); struct tdc_hello_reply { uint8_t cmd; uint8_t size; char name[32]; // name of device, version string } __attribute__ ((packed)); struct tdc_getvars_reply { uint8_t cmd; uint8_t size; uint8_t id; // variable ID (max 256 vars / board) uint32_t flags; // variable parameters (type, size, ro/rw) char name[0]; // variable name, excluding '\0' } __attribute__ ((packed)); struct tdc_getvalue_request { uint8_t cmd; uint8_t size; uint8_t id; // variable ID (max 256 vars / board) } __attribute__ ((packed)); struct tdc_getvalue_reply { uint8_t cmd; uint8_t size; uint8_t id; // variable ID (max 256 vars / board) uint8_t data[0]; // variable data 1-8 bytes } __attribute__ ((packed)); struct tdc_setvalue_request { uint8_t cmd; uint8_t size; uint8_t id; // variable ID (max 256 vars / board) uint8_t data[0]; // variable data 1-8 bytes } __attribute__ ((packed)); struct tdc_reqvalues_request { uint8_t cmd; uint8_t size; uint16_t interval; // interval in ms uint32_t varmap[8]; // bitmap of variables (32 * 8 = 256) } __attribute__ ((packed)); struct tdc_reqvalues_reply { uint8_t cmd; uint8_t size; uint32_t timestamp; // internal jiffie count uint8_t cnt; // number of variables } __attribute__ ((packed)); struct tdc_value { void *data; const char *name; uint32_t flags; }; #define TDC_SIZEMASK 0x0F #define TDC_UNSIGNED 0x00 #define TDC_SIGNED 0x10 #define TDC_FP 0x20 #define TDC_VALUE(var, desc, type, flags) \ type * tdc_check_##var(void) { return (&var); } \ static struct tdc_value __attribute__((used, section(".tdc_value"))) \ tdc_value_##var = { &var, desc, sizeof(type) | flags }; \ tdc_value_##var = tdc_value_##var; #define TDC_UINT8(var, desc) TDC_VALUE(var, desc, uint8_t, TDC_UNSIGNED) #define TDC_UINT16(var, desc) TDC_VALUE(var, desc, uint16_t, TDC_UNSIGNED) #define TDC_UINT32(var, desc) TDC_VALUE(var, desc, uint32_t, TDC_UNSIGNED) #define TDC_UINT64(var, desc) TDC_VALUE(var, desc, uint64_t, TDC_UNSIGNED) #define TDC_INT8(var, desc) TDC_VALUE(var, desc, int8_t, TDC_SIGNED) #define TDC_INT16(var, desc) TDC_VALUE(var, desc, int16_t, TDC_SIGNED) #define TDC_INT32(var, desc) TDC_VALUE(var, desc, int32_t, TDC_SIGNED) #define TDC_INT64(var, desc) TDC_VALUE(var, desc, int64_t, TDC_SIGNED) #define TDC_FLOAT(var, desc) TDC_VALUE(var, desc, float, TDC_FP) #define TDC_DOUBLE(var, desc) TDC_VALUE(var, desc, double, TDC_FP) #endif /*TELEMETRIE_H_*/