class library to access fischertechnik interfaces via USB

Dependencies:   FatFileSystem mbed myBlueUSB neigbourhood rfcomm sdp

Committer:
networker
Date:
Mon Mar 11 08:04:37 2013 +0000
Revision:
1:4676e8b9b357
Parent:
0:7da612835693
first publication of this experimental class, just for sharing wip

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:7da612835693 1 //=============================================================================
networker 0:7da612835693 2 // |
networker 0:7da612835693 3 // Headerfile | robo_tx_fw.h
networker 0:7da612835693 4 // |
networker 0:7da612835693 5 // Description | Header file with definition of the software interface
networker 0:7da612835693 6 // | to the ROBO TX Controller firmware.
networker 0:7da612835693 7 // | Can be used for building C-programs which can run
networker 0:7da612835693 8 // | under control of the ROBO TX Controller firmware in
networker 0:7da612835693 9 // | download (local) mode or for building PC-programs which
networker 0:7da612835693 10 // | can communicate with the ROBO TX Controller firmware in
networker 0:7da612835693 11 // | online mode.
networker 0:7da612835693 12 // |
networker 0:7da612835693 13 //-----------------------------------------------------------------------------
networker 0:7da612835693 14 // Disclaimer - Exclusion of Liability
networker 0:7da612835693 15 //
networker 0:7da612835693 16 // This software is distributed in the hope that it will be useful,but WITHOUT
networker 0:7da612835693 17 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
networker 0:7da612835693 18 // FITNESS FOR A PARTICULAR PURPOSE. It can be used an modified by anyone
networker 0:7da612835693 19 // free of any license obligations or authoring rights.
networker 0:7da612835693 20 //=============================================================================
networker 0:7da612835693 21
networker 0:7da612835693 22 #ifndef __ROBO_TX_FW_H__
networker 0:7da612835693 23 #define __ROBO_TX_FW_H__
networker 0:7da612835693 24
networker 0:7da612835693 25
networker 0:7da612835693 26 #define N_CNT 4 // number of counters
networker 0:7da612835693 27 #define N_PWM_CHAN 8 // number of PWM channels
networker 0:7da612835693 28 #define N_MOTOR 4 // number of motors
networker 0:7da612835693 29 #define N_UNI 8 // number of universal inputs
networker 0:7da612835693 30
networker 0:7da612835693 31 // 5kOhm Range
networker 0:7da612835693 32 #define R_MIN 10 // [Ohm]
networker 0:7da612835693 33 #define R_MAX 4999 // [Ohm]
networker 0:7da612835693 34 #define R_OVR 5000 // [Ohm] overload
networker 0:7da612835693 35
networker 0:7da612835693 36 // 10V Range
networker 0:7da612835693 37 #define U_MIN 0 // [mV]
networker 0:7da612835693 38 #define U_MAX 9999 // [mV]
networker 0:7da612835693 39 #define U_OVR 10000 // [mV] overload
networker 0:7da612835693 40
networker 0:7da612835693 41 // Ultrasonic Sensor Range
networker 0:7da612835693 42 #define ULTRASONIC_MIN 2 // [cm]
networker 0:7da612835693 43 #define ULTRASONIC_MAX 1023 // [cm]
networker 0:7da612835693 44 #define ULTRASONIC_OVR 1024 // [cm] overload
networker 0:7da612835693 45 #define NO_ULTRASONIC 4096 // not present
networker 0:7da612835693 46
networker 0:7da612835693 47 // Length of strings
networker 0:7da612835693 48 #define DEV_NAME_LEN 16 // "ROBO TX-xxxxxxxx"
networker 0:7da612835693 49 #define BLUETOOTH_ADDR_LEN 17 // "xx:xx:xx:xx:xx:xx"
networker 0:7da612835693 50 #define DISPL_MSG_LEN_MAX 64 // max length of a pop-up display message
networker 0:7da612835693 51
networker 0:7da612835693 52
networker 0:7da612835693 53 // Identifiers of the Transfer Area parts
networker 0:7da612835693 54 enum ta_id_e
networker 0:7da612835693 55 {
networker 0:7da612835693 56 TA_LOCAL = 0, // Local part of Transfer Area. Corresponds to the device on which
networker 0:7da612835693 57 // program is currently running in download (local) mode or to the
networker 0:7da612835693 58 // remotely controlled device (seen from controlled device not from
networker 0:7da612835693 59 // controlling device) in online mode.
networker 0:7da612835693 60 TA_EXT_1, // Extension 1 part of Transfer Area
networker 0:7da612835693 61 TA_EXT_2, // Extension 2 part of Transfer Area
networker 0:7da612835693 62 TA_EXT_3, // Extension 3 part of Transfer Area
networker 0:7da612835693 63 TA_EXT_4, // Extension 4 part of Transfer Area
networker 0:7da612835693 64 TA_EXT_5, // Extension 5 part of Transfer Area
networker 0:7da612835693 65 TA_EXT_6, // Extension 6 part of Transfer Area
networker 0:7da612835693 66 TA_EXT_7, // Extension 7 part of Transfer Area
networker 0:7da612835693 67 TA_EXT_8, // Extension 8 part of Transfer Area
networker 0:7da612835693 68 TA_N_PARTS // Number of Transfer Area parts
networker 0:7da612835693 69 };
networker 0:7da612835693 70
networker 0:7da612835693 71 #define N_EXT_DEV (TA_N_PARTS - 1) // Number of extension devices = 8
networker 0:7da612835693 72
networker 0:7da612835693 73
networker 0:7da612835693 74 // Device functioning modes
networker 0:7da612835693 75 enum dev_mode_e
networker 0:7da612835693 76 {
networker 0:7da612835693 77 DEV_MODE_LOCAL = 0,
networker 0:7da612835693 78 DEV_MODE_ONLINE,
networker 0:7da612835693 79 DEV_MODE_INVALID
networker 0:7da612835693 80 };
networker 0:7da612835693 81
networker 0:7da612835693 82
networker 0:7da612835693 83 // State of connection to an extension device
networker 0:7da612835693 84 enum ext_dev_connect_state_e
networker 0:7da612835693 85 {
networker 0:7da612835693 86 EXT_DEV_OFFLINE = 0,
networker 0:7da612835693 87 EXT_DEV_ONLINE,
networker 0:7da612835693 88 EXT_DEV_INVALID
networker 0:7da612835693 89 };
networker 0:7da612835693 90
networker 0:7da612835693 91
networker 0:7da612835693 92 // Modes of universal inputs
networker 0:7da612835693 93 enum input_mode_e
networker 0:7da612835693 94 {
networker 0:7da612835693 95 MODE_U = 0,
networker 0:7da612835693 96 MODE_R = 1,
networker 0:7da612835693 97 MODE_ULTRASONIC = 3,
networker 0:7da612835693 98 MODE_INVALID
networker 0:7da612835693 99 };
networker 0:7da612835693 100
networker 0:7da612835693 101
networker 0:7da612835693 102 // Program states
networker 0:7da612835693 103 enum pgm_state_e
networker 0:7da612835693 104 {
networker 0:7da612835693 105 PGM_STATE_INVALID = 0,
networker 0:7da612835693 106 PGM_STATE_RUN,
networker 0:7da612835693 107 PGM_STATE_STOP
networker 0:7da612835693 108 };
networker 0:7da612835693 109
networker 0:7da612835693 110
networker 0:7da612835693 111 // Timer units for GetSystemTime hook function
networker 0:7da612835693 112 enum TimerUnit
networker 0:7da612835693 113 {
networker 0:7da612835693 114 TIMER_UNIT_INVALID = 0,
networker 0:7da612835693 115 TIMER_UNIT_SECONDS = 2,
networker 0:7da612835693 116 TIMER_UNIT_MILLISECONDS = 3,
networker 0:7da612835693 117 TIMER_UNIT_MICROSECONDS = 4
networker 0:7da612835693 118 };
networker 0:7da612835693 119
networker 0:7da612835693 120
networker 0:7da612835693 121 //=============================================================================
networker 0:7da612835693 122 // Structures for Transfer Area (TA)
networker 0:7da612835693 123 //=============================================================================
networker 0:7da612835693 124
networker 0:7da612835693 125
networker 0:7da612835693 126 // Program information, 8 bytes
networker 0:7da612835693 127 typedef struct
networker 0:7da612835693 128 {
networker 0:7da612835693 129 char * name; // name of a program with a full path, for example, "/ramdisk/Program_1"
networker 0:7da612835693 130 UINT8 state; // enum pgm_state_e
networker 0:7da612835693 131 char reserved[3];
networker 0:7da612835693 132 } PGM_INFO;
networker 0:7da612835693 133
networker 0:7da612835693 134
networker 0:7da612835693 135 // Display message, 68 bytes. Used to show pop-up message box on the boards display
networker 0:7da612835693 136 typedef struct
networker 0:7da612835693 137 {
networker 0:7da612835693 138 unsigned char id; // should be increased by 1 each time a new pop-up message is to be shown
networker 0:7da612835693 139 char text[DISPL_MSG_LEN_MAX + 1];
networker 0:7da612835693 140 char reserved[2];
networker 0:7da612835693 141 } DISPLAY_MSG;
networker 0:7da612835693 142
networker 0:7da612835693 143
networker 0:7da612835693 144 // Display frame, 8 bytes. Used to refresh boards display with a bitmap image frame
networker 0:7da612835693 145 typedef struct
networker 0:7da612835693 146 {
networker 0:7da612835693 147 unsigned char * frame; // contents of a frame as a 128x64 pixels bitmap
networker 0:7da612835693 148 UINT16 id; // should be increased by 1 each time a new display frame is to be shown
networker 0:7da612835693 149 BOOL16 is_pgm_master_of_display; // ++ if program wants to have control over display,
networker 0:7da612835693 150 // i.e. image frame is displayed over firmware menus;
networker 0:7da612835693 151 // -- if program wants to return control over display
networker 0:7da612835693 152 // to the firmware menus
networker 0:7da612835693 153 } DISPLAY_FRAME;
networker 0:7da612835693 154
networker 0:7da612835693 155
networker 0:7da612835693 156 // Version structure definition, 4 bytes
networker 0:7da612835693 157 typedef union
networker 0:7da612835693 158 {
networker 0:7da612835693 159 unsigned long abcd;
networker 0:7da612835693 160 struct
networker 0:7da612835693 161 {
networker 0:7da612835693 162 unsigned char a;
networker 0:7da612835693 163 unsigned char b;
networker 0:7da612835693 164 unsigned char c;
networker 0:7da612835693 165 unsigned char d;
networker 0:7da612835693 166 } part;
networker 0:7da612835693 167 } FT_VER;
networker 0:7da612835693 168
networker 0:7da612835693 169
networker 0:7da612835693 170 // Versions of hardware and firmware components, 16 bytes
networker 0:7da612835693 171 typedef struct
networker 0:7da612835693 172 {
networker 0:7da612835693 173 FT_VER hardware; // version of hardware (hardware.part.a = 'A' or 'B' or 'C')
networker 0:7da612835693 174 FT_VER firmware; // version of firmware ("V %d.%02d", firmware.part.c, firmware.part.d)
networker 0:7da612835693 175 FT_VER ta; // version of transfer area ("V %d.%02d", ta.part.c, ta.part.d)
networker 0:7da612835693 176 char reserved[4];
networker 0:7da612835693 177 } FT_VERSION;
networker 0:7da612835693 178
networker 0:7da612835693 179
networker 0:7da612835693 180 // Info structure, 64 bytes
networker 0:7da612835693 181 typedef struct
networker 0:7da612835693 182 {
networker 0:7da612835693 183 char device_name[DEV_NAME_LEN + 1];
networker 0:7da612835693 184 char bt_addr[BLUETOOTH_ADDR_LEN + 1];
networker 0:7da612835693 185 char reserved;
networker 0:7da612835693 186 unsigned long ta_start_addr;
networker 0:7da612835693 187 unsigned long pgm_area_start_addr;
networker 0:7da612835693 188 unsigned long pgm_area_size;
networker 0:7da612835693 189 FT_VERSION version;
networker 0:7da612835693 190 } TA_INFO;
networker 0:7da612835693 191
networker 0:7da612835693 192
networker 0:7da612835693 193 // State structure, 36 bytes
networker 0:7da612835693 194 typedef struct
networker 0:7da612835693 195 {
networker 0:7da612835693 196 // Used by local program
networker 0:7da612835693 197 BOOL8 pgm_initialized;
networker 0:7da612835693 198 char reserved_1[7];
networker 0:7da612835693 199
networker 0:7da612835693 200 // Public state info
networker 0:7da612835693 201 BOOL8 dev_mode; // enum dev_mode_e
networker 0:7da612835693 202 UCHAR8 id; // Should be increased by 1 each time something (except id fields)
networker 0:7da612835693 203 // is changed in this state structure
networker 0:7da612835693 204 UCHAR8 info_id; // Should be increased by 1 each time something is changed in info structure
networker 0:7da612835693 205 UCHAR8 config_id; // Should be increased by 1 each time something is changed in config structure
networker 0:7da612835693 206 BOOL8 ext_dev_connect_state[N_EXT_DEV]; // enum ext_dev_connect_state_e
networker 0:7da612835693 207 char reserved_2[8];
networker 0:7da612835693 208 PGM_INFO local_pgm; // Corresponds to the program currently being in the program memory
networker 0:7da612835693 209 } TA_STATE;
networker 0:7da612835693 210
networker 0:7da612835693 211
networker 0:7da612835693 212 // Universal inputs configuration, 4 bytes
networker 0:7da612835693 213 typedef struct
networker 0:7da612835693 214 {
networker 0:7da612835693 215 UINT8 mode; // enum input_mode_e
networker 0:7da612835693 216 BOOL8 digital; // FALSE = analog input, TRUE = digital input
networker 0:7da612835693 217 unsigned char reserved[2];
networker 0:7da612835693 218 } UNI_CONFIG;
networker 0:7da612835693 219
networker 0:7da612835693 220
networker 0:7da612835693 221 // Counter inputs configuration, 4 bytes
networker 0:7da612835693 222 typedef struct
networker 0:7da612835693 223 {
networker 0:7da612835693 224 UINT8 mode; // enum input_mode_e
networker 0:7da612835693 225 unsigned char reserved[3];
networker 0:7da612835693 226 } CNT_CONFIG;
networker 0:7da612835693 227
networker 0:7da612835693 228
networker 0:7da612835693 229 // Config structure, 88 bytes
networker 0:7da612835693 230 typedef struct
networker 0:7da612835693 231 {
networker 0:7da612835693 232 UINT8 pgm_state_req; // enum pgm_state_e
networker 0:7da612835693 233 char reserved_1[3];
networker 0:7da612835693 234 BOOL8 motor[N_MOTOR];
networker 0:7da612835693 235 UNI_CONFIG uni[N_UNI];
networker 0:7da612835693 236 CNT_CONFIG cnt[N_CNT];
networker 0:7da612835693 237 char reserved_2[32];
networker 0:7da612835693 238 } TA_CONFIG;
networker 0:7da612835693 239
networker 0:7da612835693 240
networker 0:7da612835693 241 // Input structure, 40 bytes
networker 0:7da612835693 242 typedef struct
networker 0:7da612835693 243 {
networker 0:7da612835693 244 INT16 uni[N_UNI];
networker 0:7da612835693 245 INT16 cnt_in[N_CNT];
networker 0:7da612835693 246 INT16 counter[N_CNT];
networker 0:7da612835693 247 // Number of milliseconds during which the left display button is being kept pressed
networker 0:7da612835693 248 INT16 display_button_left;
networker 0:7da612835693 249 // Number of milliseconds during which the right display button is being kept pressed
networker 0:7da612835693 250 INT16 display_button_right;
networker 0:7da612835693 251 // Set to 1 by motor control if target position is reached
networker 0:7da612835693 252 INT16 motor_pos_reached[N_MOTOR];
networker 0:7da612835693 253 } TA_INPUT;
networker 0:7da612835693 254
networker 0:7da612835693 255
networker 0:7da612835693 256 // Output structure, 36 bytes
networker 0:7da612835693 257 typedef struct
networker 0:7da612835693 258 {
networker 0:7da612835693 259 // Counter reset requests
networker 0:7da612835693 260 BOOL8 cnt_reset[N_CNT];
networker 0:7da612835693 261 // If not 0, synchronize this channel with the given channel (1:channel 0, ...)
networker 0:7da612835693 262 UINT8 master[N_MOTOR];
networker 0:7da612835693 263 // Selected motor PWM values
networker 0:7da612835693 264 INT16 duty[N_PWM_CHAN];
networker 0:7da612835693 265 // Selected distane (counter value) at which motor shall stop
networker 0:7da612835693 266 UINT16 distance[N_MOTOR];
networker 0:7da612835693 267 char reserved[4];
networker 0:7da612835693 268 } TA_OUTPUT;
networker 0:7da612835693 269
networker 0:7da612835693 270
networker 0:7da612835693 271 // Display structure, 76 bytes
networker 0:7da612835693 272 typedef struct
networker 0:7da612835693 273 {
networker 0:7da612835693 274 DISPLAY_MSG display_msg;
networker 0:7da612835693 275 DISPLAY_FRAME display_frame;
networker 0:7da612835693 276 } TA_DISPLAY;
networker 0:7da612835693 277
networker 0:7da612835693 278
networker 0:7da612835693 279 // Change structure (only for ftMscLib), 8 bytes
networker 0:7da612835693 280 typedef struct
networker 0:7da612835693 281 {
networker 0:7da612835693 282 char reserved_1[2];
networker 0:7da612835693 283 UINT8 ChangeStatus;
networker 0:7da612835693 284 UINT8 ChangeUni;
networker 0:7da612835693 285 UINT8 ChangeCntIn;
networker 0:7da612835693 286 UINT8 ChangeCounter;
networker 0:7da612835693 287 char reserved_2[2];
networker 0:7da612835693 288 } TA_CHANGE;
networker 0:7da612835693 289
networker 0:7da612835693 290
networker 0:7da612835693 291 // 16-bit timers, 12 bytes
networker 0:7da612835693 292 typedef struct
networker 0:7da612835693 293 {
networker 0:7da612835693 294 UINT16 Timer1ms;
networker 0:7da612835693 295 UINT16 Timer10ms;
networker 0:7da612835693 296 UINT16 Timer100ms;
networker 0:7da612835693 297 UINT16 Timer1s;
networker 0:7da612835693 298 UINT16 Timer10s;
networker 0:7da612835693 299 UINT16 Timer1min;
networker 0:7da612835693 300 } TA_TIMER;
networker 0:7da612835693 301
networker 0:7da612835693 302
networker 0:7da612835693 303 // Hook table with pointers to the firmware functions,
networker 0:7da612835693 304 // that can be called by local program, 4 bytes
networker 0:7da612835693 305 typedef struct
networker 0:7da612835693 306 {
networker 0:7da612835693 307 INT32 (*IsRunAllowed) (void);
networker 0:7da612835693 308 UINT32 (*GetSystemTime)(enum TimerUnit unit);
networker 0:7da612835693 309 } TA_HOOK_TABLE;
networker 0:7da612835693 310
networker 0:7da612835693 311
networker 0:7da612835693 312
networker 0:7da612835693 313 // ============================================================================
networker 0:7da612835693 314 // Transfer Area (TA) of ROBO TX Controller (one part of TA_N_PARTS)
networker 0:7da612835693 315 // ============================================================================
networker 0:7da612835693 316 #define RESERVED_1_SIZE 4
networker 0:7da612835693 317 #define RESERVED_2_SIZE 28
networker 0:7da612835693 318 #define RESERVED_3_SIZE \
networker 0:7da612835693 319 (512 - ( \
networker 0:7da612835693 320 sizeof(TA_INFO) + \
networker 0:7da612835693 321 sizeof(TA_STATE) + \
networker 0:7da612835693 322 sizeof(TA_CONFIG) + \
networker 0:7da612835693 323 sizeof(TA_INPUT) + \
networker 0:7da612835693 324 sizeof(TA_OUTPUT) + \
networker 0:7da612835693 325 sizeof(TA_DISPLAY) + \
networker 0:7da612835693 326 RESERVED_1_SIZE + \
networker 0:7da612835693 327 sizeof(TA_CHANGE) + \
networker 0:7da612835693 328 sizeof(TA_TIMER) + \
networker 0:7da612835693 329 RESERVED_2_SIZE + \
networker 0:7da612835693 330 sizeof(TA_HOOK_TABLE) \
networker 0:7da612835693 331 ))
networker 0:7da612835693 332
networker 0:7da612835693 333
networker 0:7da612835693 334 typedef struct
networker 0:7da612835693 335 {
networker 0:7da612835693 336 TA_INFO info; // info structure
networker 0:7da612835693 337 TA_STATE state; // state structure
networker 0:7da612835693 338 TA_CONFIG config; // config structure
networker 0:7da612835693 339 TA_INPUT input; // input structure
networker 0:7da612835693 340 TA_OUTPUT output; // output structure
networker 0:7da612835693 341 TA_DISPLAY display; // display structure
networker 0:7da612835693 342
networker 0:7da612835693 343 char reserved_1[RESERVED_1_SIZE];
networker 0:7da612835693 344
networker 0:7da612835693 345 TA_CHANGE change; // change structure
networker 0:7da612835693 346 TA_TIMER timer; // 16-bit timers
networker 0:7da612835693 347
networker 0:7da612835693 348 char reserved_2[RESERVED_2_SIZE];
networker 0:7da612835693 349
networker 0:7da612835693 350 TA_HOOK_TABLE hook_table; // hook table with functions pointers
networker 0:7da612835693 351
networker 0:7da612835693 352 char reserved_3[RESERVED_3_SIZE];
networker 0:7da612835693 353 } TA;
networker 0:7da612835693 354
networker 0:7da612835693 355
networker 0:7da612835693 356 #endif // __ROBO_TX_FW_H__