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