web.c

Go to the documentation of this file.
00001 // ////////////////////////////////////////////////////////////////////////////
00002 // ////////////////////////////////////////////////////////////////////////////
00013 // ////////////////////////////////////////////////////////////////////////////
00014 // ////////////////////////////////////////////////////////////////////////////
00015 
00016     #define     WEB_C
00017     #include    "web.h"
00018     #include    "webprocess.h"
00019     #include    "config.h"
00020     #include    "xml.h"
00021 
00022     #include    "projectdefs.h"
00023 
00024 
00025 // ////////////////////////////////////////////////////////////////////////////
00026 // Local Defines
00027 // ////////////////////////////////////////////////////////////////////////////
00028 
00029 #define WEB_STACKSIZE   200
00030 
00031 // ////////////////////////////////////////////////////////////////////////////
00032 // Local Typedefs
00033 // ////////////////////////////////////////////////////////////////////////////
00034 
00035 typedef enum
00036 {
00037     VAR_PROTO_ACTIVATE_REQ = 0,
00038     VAR_PROTO_NAME_REQ,
00039     VAR_PROTO_BUS_REQ,
00040     VAR_PROTO_REQ,
00041     VAR_PROTO_MINADD_REQ,
00042     VAR_PROTO_MAXADD_REQ,
00043     VAR_PROTO_SPEC1_REQ,
00044     VAR_PROTO_SPEC2_REQ,
00045     VAR_PROTO_REQ_COUNT
00046 } PROTO_REQ_VARS;
00047 
00048 typedef enum
00049 {
00050     VAR_SET_NR_REQ = 0,
00051     VAR_SET_ACTIVATE_REQ,
00052     VAR_SET_NAME_REQ,
00053     VAR_SET_ADDRESS_REQ,
00054     VAR_SET_SETTINGS,
00055     VAR_SET_REQ_COUNT
00056 } SET_REQ_VARS;
00057 
00058 typedef enum
00059 {
00060     NAV_CLOSE = 0,
00061     NAV_SUBNAV,
00062     NAV_END,
00063     NAV_SUBNAVEND
00064 } NAV_CONTROL;
00065 
00066 typedef struct
00067 {
00068     WORD u16StringId;
00069     ROM BYTE * pFilename;
00070     NAV_CONTROL eNavControl;
00071 } sNavigation;
00072 
00073 
00074 // ////////////////////////////////////////////////////////////////////////////
00075 // Local Variables
00076 // ////////////////////////////////////////////////////////////////////////////
00077 
00078 static BYTE str[WEB_STACKSIZE];
00079 static BYTE * pStr;
00080 static BYTE _currentProcessingIdx = 0;
00081 
00082 ROM sNavigation _asROMNavigation[] =
00083 {
00084     PROJECT_WEBSITES
00085 };
00086 
00087 
00089 // Local Function Prototypes
00091 
00092 static BYTE _u8OptionROM(auto BOOL bSel, auto BYTE u8Val, auto char * pu8Dest, auto ROM BYTE * pu8String);
00093 static BYTE _u8RadioROM(auto ROM BYTE * pu8Name, auto DWORD u32Val, auto BOOL bSel, auto BYTE * pu8Dest);
00094 static void _loadNavigation(WORD u16NavId, ROM sNavigation * pNavEntry);
00095 
00096 #ifdef _SRCP
00097 static BYTE _u8Option(auto BOOL bSel, auto BYTE u8Val, auto char * pu8Dest, auto BYTE * pu8String);
00098 static BYTE _u8CheckboxROM(auto ROM BYTE * pu8Name, auto BYTE u8Val, auto BOOL bSel, auto BYTE * pu8Dest);
00099 static BYTE _u8TextROM(auto ROM BYTE * pu8Name, auto BYTE * pu8Val, auto BYTE u8Size, auto BYTE * pu8Dest);
00100 static BYTE _u8Radio(auto BYTE * pu8Name, auto DWORD u32Val, auto BOOL bSel, auto BYTE * pu8Dest);
00101 static BYTE _u8HiddenROM(auto ROM BYTE * pu8Name, auto BYTE u8Val, auto BYTE * pu8Dest);
00102 #endif
00103 
00104 // ////////////////////////////////////////////////////////////////////////////
00105 // ////////////////////////////////////////////////////////////////////////////
00106 
00107 void HTTPPrint_string(WORD u16StringId)
00108 {
00109     TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(u16StringId));
00110 }
00111 
00112 // ////////////////////////////////////////////////////////////////////////////
00113 // ////////////////////////////////////////////////////////////////////////////
00114 
00115 void HTTPPrint_header(WORD u16NavId)
00116 {
00117     if(curHTTP.callbackPos == 0)
00118     {
00119         // Include the head line.
00120         TCPPutROMString(sktHTTP, (ROM BYTE *)"<h1>eWicht ");
00121         TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(STRTBLID_CONFIGURATION));
00122         TCPPutROMString(sktHTTP, (ROM BYTE *)"</h1>");
00123 
00124         // Include the navigation.
00125         TCPPutROMString(sktHTTP, (ROM BYTE *)"<ul id=\"nav\">");
00126     }
00127 
00128     if (curHTTP.callbackPos < sizeof(_asROMNavigation)/sizeof(sNavigation))
00129     {
00130         _loadNavigation(u16NavId, &_asROMNavigation[curHTTP.callbackPos++]);
00131     }
00132     else
00133         curHTTP.callbackPos = 0;
00134 }
00135 
00136 // ////////////////////////////////////////////////////////////////////////////
00137 // ////////////////////////////////////////////////////////////////////////////
00138 
00139 static void _loadNavigation(WORD u16NavId, ROM sNavigation * pNavEntry)
00140 {
00141     TCPPutROMString(sktHTTP, (ROM BYTE *)"<li><a ");
00142     if(u16NavId == pNavEntry->u16StringId)
00143     {
00144         TCPPutROMString(sktHTTP, (ROM BYTE *)"class=\"active\" ");
00145     }
00146     TCPPutROMString(sktHTTP, (ROM BYTE *)"href=\"");
00147     TCPPutROMString(sktHTTP, pNavEntry->pFilename);
00148     TCPPutROMString(sktHTTP, (ROM BYTE *)"\">");
00149     TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(pNavEntry->u16StringId));
00150     TCPPutROMString(sktHTTP, (ROM BYTE *)"</a>");
00151 
00152     switch(pNavEntry->eNavControl)
00153     {
00154     case NAV_CLOSE:
00155         TCPPutROMString(sktHTTP, (ROM BYTE *)"</li>");
00156         break;
00157     case NAV_SUBNAV:
00158         TCPPutROMString(sktHTTP, (ROM BYTE *)"<ul>");
00159         break;
00160     case NAV_SUBNAVEND:
00161         TCPPutROMString(sktHTTP, (ROM BYTE *)"</li></ul></li>");
00162         break;
00163     case NAV_END:
00164         TCPPutROMString(sktHTTP, (ROM BYTE *)"</li></ul>");
00165         break;
00166     }
00167 }
00168 
00169 // ////////////////////////////////////////////////////////////////////////////
00170 // ////////////////////////////////////////////////////////////////////////////
00171 
00172 void HTTPPrint_version(WORD u16Pos)
00173 {
00174     // Determine the version digit.
00175     switch(u16Pos)
00176     {
00177     case VAR_FIRMWARE_VERSION_MAJOR:
00178         TCPPut(sktHTTP, FIRMWARE_VERSION_MAJOR+0x30);
00179         break;
00180 
00181     case VAR_FIRMWARE_VERSION_MINOR:
00182         TCPPut(sktHTTP, FIRMWARE_VERSION_MINOR+0x30);
00183         break;
00184 
00185     case VAR_FIRMWARE_VERSION_STRING:
00186         TCPPutROMString(sktHTTP, (ROM char *) PROJECT_NAME " ");
00187         TCPPutROMString(sktHTTP, (ROM char *) FIRMWARE_VERSION_STRING " ");
00188         TCPPutROMString(sktHTTP, (ROM char*)__DATE__);
00189         break;
00190 
00191     case VAR_BOOTLOADER_VERSION:
00192         {
00193             LONG version;
00194 
00195             memcpypgm2ram((void *)&version, BOOTVERSION, sizeof(version));
00196 
00197             // First bootloader had no version id (only unwritten flash with value -1).
00198             // Handle this version like version 1:
00199             if (version == -1)
00200             {
00201                 version = 1;
00202             }
00203 
00204             sprintf(str, (ROM char *)"%lu", version);
00205             TCPPutString(sktHTTP, str);
00206         }
00207         break;
00208     }
00209 }
00210 
00211 // ////////////////////////////////////////////////////////////////////////////
00212 // ////////////////////////////////////////////////////////////////////////////
00213 
00214 void HTTPPrint_macaddress(void)
00215 {
00216     // Format the entire string
00217     BYTE i = 0;
00218     while(1)
00219     {
00220         TCPPut(sktHTTP, btohexa_high(pu8MAC[i]));
00221         TCPPut(sktHTTP, btohexa_low(pu8MAC[i]));
00222 
00223         if(++i == 6)
00224         {
00225             break;
00226         }
00227         TCPPut(sktHTTP, '-');
00228     }
00229 }
00230 
00231 // ////////////////////////////////////////////////////////////////////////////
00232 // ////////////////////////////////////////////////////////////////////////////
00233 
00234 void HTTPPrint_ip(WORD u16Pos)
00235 {
00236     // Format the entire string
00237     BYTE i;
00238     DWORD helper = 0;
00239     BYTE * pDataSource = (BYTE*) &helper;
00240 
00241     switch(u16Pos)
00242     {
00243         case VAR_IP_ADDRESS:
00244             pDataSource = (BYTE*)&sIPConfig.MyIPAddr;
00245             break;
00246 
00247         case VAR_SUBNET_MASK:
00248             pDataSource = (BYTE*)&sIPConfig.MyMask;
00249             break;
00250 
00251         case VAR_GATEWAY_ADDRESS:
00252             pDataSource = (BYTE*)&sIPConfig.MyGateway;
00253             break;
00254 
00255         case VAR_CONNECTED_SERVER_IP:
00256             if (ApplIsConnected())
00257             {
00258                 pDataSource = (BYTE*)ApplGetServerIP();
00259             }
00260             break;
00261 
00262         case VAR_MAN_IP_ADDRESS:
00263             pDataSource = (BYTE*)&sPCommonConfig.ManIPAddr;
00264             break;
00265 
00266         case VAR_MAN_SUBNET_MASK:
00267             helper = IPConvertSubnetToMask(sPCommonConfig.ManMask);
00268             break;
00269 
00270         case VAR_MAN_GATEWAY_ADDRESS:
00271             pDataSource = (BYTE*)&sPCommonConfig.ManGateway;
00272             break;
00273 
00274         case VAR_SERVER_IP:
00275             pDataSource = (BYTE*)&sPApplConfig.sSrvIPAdd;
00276             break;
00277 
00278         case VAR_IP_ADDRESS_EEPROM:
00279             XEEReadArray(BOOTUP_EEPROM_ADD+offsetof(PCOMMON_CONFIG, ManIPAddr), (BYTE *)&helper, sizeof(IP_ADDR));
00280             break;
00281 
00282         case VAR_SUBNET_MASK_EEPROM:
00283             XEEReadArray(BOOTUP_EEPROM_ADD+offsetof(PCOMMON_CONFIG, ManMask), &i, 1);
00284             helper = IPConvertSubnetToMask(i);
00285             break;
00286 
00287         case VAR_GATEWAY_ADDRESS_EEPROM:
00288             XEEReadArray(BOOTUP_EEPROM_ADD+offsetof(PCOMMON_CONFIG, ManGateway), (BYTE *)&helper, sizeof(IP_ADDR));
00289             break;
00290 
00291         case VAR_SERVER_IP_EEPROM:
00292             XEEReadArray(APPL_EEPROM_ADD+offsetof(SPAPPLDATA, sSrvIPAdd), (BYTE *)&helper, sizeof(IP_ADDR));
00293             break;
00294     }
00295         
00296     if (pDataSource==0)
00297     {
00298         TCPPutROMString(sktHTTP,(ROM char*)"0.0.0.0");
00299     }
00300     else
00301     {
00302         i = 0;
00303         
00304         while(1)
00305         {
00306             itoa((WORD)*pDataSource++, str);
00307             TCPPutString(sktHTTP,str);
00308             if(++i == 4)
00309             {
00310                 break;
00311             }
00312             TCPPut(sktHTTP, '.');
00313         }
00314     }
00315 }
00316 
00317 // ////////////////////////////////////////////////////////////////////////////
00318 // ////////////////////////////////////////////////////////////////////////////
00319 
00320 void HTTPPrint_addressmode(void)
00321 {
00322     if(sPCommonConfig.Flags.bIsDHCPEnabled)
00323     {
00324         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_AUTO));
00325     }
00326     else
00327     {
00328         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_MANUAL));
00329     }
00330 }
00331 
00332 // ////////////////////////////////////////////////////////////////////////////
00333 // ////////////////////////////////////////////////////////////////////////////
00334 
00335 void HTTPPrint_askforaddressmode(void)
00336 {
00337     sIPFlags flags;
00338     XEEReadArray(BOOTUP_EEPROM_ADD+offsetof(PCOMMON_CONFIG, Flags), (BYTE *)&flags, sizeof(sIPFlags));
00339 
00340 
00341     _u8RadioROM((ROM char *)"ubm", TRUE, flags.bIsDHCPEnabled==TRUE, str);
00342     TCPPutString(sktHTTP, str);
00343     TCPPut(sktHTTP, ' ');
00344     TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_AUTO));
00345 
00346     TCPPutROMString(sktHTTP,(ROM char *)"<br>");
00347 
00348     _u8RadioROM((ROM char *)"ubm", FALSE, flags.bIsDHCPEnabled==FALSE, str);
00349     TCPPutString(sktHTTP, str);
00350     TCPPut(sktHTTP, ' ');
00351     TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_MANUAL));
00352 }
00353 
00354 // ////////////////////////////////////////////////////////////////////////////
00355 // ////////////////////////////////////////////////////////////////////////////
00356 
00357 void HTTPPrint_hostname(void)
00358 {
00359     TCPPutROMString(sktHTTP, HOSTNAME);
00360 }
00361 
00362 // ////////////////////////////////////////////////////////////////////////////
00363 // ////////////////////////////////////////////////////////////////////////////
00364 
00365 void HTTPPrint_mdns(void)
00366 {
00367     if(eGetMDNSState() == MDNS_HAS_STOPPED)
00368     {
00369         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_INACTIVE));
00370     }
00371     else
00372     {
00373         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_ACTIVE));
00374     }
00375 }
00376 
00377 // ////////////////////////////////////////////////////////////////////////////
00378 // ////////////////////////////////////////////////////////////////////////////
00379 
00380 void HTTPPrint_connection(void)
00381 {
00382     if (ApplIsConnected()==TRUE)
00383     {
00384         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_ACTIVE));
00385     }
00386     else
00387     {
00388         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_INACTIVE));
00389     }
00390 }
00391 
00392 // ////////////////////////////////////////////////////////////////////////////
00393 // ////////////////////////////////////////////////////////////////////////////
00394 
00395 void HTTPPrint_serverport(void)
00396 {
00397     WORD port = ApplGetServerPort().Val;
00398     if (ApplIsConnected()==FALSE)
00399     {
00400         port = 0;
00401     }
00402     sprintf(str, (ROM char *) "%5hu", port);
00403     TCPPutString(sktHTTP, str);
00404 }
00405 
00406 // ////////////////////////////////////////////////////////////////////////////
00407 // ////////////////////////////////////////////////////////////////////////////
00408 
00409 void HTTPPrint_locodir(void)
00410 {
00411     if (sPApplConfig.sFlags.bToggleLocoDirMode==TOGGLEDIRMODE_CLICK)
00412     {
00413         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_CLICK));
00414     }
00415     else
00416     {
00417         TCPPutROMString(sktHTTP,StrTbl_cau8GetStringPointer(STRTBLID_ZEROPOINT));
00418     }
00419 }
00420 
00421 // ////////////////////////////////////////////////////////////////////////////
00422 // ////////////////////////////////////////////////////////////////////////////
00423 
00424 void HTTPPrint_toggledir(void)
00425 {
00426     WORD len = TCPIsPutReady(sktHTTP);
00427     BOOL bFlag = FALSE;
00428 
00429     if(curHTTP.callbackPos == 0)
00430     {
00431         pStr = str;
00432         curHTTP.callbackPos = 
00433             _u8OptionROM(!sPApplConfig.sFlags.bToggleLocoDirMode, 
00434                          TOGGLEDIRMODE_CLICK, 
00435                          pStr, 
00436                          StrTbl_cau8GetStringPointer(STRTBLID_CLICK));
00437 
00438         curHTTP.callbackPos += 
00439             _u8OptionROM(sPApplConfig.sFlags.bToggleLocoDirMode, 
00440                          TOGGLEDIRMODE_ZERO, 
00441                          &pStr[curHTTP.callbackPos],
00442                          StrTbl_cau8GetStringPointer(STRTBLID_ZEROPOINT));
00443     }
00444 
00445     if (len > curHTTP.callbackPos)
00446     {
00447         len = curHTTP.callbackPos;
00448     }
00449 
00450     TCPPutArray(sktHTTP, pStr, len);
00451     pStr+=len;
00452     curHTTP.callbackPos-= len;
00453 }
00454 
00455 // ////////////////////////////////////////////////////////////////////////////
00456 // ////////////////////////////////////////////////////////////////////////////
00457 
00458 void HTTPPrint_xmllanguage(void)
00459 {
00460     sprintf(str, 
00461             (ROM char *)"%hhu", 
00462             sPCommonConfig.u8LanguageID);
00463     TCPPutString(sktHTTP, str);
00464 }
00465 
00466 // ////////////////////////////////////////////////////////////////////////////
00467 // ////////////////////////////////////////////////////////////////////////////
00468 
00469 void HTTPPrint_ledlight(void)
00470 {
00471     sprintf(str, (ROM char *)"%hhu", sPCommonConfig.u8LCDLight);
00472     TCPPutString(sktHTTP, str);
00473 }
00474 
00475 // ////////////////////////////////////////////////////////////////////////////
00476 // ////////////////////////////////////////////////////////////////////////////
00477 
00478 void HTTPPrint_xmlip(void)
00479 {
00480     TCPPutROMString(sktHTTP, (ROM char *)"autoip=\"");
00481 
00482     if (sPCommonConfig.Flags.bIsDHCPEnabled == TRUE)
00483     {
00484         // No IP settings if DHCP (resp. AutoIP) is enabled.
00485         TCPPut(sktHTTP, '1');
00486     }
00487     else
00488     {
00489         TCPPut(sktHTTP, '0');
00490         TCPPutROMString(sktHTTP, (ROM char *)"ip=\"");
00491         HTTPPrint_ip(VAR_MAN_IP_ADDRESS);
00492         TCPPutROMString(sktHTTP, (ROM char *)"\" sub=\"");
00493         HTTPPrint_ip(VAR_MAN_SUBNET_MASK);
00494         TCPPutROMString(sktHTTP, (ROM char *)"\" gate=\"");
00495         HTTPPrint_ip(VAR_MAN_GATEWAY_ADDRESS);
00496     }
00497     TCPPut(sktHTTP, '\"');
00498 }
00499 
00500 // ////////////////////////////////////////////////////////////////////////////
00501 // ////////////////////////////////////////////////////////////////////////////
00502 
00503 void HTTPPrint_xmltoggle(void)
00504 {
00505     str[0] = '0';
00506     str[1] = 0;
00507     if (sPApplConfig.sFlags.bToggleLocoDirMode)
00508     {
00509         str[0] = '1';
00510     }
00511     TCPPutString(sktHTTP, str);
00512 }
00513 
00514 // ////////////////////////////////////////////////////////////////////////////
00515 // ////////////////////////////////////////////////////////////////////////////
00516 
00517 void HTTPPrint_serverurl(void)
00518 {
00519     SEARCH_MODE mode;
00520     XEEReadArray(APPL_EEPROM_ADD + offsetof(SPAPPLDATA, eFindMode), (BYTE *)&mode, sizeof(SEARCH_MODE));
00521 
00522     switch(mode)
00523     {
00524         case SEARCH_UNKNOWN:
00525             return;
00526         
00527         case SEARCH_IP:
00528             {
00529                 WORD port;
00530                 HTTPPrint_ip(VAR_SERVER_IP_EEPROM);
00531                 XEEReadArray(APPL_EEPROM_ADD + offsetof(SPAPPLDATA, sIPPort), (BYTE *)&port, 2);
00532                 sprintf(str, (ROM char *)":%hu", port);
00533             }
00534             break;
00535 
00536         case SEARCH_NAME:
00537             {
00538                 WORD port;
00539                 XEEReadArray(APPL_EEPROM_ADD + offsetof(SPAPPLDATA, au8Name), str, LCD_CHARS_IN_A_ROW+1);
00540                 XEEReadArray(APPL_EEPROM_ADD + offsetof(SPAPPLDATA, sNamePort), (BYTE *)&port, 2);
00541                 sprintf(&str[strlen(str)], (ROM char *)":%hu", port);
00542             }
00543             break;
00544 
00545         case SEARCH_SERVICE:
00546             XEEReadArray(APPL_EEPROM_ADD + offsetof(SPAPPLDATA, au8Service), str, LCD_CHARS_IN_A_ROW+1);
00547             break;
00548     }
00549 
00550 
00551     TCPPutString(sktHTTP, str);
00552 }
00553 
00554 // ////////////////////////////////////////////////////////////////////////////
00555 // ////////////////////////////////////////////////////////////////////////////
00556 
00557 void HTTPPrint_language(void)
00558 {
00559     WORD len = TCPIsPutReady(sktHTTP);
00560     BOOL bFlag = FALSE;
00561 
00562     if(curHTTP.callbackPos == 0)
00563     {
00564         pStr = str;
00565         
00566         curHTTP.callbackPos = 
00567             _u8OptionROM(sPCommonConfig.u8LanguageID==LANGID_GERMAN, 
00568                          LANGID_GERMAN,
00569                          pStr, 
00570                          StrTbl_cau8GetLanguageStringPointer(LANGID_GERMAN, STRTBLID_LANGUAGE_NAME));
00571 
00572         curHTTP.callbackPos += 
00573             _u8OptionROM(sPCommonConfig.u8LanguageID==LANGID_ENGLISH, 
00574                          LANGID_ENGLISH,
00575                          &pStr[curHTTP.callbackPos],
00576                          StrTbl_cau8GetLanguageStringPointer(LANGID_ENGLISH, STRTBLID_LANGUAGE_NAME));
00577     }
00578 
00579     if (len > curHTTP.callbackPos)
00580         len = curHTTP.callbackPos;
00581 
00582     TCPPutArray(sktHTTP, pStr, len);
00583     pStr+=len;
00584     curHTTP.callbackPos -= len;
00585 }
00586 
00587 
00588 // ////////////////////////////////////////////////////////////////////////////
00589 #ifdef _SRCP
00590 // ////////////////////////////////////////////////////////////////////////////
00591 
00592 #include "srcp.h"
00593 
00594 void HTTPPrint_locoproto(void)
00595 {
00596     if (sPSRCPConfig.sFlags.bGLAskForProto == TRUE)
00597     {
00598         TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(STRTBLID_ON));
00599     }
00600     else
00601     {
00602         TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(STRTBLID_OFF));
00603     }
00604 }
00605 
00606 // ////////////////////////////////////////////////////////////////////////////
00607 // ////////////////////////////////////////////////////////////////////////////
00608 
00609 void HTTPPrint_accproto(void)
00610 {
00611     if (sPSRCPConfig.sFlags.bGAAskForProto == TRUE)
00612     {
00613         TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(STRTBLID_ON));
00614     }
00615     else
00616     {
00617         TCPPutROMString(sktHTTP, StrTbl_cau8GetStringPointer(STRTBLID_OFF));
00618     }
00619 }
00620 
00621 // ////////////////////////////////////////////////////////////////////////////
00622 // ////////////////////////////////////////////////////////////////////////////
00623 
00624 void HTTPPrint_xmldelay(void)
00625 {
00626     sprintf(str, (ROM char *) "%ld", sPSRCPConfig.s32GADelay);
00627     TCPPutString(sktHTTP, str);
00628 }
00629 
00630 // ////////////////////////////////////////////////////////////////////////////
00631 // ////////////////////////////////////////////////////////////////////////////
00632 
00633 void HTTPPrint_askfordelay(void)
00634 {
00635     BYTE num[20];
00636     sprintf(num, (ROM char *) "%ld", sPSRCPConfig.s32GADelay);
00637     _u8TextROM((ROM char *)"dV", num, 9, str);
00638             
00639     TCPPutString(sktHTTP, str);
00640 }
00641 
00642 // ////////////////////////////////////////////////////////////////////////////
00643 // ////////////////////////////////////////////////////////////////////////////
00644 
00645 void HTTPPrint_askforproto(WORD u16IsGL)
00646 {
00647     WORD len = TCPIsPutReady(sktHTTP);
00648     BOOL bFlag = FALSE;
00649 
00650     if (u16IsGL)
00651     {
00652         bFlag = sPSRCPConfig.sFlags.bGLAskForProto;
00653     }
00654     else
00655     {
00656         bFlag = sPSRCPConfig.sFlags.bGAAskForProto;
00657     }   
00658 
00659     if(curHTTP.callbackPos == 0)
00660     {
00661         pStr = str;
00662         curHTTP.callbackPos = 
00663             _u8OptionROM(!bFlag, 
00664                          0, 
00665                          pStr, 
00666                          StrTbl_cau8GetStringPointer(STRTBLID_OFF));
00667 
00668         curHTTP.callbackPos += _u8OptionROM(bFlag, 
00669                          1, 
00670                          &pStr[curHTTP.callbackPos],
00671                          StrTbl_cau8GetStringPointer(STRTBLID_ON));
00672     }
00673 
00674     if (len > curHTTP.callbackPos)
00675     {
00676         len = curHTTP.callbackPos;
00677     }
00678 
00679     TCPPutArray(sktHTTP, pStr, len);
00680     pStr+=len;
00681     curHTTP.callbackPos -= len;
00682 }
00683 
00684 // ////////////////////////////////////////////////////////////////////////////
00685 // ////////////////////////////////////////////////////////////////////////////
00686 
00687 void HTTPPrint_xmlproto(WORD u16Pos)
00688 {
00689     SPPROTOCOL protocoldata;
00690     WORD len;
00691 
00692     SRCP_GetProtoFromEEPROM((BYTE)u16Pos, &protocoldata);
00693 
00694     if (protocoldata.sFlags.bActive == FALSE)
00695     {
00696         return;
00697     }
00698 
00699     len = TCPIsPutReady(sktHTTP);
00700 
00701     TCPPutROMString(sktHTTP, (ROM char *) "\n<srcpproto ");
00702     sprintf(str, (ROM char *)" id=\"%hu\">\n\t<data", u16Pos);
00703     TCPPutString(sktHTTP, str);
00704 
00705     TCPPutROMString(sktHTTP, (ROM char *)" name=\"");
00706     XMLPutString(sktHTTP, protocoldata.au8Desc);
00707     TCPPut(sktHTTP, '\"');
00708 
00709     TCPPutROMString(sktHTTP, (ROM char *)" proto=\"");
00710     XMLPutString(sktHTTP, protocoldata.au8Proto);
00711     TCPPut(sktHTTP, '\"');
00712 
00713     sprintf(str, (ROM char *)" bus=\"%hhu\" minadd=\"%hu\" maxadd=\"%hu\"", 
00714             protocoldata.u8Bus, protocoldata.u16MinAdd, protocoldata.u16MaxAdd);
00715     TCPPutString(sktHTTP, str);
00716 
00717     // Check for accessory:
00718     if (u16Pos >= MAX_PROTO_SLOTS)
00719     {
00720         sprintf(str, (ROM char *) " minport=\"%hhu\" maxport=\"%hhu\"", 
00721             protocoldata.uSpec.sGA.u8MinP, protocoldata.uSpec.sGA.u8MaxP);
00722     }
00723     else
00724     {
00725         sprintf(str, (ROM char *) " steps=\"%hhu\" funcs=\"%hhu\"", 
00726             protocoldata.uSpec.sGL.u8MaxSteps, protocoldata.uSpec.sGL.u8NrFunc);
00727     }
00728 
00729     TCPPutString(sktHTTP, str);
00730     TCPPutROMString(sktHTTP, (ROM char *) "/></srcpproto>\n");
00731 }
00732 
00733 // ////////////////////////////////////////////////////////////////////////////
00734 // ////////////////////////////////////////////////////////////////////////////
00735 
00736 void HTTPPrint_xmlset(WORD u16SetIdx)
00737 {
00738     SPSET setdata;
00739     SRCP_GetSetFromEEPROM((BYTE)u16SetIdx, &setdata);
00740 
00741     if (setdata.sFlags.bActive == FALSE)
00742     {
00743         return;
00744     }
00745 
00746     TCPPutROMString(sktHTTP, (ROM char *) "\n<srcpdb ");
00747 
00748     sprintf(str, (ROM char *)"id=\"%hu\">\n\t<data", u16SetIdx);
00749     TCPPutString(sktHTTP, str);
00750     TCPPutROMString(sktHTTP, (ROM char *)" name=\"");
00751     XMLPutString(sktHTTP, setdata.au8Name);
00752     sprintf(str, (ROM char *)"\" bus=\"%hhu\"", setdata.u8BusNr);
00753     TCPPutString(sktHTTP, str);
00754     TCPPutROMString(sktHTTP, (ROM char *)" proto=\"");
00755     XMLPutString(sktHTTP, setdata.au8Proto);
00756     sprintf(str, (ROM char *)"\" add=\"%lu\"", setdata.u32Address);
00757     TCPPutString(sktHTTP, str);
00758 
00759     if (u16SetIdx & SRCP_EEPROMSET_GA_MASK)
00760     {
00761         sprintf(str, (ROM char *)" minport=\"%hu\" maxport=\"%hu\" delay=\"%ld\"", 
00762             setdata.uSpec.sGA.u8MinP, setdata.uSpec.sGA.u8MaxP, setdata.uSpec.sGA.s32Delay);
00763     }
00764     else
00765     {
00766         sprintf(str, (ROM char *)" steps=\"%hu\" funcs=\"%hu\" maxspeed=\"%hu\" togglemask=\"%lu\"", 
00767             setdata.uSpec.sGL.u8MaxSteps, setdata.uSpec.sGL.u8NrFunc, setdata.uSpec.sGL.u16MaxV, setdata.uSpec.sGL.u32FuncToggleMask);
00768     }
00769 
00770     TCPPutString(sktHTTP, str);
00771     TCPPutROMString(sktHTTP, (ROM char *) "/></srcpdb>\n");
00772 }
00773 
00774 // ////////////////////////////////////////////////////////////////////////////
00775 // ////////////////////////////////////////////////////////////////////////////
00776 
00777 static BYTE u8Colcount;
00778 static BOOL bStartNewCol;
00779 
00780 void HTTPPrint_eepromset(WORD u16SetIdx)
00781 {
00782     WORD len = TCPIsPutReady(sktHTTP);
00783 
00784     if(curHTTP.callbackPos == 0)
00785     {
00786         // First time here!
00787         u8Colcount = 0;
00788         bStartNewCol = TRUE;
00789 
00790         // Starting the row...
00791         strcpypgm2ram(str, (ROM char *) "<tr>");
00792         pStr = &str[4];
00793     }
00794 
00795     if (bStartNewCol == TRUE)   
00796     {
00797         SPSET setdata;
00798         BYTE num[6];
00799         SRCP_GetSetFromEEPROM(u16SetIdx, &setdata);
00800 
00801         strcpypgm2ram(pStr, (ROM char *) "<td>");
00802         pStr += 4;
00803 
00804         switch(u8Colcount++)
00805         {
00806             case VAR_SET_NR_REQ:
00807             {
00808                 BYTE nr = u16SetIdx & SRCP_EEPROMSET_IDX_MASK;
00809                 pStr += _u8HiddenROM((ROM BYTE *)"A", u16SetIdx, pStr);
00810                 pStr += sprintf(pStr, (ROM char *) "S%hu", nr+1);
00811                 break;
00812             }
00813 
00814             case VAR_SET_ACTIVATE_REQ:
00815                 pStr += _u8CheckboxROM((ROM char *)"c", 
00816                                     u16SetIdx, 
00817                                     (setdata.sFlags.bActive),
00818                                     pStr);
00819                 break;
00820 
00821             case VAR_SET_NAME_REQ:
00822                 pStr += _u8TextROM((ROM char *)"n", setdata.au8Name, SRCP_NAME_MAXLEN, pStr);
00823                 break;
00824 
00825             case VAR_SET_ADDRESS_REQ:
00826                 sprintf(num, (ROM char *) "%lu", setdata.u32Address);
00827                 pStr += _u8TextROM((ROM char *)"usm", num, 5, pStr);
00828                 break;
00829 
00830             case VAR_SET_SETTINGS:
00831                 if (setdata.sFlags.bGL == FALSE)
00832                 {
00833                     strcpypgm2ram(pStr, (ROM char *)"<a href=\"accset.htm?");
00834                 }
00835                 else
00836                 {
00837                     strcpypgm2ram(pStr, (ROM char *)"<a href=\"locoset.htm?");
00838                 }
00839 
00840                 pStr = &str[strlen(str)];
00841                 sprintf(pStr, (ROM char *)"%hhu\">%HS...</a>", u16SetIdx, StrTbl_cau8GetStringPointer(STRTBLID_CONFIGURE));
00842                 pStr = &str[strlen(str)];
00843                 pStr += _u8HiddenROM((ROM BYTE *)"E", u16SetIdx, pStr);
00844                 break;
00845         }
00846 
00847         strcpypgm2ram(pStr, (ROM char *) "</td>");
00848         pStr += 5;
00849 
00850         // Have we reached the last column?
00851         if (u8Colcount == VAR_PROTO_REQ_COUNT)
00852         {
00853             // Lets close the row!
00854             strcpypgm2ram(pStr, (ROM char *) "</tr>");
00855         }
00856 
00857         bStartNewCol = FALSE;
00858         curHTTP.callbackPos = strlen(str);
00859         pStr = str;
00860     }
00861 
00862 #ifdef __DEBUG
00863     if(curHTTP.callbackPos>WEB_STACKSIZE)
00864     {
00865         while(1);
00866     }
00867 #endif
00868 
00869     if (len > curHTTP.callbackPos)
00870     {
00871         len = curHTTP.callbackPos;
00872     }
00873 
00874     TCPPutArray(sktHTTP, pStr, len);
00875     curHTTP.callbackPos-= len;
00876 
00877     if (curHTTP.callbackPos == 0)
00878     {
00879         bStartNewCol = TRUE;
00880 
00881         if (u8Colcount == VAR_SET_REQ_COUNT)
00882         {
00883             // Finished writing the entire row.
00884             return;
00885         }
00886 
00887         // Ensure that the function is called again.
00888         curHTTP.callbackPos = 1;
00889     }
00890     else
00891     {
00892         pStr+=len;
00893     }
00894 }
00895 
00896 // ////////////////////////////////////////////////////////////////////////////
00897 // ////////////////////////////////////////////////////////////////////////////
00898 
00899 void HTTPPrint_protoreq(WORD u16Pos)
00900 {
00901     WORD len = TCPIsPutReady(sktHTTP);
00902 
00903     if(curHTTP.callbackPos == 0)
00904     {
00905         // First time here!
00906         u8Colcount = 0;
00907         bStartNewCol = TRUE;
00908     }
00909 
00910     if (bStartNewCol == TRUE)   
00911     {
00912         SPPROTOCOL protocoldata;
00913         BYTE num[6];
00914         SRCP_GetProtoFromEEPROM(u16Pos, &protocoldata);
00915 
00916         pStr = str;
00917         if (u8Colcount == 0)
00918         {
00919             strcpypgm2ram(pStr, (ROM char *) "<tr>");
00920             pStr = &str[4];
00921         }
00922 
00923         strcpypgm2ram(pStr, (ROM char *) "<td>");
00924         pStr += 4;
00925 
00926         switch(u8Colcount++)
00927         {
00928             case VAR_PROTO_ACTIVATE_REQ:
00929                 pStr += _u8HiddenROM((ROM BYTE *)"A", u16Pos, pStr);
00930                 pStr += _u8CheckboxROM((ROM char *)"c", 
00931                                        u16Pos, 
00932                                        protocoldata.sFlags.bActive, 
00933                                        pStr);
00934                 break;
00935 
00936             case VAR_PROTO_NAME_REQ:
00937                 pStr += _u8TextROM((ROM char *)"n", protocoldata.au8Desc, 16, pStr);
00938                 break;
00939 
00940             case VAR_PROTO_BUS_REQ:
00941                 sprintf(num, (ROM char *) "%hhu", protocoldata.u8Bus);
00942                 pStr += _u8TextROM((ROM char *)"ubb", num, 3, pStr);
00943                 break;
00944 
00945             case VAR_PROTO_REQ:
00946                 pStr += _u8TextROM((ROM char *)"p", protocoldata.au8Proto, 3, pStr);
00947                 break;
00948 
00949             case VAR_PROTO_MINADD_REQ:
00950                 sprintf(num, (ROM char *) "%hu", protocoldata.u16MinAdd);
00951                 pStr += _u8TextROM((ROM char *)"usm", num, 5, pStr);
00952                 break;  
00953         
00954             case VAR_PROTO_MAXADD_REQ:
00955                 sprintf(num, (ROM char *) "%hu", protocoldata.u16MaxAdd);
00956                 pStr += _u8TextROM((ROM char *)"usx", num, 5, pStr);
00957                 break;
00958 
00959             case VAR_PROTO_SPEC1_REQ:
00960                 sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGL.u8MaxSteps);
00961                 if (protocoldata.sFlags.bGL == TRUE)
00962                 {
00963                     pStr += _u8TextROM((ROM char *)"ubs", num, 3, pStr);
00964                 }
00965                 else
00966                 {
00967                     pStr += _u8TextROM((ROM char *)"ubq", num, 3, pStr);
00968                 }
00969                 break;
00970 
00971             case VAR_PROTO_SPEC2_REQ:
00972                 sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGL.u8NrFunc);
00973                 if (protocoldata.sFlags.bGL == TRUE)
00974                 {
00975                     pStr += _u8TextROM((ROM char *)"ubf", num, 3, pStr);
00976                 }
00977                 else
00978                 {
00979                     pStr += _u8TextROM((ROM char *)"ubr", num, 3, pStr);
00980                 }
00981                 pStr += _u8HiddenROM((ROM BYTE *)"E", u16Pos, pStr);
00982                 break;
00983         }
00984 
00985         strcpypgm2ram(pStr, (ROM char *) "</td>");
00986         pStr += 5;
00987 
00988         // Have we reached the last column?
00989         if (u8Colcount == VAR_PROTO_REQ_COUNT)
00990         {
00991             // Lets close the row!
00992             strcpypgm2ram(pStr, (ROM char *) "</tr>");
00993         }
00994 
00995         bStartNewCol = FALSE;
00996         curHTTP.callbackPos = strlen(str);
00997         pStr = str;
00998     }
00999 
01000 #ifdef __DEBUG
01001     if(curHTTP.callbackPos>WEB_STACKSIZE)
01002     {
01003         while(1);
01004     }
01005 #endif
01006 
01007     if (len > curHTTP.callbackPos)
01008     {
01009         len = curHTTP.callbackPos;
01010     }
01011 
01012     TCPPutArray(sktHTTP, pStr, len);
01013     curHTTP.callbackPos-= len;
01014 
01015     if (curHTTP.callbackPos == 0)
01016     {
01017         bStartNewCol = TRUE;
01018 
01019         if (u8Colcount == VAR_PROTO_REQ_COUNT)
01020         {
01021             // Finished writing the entire row.
01022             return;
01023         }
01024 
01025         // Ensure that the function is called again.
01026         curHTTP.callbackPos = 1;
01027     }
01028     else
01029     {
01030         pStr+=len;
01031     }
01032 }
01033 
01034 // ////////////////////////////////////////////////////////////////////////////
01035 // ////////////////////////////////////////////////////////////////////////////
01036 
01037 void HTTPPrint_xmllocoprotoreq(void)
01038 {
01039     if (sPSRCPConfig.sFlags.bGLAskForProto)
01040     {
01041         TCPPut(sktHTTP, '1');
01042     }
01043     else
01044     {
01045         TCPPut(sktHTTP, '0');
01046     }
01047 }
01048 
01049 // ////////////////////////////////////////////////////////////////////////////
01050 // ////////////////////////////////////////////////////////////////////////////
01051 
01052 void HTTPPrint_xmlaccprotoreq(void)
01053 {
01054     if (sPSRCPConfig.sFlags.bGAAskForProto)
01055     {
01056         TCPPut(sktHTTP, '1');
01057     }
01058     else
01059     {
01060         TCPPut(sktHTTP, '0');
01061     }
01062 }
01063 
01064 // ////////////////////////////////////////////////////////////////////////////
01065 // ////////////////////////////////////////////////////////////////////////////
01066 
01067 void HTTPPrint_xmllocostandard(void)
01068 {
01069     sprintf(str, (ROM char *)"%hhu", sPSRCPConfig.u8DefaultGLProtoId);
01070     TCPPutString(sktHTTP, str); 
01071 }
01072 
01073 // ////////////////////////////////////////////////////////////////////////////
01074 // ////////////////////////////////////////////////////////////////////////////
01075 
01076 void HTTPPrint_xmlaccstandard(void)
01077 {
01078     sprintf(str, (ROM char *)"%hhu", sPSRCPConfig.u8DefaultGAProtoId);
01079     TCPPutString(sktHTTP, str); 
01080 }
01081 
01082 // ////////////////////////////////////////////////////////////////////////////
01083 // ////////////////////////////////////////////////////////////////////////////
01084 
01085 void HTTPPrint_locostandard(void)
01086 {
01087     auto WORD len = TCPIsPutReady(sktHTTP);
01088 
01089     if(curHTTP.callbackPos == 0)
01090     {
01091         // First time here!
01092         _u8OptionROM(sPSRCPConfig.u8DefaultGLProtoId == SRCP_SERVERCACHE_ID,
01093                              SRCP_SERVERCACHE_ID, 
01094                              str, 
01095                              StrTbl_cau8GetStringPointer(STRTBLID_SERVER_CACHE));
01096 
01097         pStr = &str[strlen(str)];
01098         _u8OptionROM(sPSRCPConfig.u8DefaultGLProtoId == SRCP_EEPROMSET_ID,
01099                              SRCP_EEPROMSET_ID, 
01100                              pStr, 
01101                              StrTbl_cau8GetStringPointer(STRTBLID_DATABASE));
01102 
01103         pStr = str;
01104         // As long as callbackPos is not zero the function is called again and 
01105         // again.
01106         curHTTP.callbackPos = 1;
01107     }
01108     else if ((strlen(pStr) == 0) && (curHTTP.callbackPos < 9))
01109     {
01110         SPPROTOCOL protocoldata;
01111         SRCP_GetProtoFromEEPROM(curHTTP.callbackPos-1, &protocoldata);
01112 
01113         if (protocoldata.sFlags.bActive)
01114         {
01115             _u8Option(sPSRCPConfig.u8DefaultGLProtoId == (curHTTP.callbackPos-1), 
01116                                         curHTTP.callbackPos-1, 
01117                                         str,
01118                                         protocoldata.au8Desc);
01119             pStr = str;
01120         }
01121         curHTTP.callbackPos++;
01122     }
01123 
01124     if (len > strlen(pStr))
01125     {
01126         len = strlen(pStr);
01127     }
01128 
01129     TCPPutArray(sktHTTP, pStr, len);
01130     pStr+=len;
01131     
01132     if ((strlen(pStr) == 0) && (curHTTP.callbackPos == 9))
01133     {
01134         curHTTP.callbackPos = 0;
01135         return;
01136     }
01137 }
01138 
01139 // ////////////////////////////////////////////////////////////////////////////
01140 // ////////////////////////////////////////////////////////////////////////////
01141 
01142 void HTTPPrint_accstandard(void)
01143 {
01144     auto WORD len = TCPIsPutReady(sktHTTP);
01145 
01146     if(curHTTP.callbackPos == 0)
01147     {
01148         // First time here!
01149         _u8OptionROM(sPSRCPConfig.u8DefaultGAProtoId == SRCP_EEPROMSET_ID,
01150                              SRCP_EEPROMSET_ID, 
01151                              str, 
01152                              StrTbl_cau8GetStringPointer(STRTBLID_DATABASE));
01153 
01154         pStr = str;
01155         // As long as callbackPos is not zero the function is called again and 
01156         // again.
01157         curHTTP.callbackPos = 8;
01158     }
01159     
01160     if ((strlen(pStr) == 0)&&(curHTTP.callbackPos<16))
01161     {
01162         SPPROTOCOL protocoldata;
01163         SRCP_GetProtoFromEEPROM(curHTTP.callbackPos, &protocoldata);
01164 
01165         if (protocoldata.sFlags.bActive)
01166         {
01167             _u8Option(sPSRCPConfig.u8DefaultGAProtoId == (curHTTP.callbackPos), 
01168                                         curHTTP.callbackPos, 
01169                                         str,
01170                                         protocoldata.au8Desc);
01171             pStr = str;
01172         }
01173         curHTTP.callbackPos++;
01174     }
01175 
01176     if (len > strlen(pStr))
01177     {
01178         len = strlen(pStr);
01179     }
01180 
01181     TCPPutArray(sktHTTP, pStr, len);
01182     pStr+=len;
01183     
01184     if ((strlen(pStr) == 0) && (curHTTP.callbackPos == 16))
01185     {
01186         curHTTP.callbackPos = 0;
01187         return;
01188     }
01189 }
01190 
01191 // ////////////////////////////////////////////////////////////////////////////
01192 // ////////////////////////////////////////////////////////////////////////////
01193 
01194 void HTTPPrint_setid(void)
01195 {
01196     auto BYTE tmp[6];
01197     btoa((_currentProcessingIdx & SRCP_EEPROMSET_IDX_MASK)+1, tmp);
01198     TCPPutString(sktHTTP, tmp);
01199 }
01200 
01201 // ////////////////////////////////////////////////////////////////////////////
01202 // ////////////////////////////////////////////////////////////////////////////
01203 
01204 void HTTPPrint_setidx(void)
01205 {
01206     auto BYTE tmp[6];
01207     btoa(_currentProcessingIdx, tmp);
01208     TCPPutString(sktHTTP, tmp);
01209 }
01210 
01211 // ////////////////////////////////////////////////////////////////////////////
01212 // ////////////////////////////////////////////////////////////////////////////
01213 
01214 void HTTPPrint_setname(void)
01215 {
01216     auto SPSET * pSetdata = (SPSET *)str;
01217     BYTE * pStr = &str[sizeof(SPSET)];
01218 
01219     _u8TextROM((ROM char *)"n",pSetdata->au8Name,SRCP_NAME_MAXLEN,pStr);
01220     TCPPutString(sktHTTP, pStr);
01221 }
01222 
01223 // ////////////////////////////////////////////////////////////////////////////
01224 // ////////////////////////////////////////////////////////////////////////////
01225 
01226 void HTTPPrint_setaddress(void)
01227 {
01228     auto SPSET * pSetdata = (SPSET *)str;
01229     auto BYTE num[10];
01230     auto BYTE * pStr = &str[sizeof(SPSET)];
01231 
01232     sprintf(num, (ROM char *) "%lu", pSetdata->u32Address);
01233     _u8TextROM((ROM char *)"usm", num, 5, pStr);
01234     TCPPutString(sktHTTP, pStr);
01235 }
01236 
01237 // ////////////////////////////////////////////////////////////////////////////
01238 // ////////////////////////////////////////////////////////////////////////////
01239 
01240 void HTTPPrint_setmaxspeed(void)
01241 {
01242     auto SPSET * pSetdata = (SPSET *)str;
01243     auto BYTE num[6];
01244     auto BYTE * pStr = &str[sizeof(SPSET)];
01245 
01246     sprintf(num, (ROM char *) "%hu", pSetdata->uSpec.sGL.u16MaxV);
01247     _u8TextROM((ROM char *)"ush", num, 5, pStr);
01248     TCPPutString(sktHTTP, pStr);
01249 }
01250 
01251 // ////////////////////////////////////////////////////////////////////////////
01252 // ////////////////////////////////////////////////////////////////////////////
01253 
01254 void HTTPPrint_setbus(void)
01255 {
01256     auto SPSET * pSetdata = (SPSET *)str;
01257     auto BYTE num[4];
01258     auto BYTE * pStr = &str[sizeof(SPSET)];
01259 
01260     sprintf(num, (ROM char *) "%hhu", pSetdata->u8BusNr);
01261     _u8TextROM((ROM char *)"ubb", num, 3, pStr);
01262     TCPPutString(sktHTTP, pStr);
01263 }
01264 
01265 // ////////////////////////////////////////////////////////////////////////////
01266 // ////////////////////////////////////////////////////////////////////////////
01267 
01268 void HTTPPrint_setprotocol(void)
01269 {
01270     auto SPSET * pSetdata = (SPSET *)str;
01271     auto BYTE num[4];
01272     auto BYTE * pStr = &str[sizeof(SPSET)];
01273 
01274     _u8TextROM((ROM char *)"p", pSetdata->au8Proto, 3, pStr);
01275     TCPPutString(sktHTTP, pStr);
01276 }
01277 
01278 // ////////////////////////////////////////////////////////////////////////////
01279 // ////////////////////////////////////////////////////////////////////////////
01280 
01281 void HTTPPrint_setsteps(void)
01282 {
01283     auto SPSET * pSetdata = (SPSET *)str;
01284     auto BYTE num[4];
01285     auto BYTE * pStr = &str[sizeof(SPSET)];
01286 
01287     sprintf(num, (ROM char *) "%hhu", pSetdata->uSpec.sGL.u8MaxSteps);
01288     _u8TextROM((ROM char *)"ubs", num, 3, pStr);
01289     TCPPutString(sktHTTP, pStr);
01290 }
01291 
01292 // ////////////////////////////////////////////////////////////////////////////
01293 // ////////////////////////////////////////////////////////////////////////////
01294 
01295 void HTTPPrint_setfunctions(void)
01296 {
01297     auto SPSET * pSetdata = (SPSET *)str;
01298     auto BYTE num[4];
01299     auto BYTE * pStr = &str[sizeof(SPSET)];
01300 
01301     sprintf(num, (ROM char *) "%hhu", pSetdata->uSpec.sGL.u8NrFunc);
01302     _u8TextROM((ROM char *)"ubf", num, 3, pStr);
01303     TCPPutString(sktHTTP, pStr);
01304 }
01305 
01306 // ////////////////////////////////////////////////////////////////////////////
01307 // ////////////////////////////////////////////////////////////////////////////
01308 
01309 void HTTPPrint_setprotos(WORD u16ProtoId)
01310 {
01311     auto SPSET * pSetdata = (SPSET *)str;
01312     auto SPPROTOCOL protocoldata;
01313     auto BYTE num[4];
01314     auto BYTE * pStr = &str[sizeof(SPSET)];
01315 
01316     SRCP_GetProtoFromEEPROM((BYTE)u16ProtoId, &protocoldata);
01317 
01318     if (protocoldata.sFlags.bActive == FALSE)
01319     {
01320         return;
01321     }
01322 
01323     TCPPutROMString(sktHTTP, (ROM char *)"<tr><td>");
01324     _u8RadioROM((ROM char *)"P", u16ProtoId, FALSE, pStr);
01325     TCPPutString(sktHTTP, pStr);
01326     TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01327     TCPPutString(sktHTTP, protocoldata.au8Desc);
01328     TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01329     sprintf(num, (ROM char *) "%hhu", protocoldata.u8Bus);
01330     TCPPutString(sktHTTP, num);
01331     TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01332     TCPPutString(sktHTTP, protocoldata.au8Proto);
01333 
01334     if (pSetdata->sFlags.bGL == TRUE)
01335     {
01336         TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01337         sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGL.u8MaxSteps);
01338         TCPPutString(sktHTTP, num);
01339         TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01340         sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGL.u8NrFunc);
01341         TCPPutString(sktHTTP, num);
01342     }
01343     else
01344     {
01345         TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01346         sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGA.u8MinP);
01347         TCPPutString(sktHTTP, num);
01348         TCPPutROMString(sktHTTP, (ROM char *)"</td><td>");
01349         sprintf(num, (ROM char *) "%hhu", protocoldata.uSpec.sGA.u8MaxP);
01350         TCPPutString(sktHTTP, num);
01351     }
01352 
01353     TCPPutROMString(sktHTTP, (ROM char *)"</td></tr>");
01354 }
01355 
01356 // ////////////////////////////////////////////////////////////////////////////
01357 // ////////////////////////////////////////////////////////////////////////////
01358 
01359 void HTTPPrint_setfunction(WORD u16FunctionNr, WORD u16Mode)
01360 {
01361     auto SPSET * pSetdata = (SPSET *)str;
01362     auto BYTE format[4];
01363     auto DWORD mask;
01364     auto DWORD valuemask = 0;
01365     auto WORD i;
01366     auto BOOL bDefault = FALSE;
01367     auto BYTE * pStr = &str[sizeof(SPSET)];
01368 
01369     // Build the mask for the current function.
01370     mask = 0x01;
01371     for (i = 0; i < u16FunctionNr; i++)
01372     {
01373         mask = mask << 1;
01374     }
01375 
01376     // Set the default value (depends on what is currently configured in the set)
01377     if ((u16Mode && (pSetdata->uSpec.sGL.u32FuncToggleMask & mask)) ||
01378         ((u16Mode == 0) && ((pSetdata->uSpec.sGL.u32FuncToggleMask & mask) == 0)))
01379     {
01380         bDefault = TRUE;
01381     }
01382 
01383     if (u16Mode)
01384     {
01385         valuemask = mask;
01386     }
01387 
01388     TCPPutROMString(sktHTTP, (ROM char *)"<td>");
01389     sprintf(format, (ROM char *) "F%hu", u16FunctionNr);
01390     _u8Radio(format, valuemask, bDefault, pStr);
01391     TCPPutString(sktHTTP, pStr);
01392     TCPPutROMString(sktHTTP, (ROM char *)"</td>");
01393 }
01394 
01395 // ////////////////////////////////////////////////////////////////////////////
01396 // ////////////////////////////////////////////////////////////////////////////
01397 
01398 void HTTPPrint_setminport(void)
01399 {
01400     auto SPSET * pSetdata = (SPSET *)str;
01401     auto BYTE num[4];
01402     auto BYTE * pStr = &str[sizeof(SPSET)];
01403 
01404     sprintf(num, (ROM char *) "%hhu", pSetdata->uSpec.sGA.u8MinP);
01405     _u8TextROM((ROM char *)"ubq", num, 3, pStr);
01406     TCPPutString(sktHTTP, pStr);
01407 }
01408 
01409 // ////////////////////////////////////////////////////////////////////////////
01410 // ////////////////////////////////////////////////////////////////////////////
01411 
01412 void HTTPPrint_setmaxport(void)
01413 {
01414     auto SPSET * pSetdata = (SPSET *)str;
01415     auto BYTE num[4];
01416     auto BYTE * pStr = &str[sizeof(SPSET)];
01417 
01418     sprintf(num, (ROM char *) "%hhu", pSetdata->uSpec.sGA.u8MaxP);
01419     _u8TextROM((ROM char *)"ubr", num, 3, pStr);
01420     TCPPutString(sktHTTP, pStr);
01421 }
01422 
01423 // ////////////////////////////////////////////////////////////////////////////
01424 // ////////////////////////////////////////////////////////////////////////////
01425 
01426 void HTTPPrint_setdelay(void)
01427 {
01428     auto SPSET * pSetdata = (SPSET *)str;
01429     auto BYTE num[10];
01430     auto BYTE * pStr = &str[sizeof(SPSET)];
01431 
01432     sprintf(num, (ROM char *) "%ld", pSetdata->uSpec.sGA.s32Delay);
01433     _u8TextROM((ROM char *)"dd", num, 9, pStr);
01434     TCPPutString(sktHTTP, pStr);
01435 }
01436 
01437 
01438 // ////////////////////////////////////////////////////////////////////////////
01439 #endif  // #ifdef _SRCP
01440 // ////////////////////////////////////////////////////////////////////////////
01441 
01442 
01443 
01444 HTTP_IO_RESULT HTTPExecuteGet(void)
01445 {
01446     BYTE *ptr;
01447     BYTE filename[20];
01448     
01449     // Load the file name
01450     // Make sure BYTE filename[] above is large enough for your longest name
01451     MPFSGetFilename(curHTTP.file, filename, 20);
01452     
01453 
01454     // Verify the file name
01455     if(!strcmppgm2ram(filename, (ROM char*)"index.htm"))
01456     {
01457         ApplRestart(curHTTP.data[0]=='2');
01458     }
01459 
01460 #ifdef _SRCP
01461     else if(!strcmppgm2ram(filename, (ROM char*)"locoset.htm")||
01462             !strcmppgm2ram(filename, (ROM char*)"accset.htm"))
01463     {
01464         _currentProcessingIdx = atob(curHTTP.data);
01465         if (_currentProcessingIdx >= SRCP_EEPROMSET_COUNT)
01466         {
01467             _currentProcessingIdx = 0;
01468         }
01469         
01470         SRCP_GetSetFromEEPROM(_currentProcessingIdx, (SPSET *)str);
01471     }
01472 #endif
01473 
01474     curHTTP.httpStatus = HTTP_REDIRECT;
01475     strcpy(curHTTP.data, filename);
01476 
01477     // Indicate completion
01478     return HTTP_IO_DONE;
01479 }
01480 
01481 
01482 // ////////////////////////////////////////////////////////////////////////////
01483 // ////////////////////////////////////////////////////////////////////////////
01484 
01485 // Define post state machine values
01486 #define SM_READ_NAME       (0u)
01487 #define SM_READ_VALUE      (1u)
01488 
01489 #define EXEC_POST_NAME_LENGTH       (5+1)
01490 #define EXEC_POST_FILENAME_LENGTH   (20+1)
01491 #define EXEC_POST_VALUE_LENGTH      (32+1)
01492 
01493 #define EXEC_POST_NEEDED_SPACE      (EXEC_POST_NAME_LENGTH+EXEC_POST_FILENAME_LENGTH+EXEC_POST_VALUE_LENGTH)
01494 
01495 
01496 HTTP_IO_RESULT HTTPExecutePost(void)
01497 {
01498     auto BYTE * name = str;
01499     auto BYTE * filename = &str[EXEC_POST_NAME_LENGTH];
01500     auto BYTE * value = &filename[EXEC_POST_FILENAME_LENGTH];
01501     
01502     // Load the file name
01503     // Make sure BYTE filename[] above is large enough for your longest name
01504     MPFSGetFilename(curHTTP.file, filename, (EXEC_POST_FILENAME_LENGTH-1));
01505 
01506     // Verify the file name
01507     if(!strcmppgm2ram(filename, (ROM char*)"file.htm"))
01508     {
01509         return ConfigPostFile(str);
01510     }
01511 
01512 
01513     while(1)
01514     {
01515         // Fetch the name value pair from the post stream.
01516         switch(curHTTP.smPost)
01517         {
01518         case SM_READ_NAME:
01519             if(HTTPReadPostName(name, (EXEC_POST_NAME_LENGTH-1)) == HTTP_READ_INCOMPLETE)
01520             {
01521                 return HTTP_IO_NEED_DATA;
01522             }
01523 
01524             // Move to the next state, but do not break yet
01525             curHTTP.smPost = SM_READ_VALUE;
01526             // Intented fall through... 
01527 
01528         case SM_READ_VALUE:
01529             if(HTTPReadPostValue(value, (EXEC_POST_VALUE_LENGTH-1)) == HTTP_READ_INCOMPLETE)
01530             {
01531                 return HTTP_IO_NEED_DATA;
01532             }
01533 
01534             // Return to read a new name
01535             curHTTP.smPost = SM_READ_NAME;
01536             break;
01537         }
01538 
01539         if (strcmppgm2ram(filename, (ROM char*)"common.htm")==0)
01540         {
01541             ProcessCommonData(name, value);
01542         }
01543 
01544 #ifdef _SRCP
01545         else if (strcmppgm2ram(filename, (ROM char*)"srcp.htm")==0)
01546         {
01547             ProcessSRCPData(name, value);
01548         }
01549         else if (strcmppgm2ram(filename, (ROM char*)"locoproto.htm")==0)
01550         {
01551             ProcessProtoData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01552         }
01553         else if (strcmppgm2ram(filename, (ROM char*)"accproto.htm")==0)
01554         {
01555             ProcessProtoData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01556         }
01557         else if (!strcmppgm2ram(filename, (ROM char*)"locos.htm")==0) 
01558         {
01559             ProcessSetData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01560         }
01561         else if (!strcmppgm2ram(filename, (ROM char*)"accs.htm")==0)
01562         {
01563             ProcessSetData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01564         }
01565         else if (!strcmppgm2ram(filename, (ROM char*)"locoset.htm")==0) 
01566         {
01567             ProcessSetData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01568         }
01569         else if (!strcmppgm2ram(filename, (ROM char*)"accset.htm")==0)
01570         {
01571             ProcessSetData(&str[EXEC_POST_NEEDED_SPACE], name, value);
01572         }
01573 #endif
01574 
01575         if (name[0] == 'R')
01576         {
01577             ApplRestart(FALSE); // Restart without factory reset.
01578             strcpypgm2ram(curHTTP.data, (ROM char*)"index.htm");
01579             curHTTP.httpStatus = HTTP_REDIRECT;
01580             return HTTP_IO_DONE;
01581         }
01582         else if (name[0] == 'O')
01583         {
01584             curHTTP.httpStatus = HTTP_REDIRECT;
01585             strcpy(curHTTP.data, filename);
01586             return HTTP_IO_DONE;
01587         }
01588     }
01589 }
01590 
01591 // ////////////////////////////////////////////////////////////////////////////
01592 // ////////////////////////////////////////////////////////////////////////////
01593 
01594 static BYTE _u8RadioROM(auto ROM BYTE * pu8Name, auto DWORD u32Val, auto BOOL bSel, auto BYTE * pu8Dest)
01595 {
01596     auto BYTE len=sprintf(pu8Dest, 
01597             (ROM char *)"<input type=\"radio\" name=\"%HS\" value=\"%lu\"", 
01598             pu8Name, u32Val);
01599 
01600     if (bSel==TRUE)
01601     {
01602         strcpypgm2ram(&pu8Dest[len], (ROM char *)" checked=\"checked\"");
01603         len+=18;
01604     }
01605 
01606     strcpypgm2ram(&pu8Dest[len], (ROM char *)" />");
01607     return (len+3);
01608 }
01609 
01610 // ////////////////////////////////////////////////////////////////////////////
01611 // ////////////////////////////////////////////////////////////////////////////
01612 
01613 static BYTE _u8OptionROM(auto BOOL bSel, auto BYTE u8Val, auto char * pu8Dest, 
01614                                                           auto ROM BYTE * pu8String)
01615 {
01616     BYTE len=sprintf(pu8Dest, (ROM char *)"<option value=\"%hhu\"", u8Val);
01617 
01618     if (bSel == TRUE)
01619     {
01620         strcpypgm2ram(&pu8Dest[len], (ROM char *)" selected=\"selected\"");
01621         len += 20;
01622     }
01623     pu8Dest[len++] = '>';
01624     strcpypgm2ram(&pu8Dest[len], (ROM char *)pu8String);
01625     len += strlenpgm((ROM char *)pu8String);
01626     strcpypgm2ram(&pu8Dest[len], (ROM char *)"</option>");
01627     len += 9;
01628 
01629     return len;
01630 }
01631 
01632 // ////////////////////////////////////////////////////////////////////////////
01633 #ifdef _SRCP
01634 // ////////////////////////////////////////////////////////////////////////////
01635 
01636 static BYTE _u8HiddenROM(auto ROM BYTE * pu8Name, auto BYTE u8Val, auto BYTE * pu8Dest)
01637 {
01638     BYTE len=sprintf(pu8Dest, 
01639         (ROM char *)"<input type=\"hidden\" name=\"%HS\" value=\"%hhu\" />", 
01640         pu8Name, u8Val);
01641 
01642     return len;
01643 }
01644 
01645 // ////////////////////////////////////////////////////////////////////////////
01646 // ////////////////////////////////////////////////////////////////////////////
01647 
01648 static BYTE _u8Option(auto BOOL bSel, auto BYTE u8Val, auto char * pu8Dest, auto BYTE * pu8String)
01649 {
01650     BYTE len=sprintf(pu8Dest, (ROM char *)"<option value=\"%hhu\"", u8Val);
01651 
01652     if (bSel == TRUE)
01653     {
01654         strcpypgm2ram(&pu8Dest[len], (ROM char *)" selected=\"selected\"");
01655         len += 20;
01656     }
01657     pu8Dest[len++] = '>';
01658     strcpy(&pu8Dest[len], pu8String);
01659     len += strlen(pu8String);
01660     strcpypgm2ram(&pu8Dest[len], (ROM char *)"</option>");
01661     len += 9;
01662 
01663     return len;
01664 }
01665 
01666 // ////////////////////////////////////////////////////////////////////////////
01667 // ////////////////////////////////////////////////////////////////////////////
01668 
01669 static BYTE _u8CheckboxROM(auto ROM BYTE * pu8Name, auto BYTE u8Val, auto BOOL bSel, 
01670                                                                 auto BYTE * pu8Dest)
01671 {
01672     BYTE len=sprintf(pu8Dest, 
01673             (ROM char *)"<input type=\"checkbox\" name=\"%HS\" value=\"%hhu\"", 
01674             pu8Name, u8Val);
01675 
01676     if (bSel==TRUE)
01677     {
01678         strcpypgm2ram(&pu8Dest[len], (ROM char *)" checked=\"checked\"");
01679         len+=18;
01680     }
01681 
01682     strcpypgm2ram(&pu8Dest[len], (ROM char *)" />");
01683     return (len+3);
01684 }
01685 
01686 // ////////////////////////////////////////////////////////////////////////////
01687 // ////////////////////////////////////////////////////////////////////////////
01688 
01689 static BYTE _u8TextROM(auto ROM BYTE * pu8Name, auto BYTE * pu8Val, auto BYTE u8Size, 
01690                     auto BYTE * pu8Dest)
01691 {
01692     BYTE len=sprintf(pu8Dest, 
01693             (ROM char *)"<input type=\"text\" name=\"%HS\" value=\"%s\" ", 
01694             pu8Name, pu8Val);
01695 
01696     len+=sprintf(&pu8Dest[len], 
01697             (ROM char *)"size=\"%hhu\" maxlength=\"%hhu\" />", 
01698             u8Size, u8Size);
01699 
01700     return len;
01701 }
01702 
01703 // ////////////////////////////////////////////////////////////////////////////
01704 // ////////////////////////////////////////////////////////////////////////////
01705 
01706 static BYTE _u8Radio(auto BYTE * pu8Name, auto DWORD u32Val, auto BOOL bSel, auto BYTE * pu8Dest)
01707 {
01708     auto BYTE len=sprintf(pu8Dest, 
01709             (ROM char *)"<input type=\"radio\" name=\"%s\" value=\"%lu\"", 
01710             pu8Name, u32Val);
01711 
01712     if (bSel==TRUE)
01713     {
01714         strcpypgm2ram(&pu8Dest[len], (ROM char *)" checked=\"checked\"");
01715         len+=18;
01716     }
01717 
01718     strcpypgm2ram(&pu8Dest[len], (ROM char *)" />");
01719     return (len+3);
01720 }
01721 
01722 // ////////////////////////////////////////////////////////////////////////////
01723 #endif      // #ifdef _SRCP
01724 // ////////////////////////////////////////////////////////////////////////////

Generated on Sun Nov 27 20:02:39 2011 for eWicht by  doxygen 1.5.5