00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __HTSMUX_H__
00013 #define __HTSMUX_H__
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #pragma systemFile
00032
00033 #ifndef __COMMON_H__
00034 #include "common.h"
00035 #endif
00036
00037 #define __HTSMUX_SUPPORT__
00038
00039 #ifndef SPORT
00040 #define SPORT(X) (X / 4)
00041 #endif
00042
00043 #ifndef MPORT
00044 #define MPORT(X) (X % 4)
00045 #endif
00046
00047 #ifndef MAX_ARR_SIZE
00048
00049
00050
00051
00052
00053 #define MAX_ARR_SIZE 17
00054 #endif
00055
00056 #define HTSMUX_I2C_ADDR 0x10
00057 #define HTSMUX_COMMAND 0x20
00058 #define HTSMUX_STATUS 0x21
00059
00060
00061 #define HTSMUX_MODE 0x00
00062 #define HTSMUX_TYPE 0x01
00063 #define HTSMUX_I2C_COUNT 0x02
00064 #define HTSMUX_I2C_DADDR 0x03
00065 #define HTSMUX_I2C_MADDR 0x04
00066 #define HTSMUX_CH_OFFSET 0x22
00067 #define HTSMUX_CH_ENTRY_SIZE 0x05
00068
00069 #define HTSMUX_ANALOG 0x36
00070 #define HTSMUX_AN_ENTRY_SIZE 0x02
00071
00072 #define HTSMUX_I2C_BUF 0x40
00073 #define HTSMUX_BF_ENTRY_SIZE 0x10
00074
00075
00076
00077 #define HTSMUX_CMD_HALT 0x00
00078 #define HTSMUX_CMD_AUTODETECT 0x01
00079 #define HTSMUX_CMD_RUN 0x02
00080
00081
00082 #define HTSMUX_STAT_NORMAL 0x00
00083 #define HTSMUX_STAT_BATT 0x01
00084 #define HTSMUX_STAT_BUSY 0x02
00085 #define HTSMUX_STAT_HALT 0x04
00086 #define HTSMUX_STAT_ERROR 0x08
00087 #define HTSMUX_STAT_NOTHING 0xFF
00088
00089
00090 #define HTSMUX_CHAN_NONE 0x00
00091 #define HTSMUX_CHAN_I2C 0x01
00092 #define HTSMUX_CHAN_9V 0x02
00093 #define HTSMUX_CHAN_DIG0_HIGH 0x04
00094 #define HTSMUX_CHAN_DIG1_HIGH 0x08
00095 #define HTSMUX_CHAN_I2C_SLOW 0x10
00096
00097
00098
00099 typedef enum {
00100 HTSMUXAnalogue = 0x00,
00101 HTSMUXLegoUS = 0x01,
00102 HTSMUXCompass = 0x02,
00103 HTSMUXColor = 0x03,
00104 HTSMUXAccel = 0x04,
00105 HTSMUXIRSeeker = 0x05,
00106 HTSMUXProto = 0x06,
00107 HTSMUXColorNew = 0x07,
00108 HTSMUXAngle = 0x08,
00109 HTSMUXIRSeekerNew = 0x09,
00110 HTSMUXSensorCustom = 0x0E,
00111 HTSMUXSensorNone = 0x0F
00112 } HTSMUXSensorType;
00113
00114
00115 typedef enum {
00116 msensor_S1_1 = 0,
00117 msensor_S1_2 = 1,
00118 msensor_S1_3 = 2,
00119 msensor_S1_4 = 3,
00120 msensor_S2_1 = 4,
00121 msensor_S2_2 = 5,
00122 msensor_S2_3 = 6,
00123 msensor_S2_4 = 7,
00124 msensor_S3_1 = 8,
00125 msensor_S3_2 = 9,
00126 msensor_S3_3 = 10,
00127 msensor_S3_4 = 11,
00128 msensor_S4_1 = 12,
00129 msensor_S4_2 = 13,
00130 msensor_S4_3 = 14,
00131 msensor_S4_4 = 15
00132 } tMUXSensor;
00133
00134
00135
00136 ubyte HTSMUXstatus[4] = {HTSMUX_STAT_NOTHING, HTSMUX_STAT_NOTHING, HTSMUX_STAT_NOTHING, HTSMUX_STAT_NOTHING};
00137
00138
00139 HTSMUXSensorType HTSMUXSensorTypes[16] = {HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone,
00140 HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone,
00141 HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone,
00142 HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone, HTSMUXSensorNone};
00143
00144 tByteArray HTSMUX_I2CRequest;
00145 tByteArray HTSMUX_I2CReply;
00146
00147 typedef ubyte tConfigParams[4];
00148
00149 tConfigParams Analogue_config = {HTSMUX_CHAN_NONE, 0, 0, 0};
00150
00151 byte HTSMUXreadStatus(tSensors link);
00152 HTSMUXSensorType HTSMUXreadSensorType(tMUXSensor muxsensor);
00153 bool HTSMUXsendCommand(tSensors link, byte command);
00154 bool HTSMUXreadPort(tMUXSensor muxsensor, tByteArray &result, int numbytes, int offset = 0);
00155 bool HTSMUXsetMode(tMUXSensor muxsensor, byte mode);
00156 bool HTSMUXsetAnalogueActive(tMUXSensor muxsensor);
00157 bool HTSMUXsetAnalogueInactive(tMUXSensor muxsensor);
00158 int HTSMUXreadAnalogue(tMUXSensor muxsensor);
00159 bool HTSMUXreadPowerStatus(tSensors link);
00160 bool HTSMUXconfigChannel(tMUXSensor muxsensor, tConfigParams &configparams);
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 byte HTSMUXreadStatus(tSensors link) {
00177 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00178
00179 HTSMUX_I2CRequest[0] = 2;
00180 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00181 HTSMUX_I2CRequest[2] = HTSMUX_STATUS;
00182
00183 if (!writeI2C(link, HTSMUX_I2CRequest, 1))
00184 return -1;
00185
00186 if (!readI2C(link, HTSMUX_I2CReply, 1))
00187 return -1;
00188
00189 return HTSMUX_I2CReply[0];
00190 }
00191
00192
00193
00194
00195
00196
00197
00198 HTSMUXSensorType HTSMUXreadSensorType(tMUXSensor muxsensor) {
00199 return HTSMUXSensorTypes[muxsensor];
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216 bool HTSMUXsetMode(tMUXSensor muxsensor, byte mode) {
00217 tSensors link = (tSensors)SPORT(muxsensor);
00218 byte channel = MPORT(muxsensor);
00219
00220
00221 if (HTSMUXstatus[link] == HTSMUX_STAT_BUSY) {
00222 return false;
00223 } else if (HTSMUXstatus[link] != HTSMUX_STAT_HALT) {
00224
00225 if (!HTSMUXsendCommand(link, HTSMUX_CMD_HALT))
00226 return false;
00227 wait1Msec(50);
00228 }
00229
00230 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00231
00232 HTSMUX_I2CRequest[0] = 3;
00233 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00234 HTSMUX_I2CRequest[2] = HTSMUX_CH_OFFSET + HTSMUX_MODE + (HTSMUX_CH_ENTRY_SIZE * channel);
00235 HTSMUX_I2CRequest[3] = mode;
00236
00237 return writeI2C(link, HTSMUX_I2CRequest, 0);
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 bool HTSMUXsetAnalogueActive(tMUXSensor muxsensor) {
00247 if (HTSMUXSensorTypes[muxsensor] != HTSMUXSensorCustom)
00248 HTSMUXconfigChannel(muxsensor, Analogue_config);
00249
00250 if (!HTSMUXsetMode(muxsensor, HTSMUX_CHAN_DIG0_HIGH))
00251 return false;
00252
00253 return HTSMUXsendCommand((tSensors)SPORT(muxsensor), HTSMUX_CMD_RUN);
00254 }
00255
00256
00257
00258
00259
00260
00261
00262 bool HTSMUXsetAnalogueInactive(tMUXSensor muxsensor) {
00263 if (HTSMUXSensorTypes[muxsensor] != HTSMUXSensorCustom)
00264 HTSMUXconfigChannel(muxsensor, Analogue_config);
00265
00266 if (!HTSMUXsetMode(muxsensor, 0))
00267 return false;
00268
00269 return HTSMUXsendCommand((tSensors)SPORT(muxsensor), HTSMUX_CMD_RUN);
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286 bool HTSMUXsendCommand(tSensors link, byte command) {
00287 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00288
00289 HTSMUX_I2CRequest[0] = 3;
00290 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00291 HTSMUX_I2CRequest[2] = HTSMUX_COMMAND;
00292 HTSMUX_I2CRequest[3] = command;
00293
00294 switch(command) {
00295 case HTSMUX_CMD_HALT:
00296 HTSMUXstatus[link] = HTSMUX_STAT_HALT;
00297 break;
00298 case HTSMUX_CMD_AUTODETECT:
00299 HTSMUXstatus[link] = HTSMUX_STAT_BUSY;
00300 break;
00301 case HTSMUX_CMD_RUN:
00302 HTSMUXstatus[link] = HTSMUX_STAT_NORMAL;
00303 break;
00304 }
00305
00306 return writeI2C(link, HTSMUX_I2CRequest, 0);
00307 }
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 bool HTSMUXreadPort(tMUXSensor muxsensor, tByteArray &result, int numbytes, int offset) {
00320 tSensors link = (tSensors)SPORT(muxsensor);
00321 byte channel = MPORT(muxsensor);
00322
00323 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00324 if (HTSMUXstatus[link] != HTSMUX_STAT_NORMAL)
00325 HTSMUXsendCommand(link, HTSMUX_CMD_RUN);
00326
00327 HTSMUX_I2CRequest[0] = 2;
00328 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00329 HTSMUX_I2CRequest[2] = HTSMUX_I2C_BUF + (HTSMUX_BF_ENTRY_SIZE * channel) + offset;
00330
00331 if (!writeI2C(link, HTSMUX_I2CRequest, numbytes))
00332 return false;
00333
00334 if (!readI2C(link, HTSMUX_I2CReply, numbytes))
00335 return false;
00336
00337 memcpy(result, HTSMUX_I2CReply, sizeof(tByteArray));
00338
00339 return true;
00340 }
00341
00342
00343
00344
00345
00346
00347
00348
00349 int HTSMUXreadAnalogue(tMUXSensor muxsensor) {
00350 tSensors link = (tSensors)SPORT(muxsensor);
00351 byte channel = MPORT(muxsensor);
00352
00353 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00354 if (HTSMUXstatus[link] != HTSMUX_STAT_NORMAL)
00355 HTSMUXsendCommand(link, HTSMUX_CMD_RUN);
00356
00357 if (HTSMUXSensorTypes[muxsensor] != HTSMUXSensorCustom)
00358 HTSMUXconfigChannel(muxsensor, Analogue_config);
00359
00360 HTSMUX_I2CRequest[0] = 2;
00361 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00362 HTSMUX_I2CRequest[2] = HTSMUX_ANALOG + (HTSMUX_AN_ENTRY_SIZE * channel);
00363
00364 if (!writeI2C(link, HTSMUX_I2CRequest, 2))
00365 return -1;
00366
00367 if (!readI2C(link, HTSMUX_I2CReply, 2))
00368 return -1;
00369
00370 return ((int)HTSMUX_I2CReply[0] * 4) + HTSMUX_I2CReply[1];
00371 }
00372
00373
00374
00375
00376
00377
00378
00379
00380 void HTSMUXsensorTypeToString(HTSMUXSensorType muxsensor, string &sensorName) {
00381 switch(muxsensor) {
00382 case HTSMUXAnalogue: sensorName = "Analogue"; break;
00383 case HTSMUXLegoUS: sensorName = "Ultra Sonic"; break;
00384 case HTSMUXCompass: sensorName = "Compass"; break;
00385 case HTSMUXColor: sensorName = "Colour"; break;
00386 case HTSMUXColorNew: sensorName = "Colour New"; break;
00387 case HTSMUXAccel: sensorName = "Accel"; break;
00388 case HTSMUXIRSeeker: sensorName = "IR Seeker"; break;
00389 case HTSMUXProto: sensorName = "Proto Board"; break;
00390 case HTSMUXIRSeekerNew: sensorName = "IR Seeker V2"; break;
00391 case HTSMUXSensorNone : sensorName = "No sensor"; break;
00392 }
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402 bool HTSMUXreadPowerStatus(tSensors link) {
00403 if ((HTSMUXreadStatus(link) & HTSMUX_STAT_BATT) == HTSMUX_STAT_BATT)
00404 return true;
00405 else
00406 return false;
00407 }
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 bool HTSMUXconfigChannel(tMUXSensor muxsensor, tConfigParams &configparams) {
00423 memset(HTSMUX_I2CRequest, 0, sizeof(tByteArray));
00424
00425
00426 if (!HTSMUXsendCommand((tSensors)SPORT(muxsensor), HTSMUX_CMD_HALT))
00427 return false;
00428 wait1Msec(50);
00429
00430 HTSMUX_I2CRequest[0] = 7;
00431 HTSMUX_I2CRequest[1] = HTSMUX_I2C_ADDR;
00432 HTSMUX_I2CRequest[2] = HTSMUX_CH_OFFSET + (HTSMUX_CH_ENTRY_SIZE * MPORT(muxsensor));
00433 HTSMUX_I2CRequest[3] = configparams[0];
00434 HTSMUX_I2CRequest[4] = 0x00;
00435 HTSMUX_I2CRequest[5] = configparams[1];
00436 HTSMUX_I2CRequest[6] = configparams[2];
00437 HTSMUX_I2CRequest[7] = configparams[3];
00438
00439 if (!writeI2C((tSensors)SPORT(muxsensor), HTSMUX_I2CRequest, 0))
00440 return false;
00441
00442 HTSMUXSensorTypes[muxsensor] = HTSMUXSensorCustom;
00443 return HTSMUXsendCommand((tSensors)SPORT(muxsensor), HTSMUX_CMD_RUN);
00444 }
00445
00446
00447 #endif // __HTSMUX_H__
00448
00449
00450
00451
00452