00001
00002
00003
00004
00005 #ifndef INCLUDED_ERS220Info_h
00006 #define INCLUDED_ERS220Info_h
00007
00008 #include "CommonERSInfo.h"
00009
00010
00011 #if defined(TGT_ERS220)
00012 # define TGT_HAS_LEDS 20
00013 # define TGT_HAS_BUTTONS 11
00014 # define TGT_HAS_IR_DISTANCE 1
00015 #endif
00016
00017
00018 namespace ERS220Info {
00019
00020
00021
00022
00023
00024 extern const char* const TargetName;
00025
00026 const unsigned int FrameTime=8;
00027 const unsigned int NumFrames=4;
00028 const unsigned int SlowFrameTime=128;
00029 const unsigned int NumSlowFrames=1;
00030 const unsigned int SoundBufferTime=32;
00031
00032
00033
00034
00035 const unsigned NumWheels = 0;
00036
00037 const unsigned JointsPerArm = 0;
00038 const unsigned NumArms = 0;
00039 const unsigned NumArmJoints = JointsPerArm*NumArms;
00040
00041 const unsigned JointsPerLeg = 3;
00042 const unsigned NumLegs = 4;
00043 const unsigned NumLegJoints = JointsPerLeg*NumLegs;
00044 const unsigned NumHeadJoints = 3;
00045 const unsigned NumTailJoints = 0;
00046 const unsigned NumMouthJoints = 0;
00047 const unsigned NumEarJoints = 0;
00048 const unsigned NumButtons = 11;
00049 const unsigned NumSensors = 1+3+1+5;
00050 const unsigned NumLEDs = 20;
00051
00052 const unsigned NumPIDJoints = NumLegJoints+NumHeadJoints+NumTailJoints+NumMouthJoints;
00053 const unsigned NumBinJoints = NumEarJoints;
00054 const unsigned NumOutputs = NumPIDJoints + NumBinJoints + NumLEDs;
00055 const unsigned NumReferenceFrames = NumOutputs + 1 + NumLegs + 1 + 1;
00056
00057 const float CameraHorizFOV=57.6/180*M_PI;
00058 const float CameraVertFOV=47.8/180*M_PI;
00059 const float CameraFOV=CameraHorizFOV;
00060 const unsigned int CameraResolutionX=176;
00061 const unsigned int CameraResolutionY=144;
00062 const float BallOfFootRadius=27.922/2;
00063 const float CylinderOfFootRadius=24.606/2;
00064
00065
00066 const bool IsFastOutput[NumOutputs] = {
00067
00068 true, true, true,
00069 true, true, true,
00070 true, true, true,
00071 true, true, true,
00072 true, true, true,
00073
00074 true, true, true,
00075 true, true, true,
00076 true,
00077 true, true, true,
00078 true, true, true,
00079 true, true, true,
00080 true, true, true,
00081 true,
00082
00083 };
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 const unsigned PIDJointOffset = 0;
00095 const unsigned LegOffset = PIDJointOffset;
00096 const unsigned HeadOffset = LegOffset+NumLegJoints;
00097
00098 const unsigned LEDOffset = PIDJointOffset + NumPIDJoints;
00099
00100 const unsigned BinJointOffset = NumOutputs;
00101
00102 const unsigned BaseFrameOffset = NumOutputs;
00103 const unsigned PawFrameOffset = BaseFrameOffset+1;
00104 const unsigned CameraFrameOffset = PawFrameOffset+NumLegs;
00105 const unsigned IRFrameOffset = CameraFrameOffset+1;
00106
00107
00108 enum LegOrder_t {
00109 LFrLegOrder = 0,
00110 RFrLegOrder,
00111 LBkLegOrder,
00112 RBkLegOrder
00113 };
00114
00115
00116 enum REKOffset_t {
00117 RotatorOffset=0,
00118 ElevatorOffset,
00119 KneeOffset
00120 };
00121
00122
00123 enum TPROffset_t {
00124 TiltOffset = 0,
00125 PanOffset,
00126 RollOffset,
00127 NodOffset=RollOffset
00128 };
00129
00130
00131 enum LegOffset_t {
00132 LFrLegOffset = LegOffset+LFrLegOrder*JointsPerLeg,
00133 RFrLegOffset = LegOffset+RFrLegOrder*JointsPerLeg,
00134 LBkLegOffset = LegOffset+LBkLegOrder*JointsPerLeg,
00135 RBkLegOffset = LegOffset+RBkLegOrder*JointsPerLeg
00136 };
00137
00138
00139
00140
00141 enum LEDOffset_t {
00142 FaceFrontLeftLEDOffset = LEDOffset,
00143 FaceFrontRightLEDOffset,
00144 FaceCenterLeftLEDOffset,
00145 FaceCenterRightLEDOffset,
00146 FaceBackLeftLEDOffset,
00147 FaceBackRightLEDOffset,
00148 ModeLEDOffset,
00149 BackLeft1LEDOffset,
00150 BackLeft2LEDOffset,
00151 BackLeft3LEDOffset,
00152 BackRight3LEDOffset,
00153 BackRight2LEDOffset,
00154 BackRight1LEDOffset,
00155 TailLeftLEDOffset,
00156 TailCenterLEDOffset,
00157 TailRightLEDOffset,
00158 FaceFrontBLEDOffset,
00159 FaceFrontALEDOffset,
00160 FaceFrontCLEDOffset,
00161 RetractableHeadLEDOffset,
00162
00163
00164 BotLLEDOffset = FaceFrontLeftLEDOffset,
00165 BotRLEDOffset = FaceFrontRightLEDOffset,
00166 MidLLEDOffset = FaceCenterLeftLEDOffset,
00167 MidRLEDOffset = FaceCenterRightLEDOffset,
00168 TopLLEDOffset = FaceBackLeftLEDOffset,
00169 TopRLEDOffset = FaceBackRightLEDOffset,
00170 TopBrLEDOffset = ModeLEDOffset,
00171 TlBluLEDOffset = TailLeftLEDOffset,
00172 TlRedLEDOffset = TailRightLEDOffset,
00173 };
00174
00175
00176
00177 typedef unsigned int LEDBitMask_t;
00178 const LEDBitMask_t FaceFrontLeftLEDMask = 1<<(FaceFrontLeftLEDOffset-LEDOffset);
00179 const LEDBitMask_t FaceFrontRightLEDMask = 1<<(FaceFrontRightLEDOffset-LEDOffset);
00180 const LEDBitMask_t FaceCenterLeftLEDMask = 1<<(FaceCenterLeftLEDOffset-LEDOffset);
00181 const LEDBitMask_t FaceCenterRightLEDMask = 1<<(FaceCenterRightLEDOffset-LEDOffset);
00182 const LEDBitMask_t FaceBackLeftLEDMask = 1<<(FaceBackLeftLEDOffset-LEDOffset);
00183 const LEDBitMask_t FaceBackRightLEDMask = 1<<(FaceBackRightLEDOffset-LEDOffset);
00184 const LEDBitMask_t ModeLEDMask = 1<<(ModeLEDOffset-LEDOffset);
00185 const LEDBitMask_t BackLeft1LEDMask = 1<<(BackLeft1LEDOffset-LEDOffset);
00186 const LEDBitMask_t BackLeft2LEDMask = 1<<(BackLeft2LEDOffset-LEDOffset);
00187 const LEDBitMask_t BackLeft3LEDMask = 1<<(BackLeft3LEDOffset-LEDOffset);
00188 const LEDBitMask_t BackRight3LEDMask = 1<<(BackRight3LEDOffset-LEDOffset);
00189 const LEDBitMask_t BackRight2LEDMask = 1<<(BackRight2LEDOffset-LEDOffset);
00190 const LEDBitMask_t BackRight1LEDMask = 1<<(BackRight1LEDOffset-LEDOffset);
00191 const LEDBitMask_t TailLeftLEDMask = 1<<(TailLeftLEDOffset-LEDOffset);
00192 const LEDBitMask_t TailCenterLEDMask = 1<<(TailCenterLEDOffset-LEDOffset);
00193 const LEDBitMask_t TailRightLEDMask = 1<<(TailRightLEDOffset-LEDOffset);
00194 const LEDBitMask_t FaceFrontBLEDMask = 1<<(FaceFrontBLEDOffset-LEDOffset);
00195 const LEDBitMask_t FaceFrontALEDMask = 1<<(FaceFrontALEDOffset-LEDOffset);
00196 const LEDBitMask_t FaceFrontCLEDMask = 1<<(FaceFrontCLEDOffset-LEDOffset);
00197 const LEDBitMask_t RetractableHeadLEDMask = 1<<(RetractableHeadLEDOffset-LEDOffset);
00198
00199
00200 const LEDBitMask_t BotLLEDMask = 1<<(BotLLEDOffset-LEDOffset);
00201 const LEDBitMask_t BotRLEDMask = 1<<(BotRLEDOffset-LEDOffset);
00202 const LEDBitMask_t MidLLEDMask = 1<<(MidLLEDOffset-LEDOffset);
00203 const LEDBitMask_t MidRLEDMask = 1<<(MidRLEDOffset-LEDOffset);
00204 const LEDBitMask_t TopLLEDMask = 1<<(TopLLEDOffset-LEDOffset);
00205 const LEDBitMask_t TopRLEDMask = 1<<(TopRLEDOffset-LEDOffset);
00206 const LEDBitMask_t TopBrLEDMask= 1<<(TopBrLEDOffset-LEDOffset);
00207 const LEDBitMask_t TlRedLEDMask= 1<<(TlRedLEDOffset-LEDOffset);
00208 const LEDBitMask_t TlBluLEDMask= 1<<(TlBluLEDOffset-LEDOffset);
00209
00210
00211 const LEDBitMask_t FaceLEDMask
00212 = FaceFrontLeftLEDMask
00213 | FaceFrontRightLEDMask
00214 | FaceCenterLeftLEDMask
00215 | FaceCenterRightLEDMask
00216 | FaceBackLeftLEDMask
00217 | FaceBackRightLEDMask
00218 | FaceFrontALEDMask
00219 | FaceFrontBLEDMask
00220 | FaceFrontCLEDMask
00221 | ModeLEDMask;
00222
00223
00224 const LEDBitMask_t HeadLEDMask
00225 = FaceLEDMask | RetractableHeadLEDMask;
00226
00227
00228 const LEDBitMask_t BackLEDMask
00229 = BackLeft1LEDMask
00230 | BackLeft2LEDMask
00231 | BackLeft3LEDMask
00232 | BackRight1LEDMask
00233 | BackRight2LEDMask
00234 | BackRight3LEDMask;
00235
00236
00237 const LEDBitMask_t TailLEDMask
00238 = TailLeftLEDMask
00239 | TailCenterLEDMask
00240 | TailRightLEDMask;
00241
00242
00243 const LEDBitMask_t AllLEDMask = (LEDBitMask_t)~0;
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 enum ButtonOffset_t {
00266 LFrPawOffset = LFrLegOrder,
00267 RFrPawOffset = RFrLegOrder,
00268 LBkPawOffset = LBkLegOrder,
00269 RBkPawOffset = RBkLegOrder,
00270 ChinButOffset= 4,
00271 BackButOffset,
00272 HeadFrButOffset,
00273 HeadButOffset=HeadFrButOffset,
00274 HeadBkButOffset,
00275 TailLeftButOffset,
00276 TailCenterButOffset,
00277 TailRightButOffset,
00278 };
00279
00280
00281 const char* const buttonNames[NumButtons] = {
00282 "LFrPaw","RFrPaw","LBkPaw","RBkPaw",
00283 "ChinBut","BackBut","HeadFrBut","HeadBkBut",
00284 "TailLeftBut","TailCenterBut","TailRightBut"
00285 };
00286
00287
00288
00289 enum SensorOffset_t {
00290 IRDistOffset = 0,
00291 BAccelOffset,
00292 LAccelOffset,
00293 DAccelOffset,
00294 ThermoOffset,
00295 PowerRemainOffset,
00296 PowerThermoOffset,
00297 PowerCapacityOffset,
00298 PowerVoltageOffset,
00299 PowerCurrentOffset
00300 };
00301
00302
00303 const char* const sensorNames[NumSensors] = {
00304 "IRDist",
00305 "BAccel","LAccel","DAccel",
00306 "Thermo",
00307 "PowerRemain","PowerThermo","PowerCapacity","PowerVoltage","PowerCurrent"
00308 };
00309
00310
00311
00312
00313
00314 const char* const outputNames[NumOutputs] = {
00315 "LFr:rotor",
00316 "LFr:elvtr",
00317 "LFr:knee",
00318 "RFr:rotor",
00319 "RFr:elvtr",
00320 "RFr:knee",
00321 "LBk:rotor",
00322 "LBk:elvtr",
00323 "LBk:knee",
00324 "RBk:rotor",
00325 "RBk:elvtr",
00326 "RBk:knee",
00327
00328 "NECK:tilt",
00329 "NECK:pan",
00330 "NECK:roll",
00331
00332 "LED:botL",
00333 "LED:botR",
00334 "LED:midL",
00335 "LED:midR",
00336 "LED:topL",
00337 "LED:topR",
00338 "LED:topBr",
00339
00340 "LED:bkL1",
00341 "LED:bkL2",
00342 "LED:bkL3",
00343 "LED:bkR3",
00344 "LED:bkR2",
00345 "LED:bkR1",
00346 "LED:tailL",
00347 "LED:tailC",
00348 "LED:tailR",
00349 "LED:faceB",
00350 "LED:faceA",
00351 "LED:faceC",
00352 "LED:light",
00353 };
00354
00355
00356
00357 class ERS220Capabilities : public Capabilities {
00358 public:
00359
00360 ERS220Capabilities()
00361 : Capabilities(TargetName,NumOutputs,outputNames,NumButtons,buttonNames,NumSensors,sensorNames,PIDJointOffset,NumPIDJoints,LEDOffset,NumLEDs)
00362 {
00363
00364 buttonToIndex["HeadBut"]=HeadButOffset;
00365
00366 outputToIndex["LED:tlBlu"]=TlBluLEDOffset;
00367 outputToIndex["LED:tlRed"]=TlRedLEDOffset;
00368 }
00369 };
00370
00371 extern ERS220Capabilities capabilities;
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 const char* const PrimitiveName [NumOutputs] = {
00385 "PRM:/r2/c1-Joint2:j1",
00386 "PRM:/r2/c1/c2-Joint2:j2",
00387 "PRM:/r2/c1/c2/c3-Joint2:j3",
00388 "PRM:/r4/c1-Joint2:j1",
00389 "PRM:/r4/c1/c2-Joint2:j2",
00390 "PRM:/r4/c1/c2/c3-Joint2:j3",
00391
00392 "PRM:/r3/c1-Joint2:j1",
00393 "PRM:/r3/c1/c2-Joint2:j2",
00394 "PRM:/r3/c1/c2/c3-Joint2:j3",
00395 "PRM:/r5/c1-Joint2:j1",
00396 "PRM:/r5/c1/c2-Joint2:j2",
00397 "PRM:/r5/c1/c2/c3-Joint2:j3",
00398
00399 "PRM:/r1/c1-Joint2:j1",
00400 "PRM:/r1/c1/c2-Joint2:j2",
00401 "PRM:/r1/c1/c2/c3-Joint2:j3",
00402
00403 "PRM:/r1/c1/c2/c3/l1-LED2:l1",
00404 "PRM:/r1/c1/c2/c3/l4-LED2:l4",
00405 "PRM:/r1/c1/c2/c3/l2-LED2:l2",
00406 "PRM:/r1/c1/c2/c3/l5-LED2:l5",
00407 "PRM:/r1/c1/c2/c3/l3-LED2:l3",
00408 "PRM:/r1/c1/c2/c3/l6-LED2:l6",
00409 "PRM:/r1/c1/c2/c3/l7-LED2:l7",
00410
00411 "PRM:/r6/l1-LED2:l1",
00412 "PRM:/r6/l2-LED2:l2",
00413 "PRM:/r6/l3-LED2:l3",
00414 "PRM:/r6/l4-LED2:l4",
00415 "PRM:/r6/l5-LED2:l5",
00416 "PRM:/r6/l6-LED2:l6",
00417
00418 "PRM:/r6/l9-LED2:l9",
00419 "PRM:/r6/l7-LED2:l7",
00420 "PRM:/r6/l8-LED2:l8",
00421
00422 "PRM:/r1/c1/c2/c3/l8-LED2:l8",
00423 "PRM:/r1/c1/c2/c3/l9-LED2:l9",
00424 "PRM:/r1/c1/c2/c3/la-LED2:la",
00425 "PRM:/r1/c1/c2/c3/lb-LED2:lb",
00426 };
00427
00428
00429 const char* const SpeakerLocator="PRM:/r1/c1/c2/c3/s1-Speaker:S1";
00430
00431
00432 const char* const CameraLocator="PRM:/r1/c1/c2/c3/i1-FbkImageSensor:F1";
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460 const float DefaultPIDs[NumPIDJoints][3] =
00461 {
00462 { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00463 { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00464 { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00465 { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00466 { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00467 { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00468 { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00469 { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00470 { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00471 { 0x16/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x08/(double)(1<<(16-0xF)) },
00472 { 0x14/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x06/(double)(1<<(16-0xF)) },
00473 { 0x23/(double)(1<<(16-0xE)), 0x04/(double)(1<<(16-0x2)), 0x05/(double)(1<<(16-0xF)) },
00474
00475 { 0x0A/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0C/(double)(1<<(16-0xF)) },
00476 { 0x0D/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0B/(double)(1<<(16-0xF)) },
00477 { 0x0A/(double)(1<<(16-0xE)), 0x08/(double)(1<<(16-0x2)), 0x0C/(double)(1<<(16-0xF)) }
00478
00479
00480
00481
00482
00483 };
00484
00485
00486 const unsigned char DefaultPIDShifts[3] = {0x0E, 0x02, 0x0F};
00487
00488
00489
00490
00491
00492
00493 const float MaxOutputSpeed[NumOutputs] = {
00494 2.8143434e-03,
00495 2.4980025e-03,
00496 2.8361600e-03,
00497 2.8143434e-03,
00498 2.4980025e-03,
00499 2.8361600e-03,
00500 2.8143434e-03,
00501 2.4980025e-03,
00502 2.8361600e-03,
00503 2.8143434e-03,
00504 2.4980025e-03,
00505 2.8361600e-03,
00506
00507 2.1053034e-03,
00508 3.0106930e-03,
00509 3.0106930e-03,
00510
00511 0,0,0,
00512 0,0,0,
00513 0,
00514 0,0,0,
00515 0,0,0,
00516 0,0,0,
00517 0,0,0,
00518 0
00519 };
00520
00521 #ifndef RAD
00522
00523 #define RAD(deg) (((deg) * M_PI ) / 180.0)
00524
00525 #define __RI_RAD_FLAG
00526 #endif
00527
00528
00529 const double outputRanges[NumOutputs][2] =
00530 {
00531 { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) },
00532 { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) },
00533 { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) },
00534 { RAD(-117),RAD(117) },{ RAD(-11),RAD(89) },{ RAD(-27),RAD(147) },
00535
00536 { RAD(-88.5),RAD(43) },{ RAD(-89.6),RAD(89.6) },{ RAD(-29),RAD(29) },
00537
00538 {0,1},{0,1},{0,1},
00539 {0,1},{0,1},{0,1},
00540 {0,1},
00541 {0,1},{0,1},{0,1},
00542 {0,1},{0,1},{0,1},
00543 {0,1},{0,1},{0,1},
00544 {0,1},{0,1},{0,1},
00545 {0,1}
00546 };
00547
00548
00549 const double mechanicalLimits[NumOutputs][2] =
00550 {
00551 { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) },
00552 { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) },
00553 { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) },
00554 { RAD(-120),RAD(120) },{ RAD(-14),RAD(92) },{ RAD(-30),RAD(150) },
00555
00556 { RAD(-91.5),RAD(46) },{ RAD(-92.6),RAD(92.6) },{ RAD(-32),RAD(32) },
00557
00558 {0,1},{0,1},{0,1},
00559 {0,1},{0,1},{0,1},
00560 {0,1},
00561 {0,1},{0,1},{0,1},
00562 {0,1},{0,1},{0,1},
00563 {0,1},{0,1},{0,1},
00564 {0,1},{0,1},{0,1},
00565 {0,1}
00566 };
00567
00568 #ifdef __RI_RAD_FLAG
00569 #undef RAD
00570 #undef __RI_RAD_FLAG
00571 #endif
00572
00573
00574
00575 const int CPCJointNeckTilt = 0;
00576 const int CPCJointNeckPan = 1;
00577 const int CPCJointNeckRoll = 2;
00578 const int CPCSensorPSD = 3;
00579 const int CPCSensorHeadBackPressure = 4;
00580 const int CPCSensorHeadFrontPressure = 5;
00581 const int CPCSensorChinSwitch = 6;
00582 const int CPCJointLFRotator = 7;
00583 const int CPCJointLFElevator = 8;
00584 const int CPCJointLFKnee = 9;
00585 const int CPCSensorLFPaw = 10;
00586 const int CPCJointLHRotator = 11;
00587 const int CPCJointLHElevator = 12;
00588 const int CPCJointLHKnee = 13;
00589 const int CPCSensorLHPaw = 14;
00590 const int CPCJointRFRotator = 15;
00591 const int CPCJointRFElevator = 16;
00592 const int CPCJointRFKnee = 17;
00593 const int CPCSensorRFPaw = 18;
00594 const int CPCJointRHRotator = 19;
00595 const int CPCJointRHElevator = 20;
00596 const int CPCJointRHKnee = 21;
00597 const int CPCSensorRHPaw = 22;
00598 const int CPCSensorThermoSensor = 23;
00599 const int CPCSensorBackSwitch = 24;
00600 const int CPCSensorTailLeftSwitch = 25;
00601 const int CPCSensorTailCenterSwitch = 26;
00602 const int CPCSensorTailRightSwitch = 27;
00603 const int CPCSensorAccelFB = 28;
00604 const int CPCSensorAccelLR = 29;
00605 const int CPCSensorAccelUD = 30;
00606
00607
00608 }
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623 #endif