00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __HDMMUX_H__
00013 #define __HDMMUX_H__
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #pragma systemFile
00043
00044 #ifndef __COMMON_H__
00045 #include "common.h"
00046 #endif
00047
00048 #ifndef __MMUX_H__
00049 #include "MMUX-common.h"
00050 #endif
00051
00052
00053 #define HDMMUX_I2C_ADDR 0x02
00054
00055
00056 #define HDMMUX_CMD_MOTOR 0x01
00057 #define HDMMUX_CMD_ADDRCHNG 0x02
00058 #define HDMMUX_CMD_RST_TACH_A 0x03
00059 #define HDMMUX_CMD_RST_TACH_B 0x04
00060 #define HDMMUX_CMD_RST_TACH_C 0x05
00061
00062
00063 #define HDMMUX_MOTOR_A 0x01
00064 #define HDMMUX_MOTOR_B 0x02
00065 #define HDMMUX_MOTOR_C 0x03
00066
00067 #define HDMMUX_MOTOR_OTHER 0x04
00068 #define HDMMUX_MOTOR_RIGHT 0x02
00069 #define HDMMUX_MOTOR_LEFT 0x00
00070
00071
00072 #define HDMMUX_ROT_FORWARD (0x01 << 6)
00073 #define HDMMUX_ROT_REVERSE (0x02 << 6)
00074 #define HDMMUX_ROT_STOP (0x03 << 6)
00075
00076 #define HDMMUX_ROT_CONSTSPEED (0x01 << 4)
00077 #define HDMMUX_ROT_RAMPUP (0x02 << 4)
00078 #define HDMMUX_ROT_RAMPDOWN (0x03 << 4)
00079
00080 #define HDMMUX_ROT_UNLIMITED (0x00 << 2)
00081 #define HDMMUX_ROT_DEGREES (0x01 << 2)
00082 #define HDMMUX_ROT_ROTATIONS (0x02 << 2)
00083 #define HDMMUX_ROT_SECONDS (0x03 << 2)
00084
00085 #define HDMMUX_ROT_POWERCONTROL (0x01 << 1)
00086
00087 #define HDMMUX_ROT_BRAKE 0x01
00088 #define HDMMUX_ROT_FLOAT 0x00
00089
00090 tByteArray HDMMUX_I2CRequest;
00091 tByteArray HDMMUX_I2CReply;
00092
00093
00094 void HDMMUXinit();
00095 bool HDMMUXreadStatus(tSensors link, byte &motorStatus, long &tachoA, long &tachoB, long &tachoC);
00096 bool HDMMUXsendCommand(tSensors link, ubyte mode, ubyte channel, ubyte rotparams, long duration, byte power, byte steering);
00097 bool HDMMotor(tMUXmotor muxmotor, byte power);
00098 bool HDMotorStop(tMUXmotor muxmotor);
00099 bool HDMotorStop(tMUXmotor muxmotor, bool brake);
00100 void HDMMotorSetRotationTarget(tMUXmotor muxmotor, float rottarget);
00101 void HDMMotorSetTimeTarget(tMUXmotor muxmotor, float timetarget);
00102 void HDMMotorSetEncoderTarget(tMUXmotor muxmotor, long enctarget);
00103 long HDMMotorEncoder(tMUXmotor muxmotor);
00104 bool HDMMotorEncoderReset(tMUXmotor muxmotor);
00105 bool HDMMotorEncoderResetAll(tSensors link);
00106 bool HDMMotorBusy(tMUXmotor muxmotor);
00107 void HDMMotorSetBrake(tMUXmotor muxmotor);
00108 void HDMMotorSetFloat(tMUXmotor muxmotor);
00109 void HDMMotorSetSpeedCtrl(tMUXmotor muxmotor, bool constspeed);
00110 void HDMMotorSetRamping(tMUXmotor muxmotor, ubyte ramping);
00111
00112
00113
00114
00115 void HDMMUXinit(){
00116 for (int i = 0; i < 4; i++) {
00117 memset(mmuxData[i].runToTarget[0], false, 4);
00118 memset(mmuxData[i].brake[0], true, 4);
00119 memset(mmuxData[i].pidcontrol[0], true, 4);
00120 memset(mmuxData[i].target[0], 0, 4*4);
00121 memset(mmuxData[i].ramping[0], HDMMUX_ROT_CONSTSPEED, 4);
00122 memset(mmuxData[i].targetUnit[0], HDMMUX_ROT_UNLIMITED, 4);
00123 mmuxData[i].initialised = true;
00124 }
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 bool HDMMUXreadStatus(tSensors link, byte &motorStatus, long &tachoA, long &tachoB, long &tachoC) {
00144 memset(HDMMUX_I2CRequest, 0, sizeof(tByteArray));
00145
00146 HDMMUX_I2CRequest[0] = 10;
00147 HDMMUX_I2CRequest[1] = HDMMUX_I2C_ADDR;
00148
00149 if (!writeI2C(link, HDMMUX_I2CRequest, 13))
00150 return false;
00151
00152 if (!readI2C(link, HDMMUX_I2CReply, 13))
00153 return false;
00154
00155 motorStatus = HDMMUX_I2CReply[0];
00156
00157
00158 tachoA = (HDMMUX_I2CReply[1] << 24) + (HDMMUX_I2CReply[2] << 16) + (HDMMUX_I2CReply[3] << 8) + (HDMMUX_I2CReply[4] << 0);
00159 tachoB = (HDMMUX_I2CReply[5] << 24) + (HDMMUX_I2CReply[6] << 16) + (HDMMUX_I2CReply[7] << 8) + (HDMMUX_I2CReply[8] << 0);
00160 tachoC = (HDMMUX_I2CReply[9] << 24) + (HDMMUX_I2CReply[10] << 16) + (HDMMUX_I2CReply[11] << 8) + (HDMMUX_I2CReply[12] << 0);
00161
00162 return true;
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 bool HDMMUXsendCommand(tSensors link, ubyte mode, ubyte channel, ubyte rotparams, long duration, byte power, byte steering) {
00180 memset(HDMMUX_I2CRequest, 0, sizeof(tByteArray));
00181
00182 HDMMUX_I2CRequest[0] = 10;
00183 HDMMUX_I2CRequest[1] = HDMMUX_I2C_ADDR;
00184 HDMMUX_I2CRequest[2] = mode;
00185 HDMMUX_I2CRequest[3] = channel;
00186 HDMMUX_I2CRequest[4] = rotparams;
00187 HDMMUX_I2CRequest[5] = (duration >> 24) & 0xFF;
00188 HDMMUX_I2CRequest[6] = (duration >> 16) & 0xFF;
00189 HDMMUX_I2CRequest[7] = (duration >> 8) & 0xFF;
00190 HDMMUX_I2CRequest[8] = (duration >> 0) & 0xFF;
00191 HDMMUX_I2CRequest[9] = power;
00192 HDMMUX_I2CRequest[10] = (byte)(steering & 0xFF);
00193
00194 return writeI2C(link, HDMMUX_I2CRequest, 0);
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 bool HDMMotor(tMUXmotor muxmotor, byte power) {
00206 ubyte command = 0;
00207 bool retval = true;
00208 long target = mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)];
00209
00210 command |= (mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)]) ? HDMMUX_ROT_BRAKE : HDMMUX_ROT_FLOAT;
00211 command |= mmuxData[SPORT(muxmotor)].ramping[MPORT(muxmotor)];
00212 command |= (mmuxData[SPORT(muxmotor)].pidcontrol[MPORT(muxmotor)]) ? HDMMUX_ROT_POWERCONTROL : 0;
00213 command |= (power > 0) ? HDMMUX_ROT_FORWARD : HDMMUX_ROT_REVERSE;
00214 command |= mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)];
00215
00216 retval = HDMMUXsendCommand((tSensors)SPORT(muxmotor), HDMMUX_CMD_MOTOR, (ubyte)MPORT(muxmotor) + 1, command, target, abs(power), 0);
00217
00218
00219 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_UNLIMITED;
00220 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = 0;
00221
00222 return retval;
00223 }
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 bool HDMotorStop(tMUXmotor muxmotor) {
00234 ubyte command = 0;
00235 bool retval = true;
00236
00237 command |= (mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)]) ? HDMMUX_ROT_BRAKE : HDMMUX_ROT_FLOAT;
00238 command |= HDMMUX_ROT_STOP;
00239
00240 retval = HDMMUXsendCommand((tSensors)SPORT(muxmotor), HDMMUX_CMD_MOTOR, (ubyte)MPORT(muxmotor) + 1, command, 0, 0, 0);
00241
00242
00243 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_UNLIMITED;
00244 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = 0;
00245
00246 return retval;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 bool HDMotorStop(tMUXmotor muxmotor, bool brake) {
00258 ubyte command = 0;
00259 bool retval = true;
00260
00261 command |= (brake) ? HDMMUX_ROT_BRAKE : HDMMUX_ROT_FLOAT;
00262 command |= HDMMUX_ROT_STOP;
00263
00264 retval = HDMMUXsendCommand((tSensors)SPORT(muxmotor), HDMMUX_CMD_MOTOR, (ubyte)MPORT(muxmotor) + 1, command, 0, 0, 0);
00265
00266
00267 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_UNLIMITED;
00268 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = 0;
00269
00270 return retval;
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 void HDMMotorSetRotationTarget(tMUXmotor muxmotor, float rottarget) {
00283 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = (long)(rottarget * 100);
00284 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_ROTATIONS;
00285 }
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296 void HDMMotorSetTimeTarget(tMUXmotor muxmotor, float timetarget) {
00297 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = (long)(timetarget * 100);
00298 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_SECONDS;
00299 }
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 void HDMMotorSetEncoderTarget(tMUXmotor muxmotor, long enctarget) {
00310 mmuxData[SPORT(muxmotor)].target[MPORT(muxmotor)] = enctarget;
00311 mmuxData[SPORT(muxmotor)].targetUnit[MPORT(muxmotor)] = HDMMUX_ROT_DEGREES;
00312 }
00313
00314
00315
00316
00317
00318
00319
00320
00321 long HDMMotorEncoder(tMUXmotor muxmotor) {
00322 long encA = 0;
00323 long encB = 0;
00324 long encC = 0;
00325 byte dummy = 0;
00326
00327 HDMMUXreadStatus((tSensors)SPORT(muxmotor), &dummy, encA, encB, encC);
00328
00329 switch ((ubyte)MPORT(muxmotor)) {
00330 case 0: return encA;
00331 case 1: return encB;
00332 case 2: return encC;
00333 }
00334
00335 return 0;
00336 }
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 bool HDMMotorEncoderReset(tMUXmotor muxmotor) {
00349 ubyte mode = 0;
00350
00351 switch ((ubyte)MPORT(muxmotor)) {
00352 case 0: mode = HDMMUX_CMD_RST_TACH_A; break;
00353 case 1: mode = HDMMUX_CMD_RST_TACH_B; break;
00354 case 2: mode = HDMMUX_CMD_RST_TACH_C; break;
00355 }
00356
00357 return HDMMUXsendCommand((tSensors)SPORT(muxmotor), mode, 0, 0, 0, 0, 0);
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 bool HDMMotorEncoderResetAll(tSensors link) {
00371 if (!HDMMUXsendCommand(link, HDMMUX_CMD_RST_TACH_A, 0, 0, 0, 0, 0))
00372 return false;
00373
00374 if (!HDMMUXsendCommand(link, HDMMUX_CMD_RST_TACH_B, 0, 0, 0, 0, 0))
00375 return false;
00376
00377 if (!HDMMUXsendCommand(link, HDMMUX_CMD_RST_TACH_C, 0, 0, 0, 0, 0))
00378 return false;
00379
00380 return true;
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390 bool HDMMotorBusy(tMUXmotor muxmotor) {
00391 long dummy = 0;
00392 byte motorStatus = 0;
00393
00394 HDMMUXreadStatus((tSensors)SPORT(muxmotor), motorStatus, dummy, dummy, dummy);
00395
00396 switch ((ubyte)MPORT(muxmotor)) {
00397 case 0: return ((motorStatus & 0x01) == 0x01);
00398 case 1: return ((motorStatus & 0x02) == 0x02);
00399 case 2: return ((motorStatus & 0x04) == 0x04);
00400 }
00401
00402 return true;
00403 }
00404
00405
00406
00407
00408
00409
00410
00411 void HDMMotorSetBrake(tMUXmotor muxmotor) {
00412 mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)] = true;
00413 }
00414
00415
00416
00417
00418
00419
00420
00421 void HDMMotorSetFloat(tMUXmotor muxmotor) {
00422 mmuxData[SPORT(muxmotor)].brake[MPORT(muxmotor)] = false;
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432 void HDMMotorSetSpeedCtrl(tMUXmotor muxmotor, bool constspeed) {
00433 mmuxData[SPORT(muxmotor)].pidcontrol[MPORT(muxmotor)] = true;
00434 }
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 void HDMMotorSetRamping(tMUXmotor muxmotor, ubyte ramping) {
00448 mmuxData[SPORT(muxmotor)].ramping[MPORT(muxmotor)] = ramping;
00449 }
00450
00451 #endif // __HDMMUX_H__
00452
00453
00454
00455
00456
00457