00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #define COMMSCORE_C
00025 #include "inc/freeEMS.h"
00026 #include "inc/flashWrite.h"
00027 #include "inc/interrupts.h"
00028 #include "inc/utils.h"
00029 #include "inc/tableLookup.h"
00030 #include "inc/commsCore.h"
00031 #include <string.h>
00032
00033 void sendError(unsigned short);
00034 void sendDebug(unsigned char*);
00035
00036
00037
00038 void checksumAndSend(){
00039
00040 unsigned short TXPacketLengthToSend = (unsigned short)TXBufferCurrentPositionHandler - (unsigned short)&TXBuffer;
00041
00042
00043 *TXBufferCurrentPositionHandler = checksum((unsigned char*)&TXBuffer, TXPacketLengthToSend);
00044 TXPacketLengthToSend++;
00045
00046
00047
00048
00049 if(TXBufferInUseFlags & COM_SET_SCI0_INTERFACE_ID){
00050
00051 TXPacketLengthToSendSCI0 = TXPacketLengthToSend;
00052 TXPacketLengthToSendCAN0 = TXPacketLengthToSend;
00053
00054
00055 SCI0DRL = START_BYTE;
00056
00057
00058 SCI0CR2 |= SCICR2_TX_ISR_ENABLE;
00059 }
00060
00061 if(TXBufferInUseFlags & COM_SET_CAN0_INTERFACE_ID){
00062
00063 TXBufferInUseFlags &= COM_CLEAR_CAN0_INTERFACE_ID;
00064 }
00065
00066 if(TXBufferInUseFlags & COM_SET_SPARE2_INTERFACE_ID){
00067
00068 TXBufferInUseFlags &= COM_CLEAR_SPARE2_INTERFACE_ID;
00069 }
00070
00071 if(TXBufferInUseFlags & COM_SET_SPARE3_INTERFACE_ID){
00072
00073 TXBufferInUseFlags &= COM_CLEAR_SPARE3_INTERFACE_ID;
00074 }
00075
00076 if(TXBufferInUseFlags & COM_SET_SPARE4_INTERFACE_ID){
00077
00078 TXBufferInUseFlags &= COM_CLEAR_SPARE4_INTERFACE_ID;
00079 }
00080
00081 if(TXBufferInUseFlags & COM_SET_SPARE5_INTERFACE_ID){
00082
00083 TXBufferInUseFlags &= COM_CLEAR_SPARE5_INTERFACE_ID;
00084 }
00085
00086 if(TXBufferInUseFlags & COM_SET_SPARE6_INTERFACE_ID){
00087
00088 TXBufferInUseFlags &= COM_CLEAR_SPARE6_INTERFACE_ID;
00089 }
00090
00091 if(TXBufferInUseFlags & COM_SET_SPARE7_INTERFACE_ID){
00092
00093 TXBufferInUseFlags &= COM_CLEAR_SPARE7_INTERFACE_ID;
00094 }
00095 }
00096
00097
00098 void decodePacketAndBuildResponse(){
00099
00100 RXBufferCurrentPosition = (unsigned char*)&RXBuffer;
00101 TXBufferCurrentPositionHandler = (unsigned char*)&TXBuffer;
00102
00103
00104 TXBufferCurrentPositionSCI0 = (unsigned char*)&TXBuffer;
00105 TXBufferCurrentPositionCAN0 = (unsigned char*)&TXBuffer;
00106
00107
00108 RXCalculatedPayloadLength = RXPacketLengthReceived;
00109
00110
00111 RXHeaderFlags = *RXBufferCurrentPosition;
00112 RXBufferCurrentPosition++;
00113 RXCalculatedPayloadLength--;
00114
00115
00116 TXBufferInUseFlags |= COM_SET_SCI0_INTERFACE_ID;
00117
00118
00119
00120 unsigned char* TXHeaderFlags = TXBufferCurrentPositionHandler;
00121 *TXHeaderFlags = 0;
00122 TXBufferCurrentPositionHandler++;
00123
00124
00125 RXHeaderPayloadID = *((unsigned short*)RXBufferCurrentPosition);
00126 *((unsigned short*)TXBufferCurrentPositionHandler) = RXHeaderPayloadID + 1;
00127 RXBufferCurrentPosition += 2;
00128 TXBufferCurrentPositionHandler += 2;
00129 RXCalculatedPayloadLength -= 2;
00130
00131
00132 if(RXHeaderFlags & HEADER_HAS_ACK){
00133 *TXBufferCurrentPositionHandler = *RXBufferCurrentPosition;
00134 *TXHeaderFlags |= HEADER_HAS_ACK;
00135 RXBufferCurrentPosition++;
00136 TXBufferCurrentPositionHandler++;
00137 RXCalculatedPayloadLength--;
00138 }
00139
00140
00141 if(RXHeaderFlags & HEADER_HAS_ADDRS){
00142
00143 if(!(*RXBufferCurrentPosition == fixedConfigs.networkAddress)){
00144
00145 resetReceiveState(CLEAR_ALL_SOURCE_ID_FLAGS);
00146 TXBufferInUseFlags = 0;
00147 return;
00148 }
00149 RXBufferCurrentPosition++;
00150
00151
00152 RXHeaderSourceAddress = *RXBufferCurrentPosition;
00153 RXBufferCurrentPosition++;
00154 if(RXHeaderSourceAddress == 0){
00155 sendError(invalidSourceAddress);
00156 resetReceiveState(CLEAR_ALL_SOURCE_ID_FLAGS);
00157 return;
00158 }
00159
00160
00161 *TXHeaderFlags |= HEADER_HAS_ADDRS;
00162
00163 *TXBufferCurrentPositionHandler = RXHeaderSourceAddress;
00164 TXBufferCurrentPositionHandler++;
00165
00166 *TXBufferCurrentPositionHandler = fixedConfigs.networkAddress;
00167 TXBufferCurrentPositionHandler++;
00168
00169 RXCalculatedPayloadLength -= 2;
00170 }
00171
00172
00173 if(RXHeaderFlags & HEADER_HAS_LENGTH){
00174 RXHeaderPayloadLength = *((unsigned short*)RXBufferCurrentPosition);
00175 RXBufferCurrentPosition += 2;
00176 RXCalculatedPayloadLength -= 2;
00177
00178 if(RXHeaderPayloadLength != (RXCalculatedPayloadLength - 1)){
00179 sendError(payloadLengthHeaderMismatch);
00180 resetReceiveState(CLEAR_ALL_SOURCE_ID_FLAGS);
00181 return;
00182 }
00183 }
00184
00185
00186
00187
00188
00189
00190 if (RXHeaderFlags & HEADER_IS_PROTO){
00191
00192 *TXHeaderFlags |= HEADER_IS_PROTO;
00193
00194 switch (RXHeaderPayloadID){
00195 case requestInterfaceVersion:
00196
00197 if((RXCalculatedPayloadLength - 1) != 0){
00198 sendError(payloadLengthTypeMismatch);
00199 break;
00200 }
00201
00202 *((unsigned short*)TXBufferCurrentPositionHandler) = sizeof(interfaceVersionAndType);
00203 *TXHeaderFlags |= HEADER_HAS_LENGTH;
00204 TXBufferCurrentPositionHandler += 2;
00205
00206 memcpy((void*)TXBufferCurrentPositionHandler, (void*)&interfaceVersionAndType, sizeof(interfaceVersionAndType));
00207 TXBufferCurrentPositionHandler += sizeof(interfaceVersionAndType);
00208 checksumAndSend();
00209 break;
00210 case requestFirmwareVersion:
00211
00212 if((RXCalculatedPayloadLength - 1) != 0){
00213 sendError(payloadLengthTypeMismatch);
00214 break;
00215 }
00216
00217 *((unsigned short*)TXBufferCurrentPositionHandler) = sizeof(firmwareVersion);
00218 *TXHeaderFlags |= HEADER_HAS_LENGTH;
00219 TXBufferCurrentPositionHandler += 2;
00220
00221 memcpy((void*)TXBufferCurrentPositionHandler, (void*)&firmwareVersion, sizeof(firmwareVersion));
00222 TXBufferCurrentPositionHandler += sizeof(firmwareVersion);
00223 checksumAndSend();
00224 break;
00225 case requestMaxPacketSize:
00226
00227 if((RXCalculatedPayloadLength - 1) != 0){
00228 sendError(payloadLengthTypeMismatch);
00229 break;
00230 }
00231
00232 *((unsigned short*)TXBufferCurrentPositionHandler) = RX_BUFFER_SIZE;
00233 TXBufferCurrentPositionHandler += 2;
00234 checksumAndSend();
00235 break;
00236 case requestEchoPacketReturn:
00237
00238 *((unsigned short*)TXBufferCurrentPositionHandler) = RXPacketLengthReceived;
00239 *TXHeaderFlags |= HEADER_HAS_LENGTH;
00240 TXBufferCurrentPositionHandler += 2;
00241
00242 memcpy((void*)TXBufferCurrentPositionHandler, (void*)&RXBuffer, RXPacketLengthReceived);
00243
00244
00245 TXBufferCurrentPositionHandler += RXPacketLengthReceived;
00246 checksumAndSend();
00247 break;
00248 case requestSoftSystemReset:
00249
00250 if((RXCalculatedPayloadLength - 1) != 0){
00251 sendError(payloadLengthTypeMismatch);
00252 break;
00253 }
00254
00255 _start();
00256 case requestHardSystemReset:
00257
00258 if((RXCalculatedPayloadLength - 1) != 0){
00259 sendError(payloadLengthTypeMismatch);
00260 break;
00261 }
00262
00263 hardReset();
00264
00265
00266
00267
00268
00269
00270 default:
00271 if((RXHeaderPayloadID % 2) == 1){
00272 sendError(invalidProtocolPayloadID);
00273 }else{
00274 sendError(unrecognisedProtocolPayloadID);
00275 }
00276 }
00277 }else{
00278 switch (RXHeaderPayloadID) {
00279 case replaceBlockInRAM:
00280 {
00281 int id = PORTB;
00282 if(id < 16){
00283 mainTable aTable;
00284 validateMainTable(&aTable);
00285 }else if(id > 27 && id < 50){
00286 twoDTableUS aTable;
00287 validateTwoDTable(&aTable);
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 sendError(unimplementedFunction);
00313 break;
00314 }
00315 case replaceBlockInFlash:
00316 {
00317
00318 mainTable aTable;
00319 validateMainTable(&aTable);
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352 sendError(unimplementedFunction);
00353 break;
00354 }
00355 case retrieveBlockFromRAM:
00356 {
00357
00358 if((RXCalculatedPayloadLength - 1) != 2){
00359 sendError(payloadLengthTypeMismatch);
00360 break;
00361 }
00362
00363 unsigned short locationID = *((unsigned short*)RXBufferCurrentPosition);
00364
00365 *(unsigned short*)TXBufferCurrentPositionHandler = locationID;
00366 TXBufferCurrentPositionHandler += 2;
00367
00368
00369 if(locationID < 16){
00370
00371 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_RPM_LENGTH;
00372 TXBufferCurrentPositionHandler += 2;
00373
00374 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_LOAD_LENGTH;
00375 TXBufferCurrentPositionHandler += 2;
00376
00377 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_MAIN_LENGTH;
00378 TXBufferCurrentPositionHandler += 2;
00379 }
00380
00381
00382 blockDetails details;
00383 lookupBlockDetails(locationID, &details);
00384
00385 if((details.RAMPage == 0) || (details.RAMAddress == 0)){
00386 sendError(invalidMemoryActionForID);
00387 break;
00388 }
00389
00390
00391 unsigned char oldRamPage = RPAGE;
00392 RPAGE = details.RAMPage;
00393
00394
00395 memcpy(TXBufferCurrentPositionHandler, details.RAMAddress, details.size);
00396 TXBufferCurrentPositionHandler += details.size;
00397
00398
00399 RPAGE = oldRamPage;
00400
00401 checksumAndSend();
00402 break;
00403 }
00404 case retrieveBlockFromFlash:
00405 {
00406
00407 if((RXCalculatedPayloadLength - 1) != 2){
00408 sendError(payloadLengthTypeMismatch);
00409 break;
00410 }
00411
00412
00413 unsigned short locationID = *((unsigned short*)RXBufferCurrentPosition);
00414
00415 *(unsigned short*)TXBufferCurrentPositionHandler = locationID;
00416 TXBufferCurrentPositionHandler += 2;
00417
00418
00419 if(locationID < 16){
00420
00421 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_RPM_LENGTH;
00422 TXBufferCurrentPositionHandler += 2;
00423
00424 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_LOAD_LENGTH;
00425 TXBufferCurrentPositionHandler += 2;
00426
00427 *(unsigned short*)TXBufferCurrentPositionHandler = MAINTABLE_MAX_MAIN_LENGTH;
00428 TXBufferCurrentPositionHandler += 2;
00429 }
00430
00431
00432 blockDetails details;
00433 lookupBlockDetails(locationID, &details);
00434
00435 if((details.FlashPage == 0) || (details.FlashAddress == 0)){
00436 sendError(invalidMemoryActionForID);
00437 break;
00438 }
00439
00440
00441 unsigned char oldFlashPage = PPAGE;
00442 PPAGE = details.FlashPage;
00443
00444
00445 memcpy(TXBufferCurrentPositionHandler, details.FlashAddress, details.size);
00446 TXBufferCurrentPositionHandler += details.size;
00447
00448
00449 PPAGE = oldFlashPage;
00450
00451 checksumAndSend();
00452 break;
00453 }
00454 case burnBlockFromRamToFlash:
00455 {
00456
00457 writeAlignedBlock((unsigned short*)0x7c00, (unsigned short*)0xc000);
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488 sendDebug("Burn Ran!");
00489 break;
00490 }
00491 case adjustMainTableCell:
00492 {
00493
00494
00495
00496
00497 mainTable aTable;
00498 validateMainTable(&aTable);
00499
00500 setPagedMainTableCellValue(&TablesA.VETableMain, 0, 0, 32768, currentFuelRPage);
00501
00502 sendError(unimplementedFunction);
00503 break;
00504 }
00505 case adjustMainTableRPMAxis:
00506 {
00507
00508
00509
00510
00511 mainTable aTable;
00512 validateMainTable(&aTable);
00513
00514 setPagedMainTableRPMValue(&TablesA.VETableMain, 0, 0, currentFuelRPage);
00515
00516 sendError(unimplementedFunction);
00517 break;
00518 }
00519 case adjustMainTableLoadAxis:
00520 {
00521
00522
00523
00524
00525 mainTable aTable;
00526 validateMainTable(&aTable);
00527
00528 setPagedMainTableLoadValue(&TablesA.VETableMain, 0, 0, currentFuelRPage);
00529
00530 sendError(unimplementedFunction);
00531 break;
00532 }
00533 case adjust2dTableAxis:
00534
00535
00536
00537
00538
00539
00540 sendError(unimplementedFunction);
00541 break;
00542 case adjust2dTableCell:
00543
00544
00545
00546
00547
00548
00549 sendError(unimplementedFunction);
00550 break;
00551 case replace2dTableInRAM:
00552 {
00553
00554
00555 twoDTableUS aTable;
00556 validateTwoDTable(&aTable);
00557
00558 sendError(unimplementedFunction);
00559 break;
00560 }
00561 case requestBasicDatalog:
00562
00563 sendError(unimplementedFunction);
00564 break;
00565 case requestAdjustableDatalog:
00566
00567 sendError(unimplementedFunction);
00568 break;
00569 case forwardPacketOverCAN:
00570
00571 sendError(unimplementedFunction);
00572 break;
00573 case forwardPacketOverUART:
00574
00575 sendError(unimplementedFunction);
00576 break;
00577 default:
00578 if((RXHeaderPayloadID % 2) == 1){
00579 sendError(invalidFirmwarePayloadID);
00580 }else{
00581 sendError(unrecognisedFirmwarePayloadID);
00582 }
00583 }
00584 }
00585
00586 resetReceiveState(CLEAR_ALL_SOURCE_ID_FLAGS);
00587 PORTK |= BIT0;
00588 }
00589
00590
00591
00592
00593
00594 void lookupBlockDetails(unsigned short locationID, blockDetails* details){
00595
00596 details->RAMPage = 0;
00597 details->FlashPage = 0;
00598 details->RAMAddress = 0;
00599 details->FlashAddress = 0;
00600
00601
00602 details->size = MAINTABLE_SIZE;
00603
00604
00605 switch (locationID) {
00606 case FixedConfigLocationID:
00607 details->FlashPage = PPAGE;
00608 details->FlashAddress = (void*)&fixedConfigs;
00609 break;
00610 case FixedConfig2LocationID:
00611 details->FlashPage = PPAGE;
00612 details->FlashAddress = (void*)&fixedConfigs2;
00613 break;
00614 case IATTransferTableLocationID:
00615 details->size = TransferTableSize;
00616 details->FlashPage = PPAGE;
00617 details->FlashAddress = (void*)&IATTransferTable;
00618 break;
00619 case CHTTransferTableLocationID:
00620 details->size = TransferTableSize;
00621 details->FlashPage = PPAGE;
00622 details->FlashAddress = (void*)&CHTTransferTable;
00623 break;
00624 case MAFTransferTableLocationID:
00625 details->size = TransferTableSize;
00626 details->FlashPage = PPAGE;
00627 details->FlashAddress = (void*)&MAFTransferTable;
00628 break;
00629 case VETableMainFlashLocationID:
00630 details->RAMPage = RPAGE_FUEL_ONE;
00631 details->FlashPage = BIGTABLES_PPAGE;
00632 details->RAMAddress = (void*)&TablesA;
00633 details->FlashAddress = (void*)&VETableMainFlash;
00634 break;
00635 case VETableMainFlash2LocationID:
00636 details->RAMPage = RPAGE_FUEL_TWO;
00637 details->FlashPage = BIGTABLES_PPAGE;
00638 details->RAMAddress = (void*)&TablesA;
00639 details->FlashAddress = (void*)&VETableMainFlash2;
00640 break;
00641 case VETableSecondaryFlashLocationID:
00642 details->RAMPage = RPAGE_FUEL_ONE;
00643 details->FlashPage = BIGTABLES_PPAGE;
00644 details->RAMAddress = (void*)&TablesB;
00645 details->FlashAddress = (void*)&VETableSecondaryFlash;
00646 break;
00647 case VETableSecondaryFlash2LocationID:
00648 details->RAMPage = RPAGE_FUEL_TWO;
00649 details->FlashPage = BIGTABLES_PPAGE;
00650 details->RAMAddress = (void*)&TablesB;
00651 details->FlashAddress = (void*)&VETableSecondaryFlash2;
00652 break;
00653 case VETableTertiaryFlashLocationID:
00654 details->RAMPage = RPAGE_FUEL_ONE;
00655 details->FlashPage = BIGTABLES_PPAGE;
00656 details->RAMAddress = (void*)&TablesC;
00657 details->FlashAddress = (void*)&VETableTertiaryFlash;
00658 break;
00659 case VETableTertiaryFlash2LocationID:
00660 details->RAMPage = RPAGE_FUEL_TWO;
00661 details->FlashPage = BIGTABLES_PPAGE;
00662 details->RAMAddress = (void*)&TablesC;
00663 details->FlashAddress = (void*)&VETableTertiaryFlash2;
00664 break;
00665 case LambdaTableFlashLocationID:
00666 details->RAMPage = RPAGE_FUEL_ONE;
00667 details->FlashPage = BIGTABLES_PPAGE;
00668 details->RAMAddress = (void*)&TablesD;
00669 details->FlashAddress = (void*)&LambdaTableFlash;
00670 break;
00671 case LambdaTableFlash2LocationID:
00672 details->RAMPage = RPAGE_FUEL_TWO;
00673 details->FlashPage = BIGTABLES_PPAGE;
00674 details->RAMAddress = (void*)&TablesD;
00675 details->FlashAddress = (void*)&LambdaTableFlash2;
00676 break;
00677 case IgnitionAdvanceTableMainFlashLocationID:
00678 details->RAMPage = RPAGE_TIME_ONE;
00679 details->FlashPage = BIGTABLES_PPAGE;
00680 details->RAMAddress = (void*)&TablesA;
00681 details->FlashAddress = (void*)&IgnitionAdvanceTableMainFlash;
00682 break;
00683 case IgnitionAdvanceTableMainFlash2LocationID:
00684 details->RAMPage = RPAGE_TIME_TWO;
00685 details->FlashPage = BIGTABLES_PPAGE;
00686 details->RAMAddress = (void*)&TablesA;
00687 details->FlashAddress = (void*)&IgnitionAdvanceTableMainFlash2;
00688 break;
00689 case IgnitionAdvanceTableSecondaryFlashLocationID:
00690 details->RAMPage = RPAGE_TIME_ONE;
00691 details->FlashPage = BIGTABLES_PPAGE;
00692 details->RAMAddress = (void*)&TablesB;
00693 details->FlashAddress = (void*)&IgnitionAdvanceTableSecondaryFlash;
00694 break;
00695 case IgnitionAdvanceTableSecondaryFlash2LocationID:
00696 details->RAMPage = RPAGE_TIME_TWO;
00697 details->FlashPage = BIGTABLES_PPAGE;
00698 details->RAMAddress = (void*)&TablesB;
00699 details->FlashAddress = (void*)&IgnitionAdvanceTableSecondaryFlash2;
00700 break;
00701 case InjectionAdvanceTableMainFlashLocationID:
00702 details->RAMPage = RPAGE_TIME_ONE;
00703 details->FlashPage = BIGTABLES_PPAGE;
00704 details->RAMAddress = (void*)&TablesC;
00705 details->FlashAddress = (void*)&InjectionAdvanceTableMainFlash;
00706 break;
00707 case InjectionAdvanceTableMainFlash2LocationID:
00708 details->RAMPage = RPAGE_TIME_TWO;
00709 details->FlashPage = BIGTABLES_PPAGE;
00710 details->RAMAddress = (void*)&TablesC;
00711 details->FlashAddress = (void*)&InjectionAdvanceTableMainFlash2;
00712 break;
00713 case InjectionAdvanceTableSecondaryFlashLocationID:
00714 details->RAMPage = RPAGE_TIME_ONE;
00715 details->FlashPage = BIGTABLES_PPAGE;
00716 details->RAMAddress = (void*)&TablesD;
00717 details->FlashAddress = (void*)&InjectionAdvanceTableSecondaryFlash;
00718 break;
00719 case InjectionAdvanceTableSecondaryFlash2LocationID:
00720 details->RAMPage = RPAGE_TIME_TWO;
00721 details->FlashPage = BIGTABLES_PPAGE;
00722 details->RAMAddress = (void*)&TablesD;
00723 details->FlashAddress = (void*)&InjectionAdvanceTableSecondaryFlash2;
00724 break;
00725 case SmallTablesAFlashLocationID:
00726 details->RAMPage = RPAGE_TUNE_ONE;
00727 details->FlashPage = PPAGE;
00728 details->RAMAddress = (void*)&TablesA;
00729 details->FlashAddress = (void*)&SmallTablesAFlash;
00730 break;
00731 case SmallTablesAFlash2LocationID:
00732 details->RAMPage = RPAGE_TUNE_TWO;
00733 details->FlashPage = PPAGE;
00734 details->RAMAddress = (void*)&TablesA;
00735 details->FlashAddress = (void*)&SmallTablesAFlash2;
00736 break;
00737 case SmallTablesBFlashLocationID:
00738 details->RAMPage = RPAGE_TUNE_ONE;
00739 details->FlashPage = PPAGE;
00740 details->RAMAddress = (void*)&TablesB;
00741 details->FlashAddress = (void*)&SmallTablesBFlash;
00742 break;
00743 case SmallTablesBFlash2LocationID:
00744 details->RAMPage = RPAGE_TUNE_TWO;
00745 details->FlashPage = PPAGE;
00746 details->RAMAddress = (void*)&TablesB;
00747 details->FlashAddress = (void*)&SmallTablesBFlash2;
00748 break;
00749 case SmallTablesCFlashLocationID:
00750 details->RAMPage = RPAGE_TUNE_ONE;
00751 details->FlashPage = PPAGE;
00752 details->RAMAddress = (void*)&TablesC;
00753 details->FlashAddress = (void*)&SmallTablesCFlash;
00754 break;
00755 case SmallTablesCFlash2LocationID:
00756 details->RAMPage = RPAGE_TUNE_TWO;
00757 details->FlashPage = PPAGE;
00758 details->RAMAddress = (void*)&TablesC;
00759 details->FlashAddress = (void*)&SmallTablesCFlash2;
00760 break;
00761 case SmallTablesDFlashLocationID:
00762 details->RAMPage = RPAGE_TUNE_ONE;
00763 details->FlashPage = PPAGE;
00764 details->RAMAddress = (void*)&TablesD;
00765 details->FlashAddress = (void*)&SmallTablesDFlash;
00766 break;
00767 case SmallTablesDFlash2LocationID:
00768 details->RAMPage = RPAGE_TUNE_TWO;
00769 details->FlashPage = PPAGE;
00770 details->RAMAddress = (void*)&TablesD;
00771 details->FlashAddress = (void*)&SmallTablesDFlash2;
00772 break;
00773 }
00774 }
00775
00776
00777
00778 void sendError(unsigned short errorCode){
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796 TXBufferCurrentPositionHandler = (unsigned char*)&TXBuffer;
00797
00798
00799
00800 *TXBufferCurrentPositionHandler = 0x01;
00801 TXBufferCurrentPositionHandler++;
00802
00803 *((unsigned short*)TXBufferCurrentPositionHandler) = asyncErrorCodePacket;
00804 TXBufferCurrentPositionHandler += 2;
00805
00806 *((unsigned short*)TXBufferCurrentPositionHandler) = errorCode;
00807 TXBufferCurrentPositionHandler += 2;
00808 checksumAndSend();
00809
00810 }
00811
00812
00813
00814 void sendDebug(unsigned char* message){
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838 TXBufferCurrentPositionHandler = (unsigned char*)&TXBuffer;
00839
00840
00841 *TXBufferCurrentPositionHandler = 0x11;
00842 TXBufferCurrentPositionHandler++;
00843
00844
00845 *((unsigned short*)TXBufferCurrentPositionHandler) = asyncDebugInfoPacket;
00846 TXBufferCurrentPositionHandler += 2;
00847
00848
00849 unsigned short* TXLength = (unsigned short*)TXBufferCurrentPositionHandler;
00850 TXBufferCurrentPositionHandler += 2;
00851
00852
00853 unsigned short messageLength = stringCopy(TXBufferCurrentPositionHandler, message);
00854 *TXLength = messageLength;
00855 TXBufferCurrentPositionHandler += messageLength;
00856
00857 checksumAndSend();
00858
00859 }
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920