ipset.c

Go to the documentation of this file.
00001 // ////////////////////////////////////////////////////////////////////////////
00002 // ////////////////////////////////////////////////////////////////////////////
00013 // ////////////////////////////////////////////////////////////////////////////
00014 // ////////////////////////////////////////////////////////////////////////////
00015 
00016     #define     IPSET_C
00017 
00018     #include    <stdio.h>
00019 
00020     #include    "appl.h"
00021     #include    "ipset.h"
00022     #include    "mdns.h"
00023     #include    "stringtable.h"
00024     #include    "sralloc.h"
00025 
00026 // ////////////////////////////////////////////////////////////////////////////
00027 // Local Typedefs
00028 // ////////////////////////////////////////////////////////////////////////////
00029 
00030 // States of ipset SM
00031 typedef enum
00032 {
00033     IPSET_SM_STARTUP = 0,
00034     IPSET_SM_WAIT_FOR_IP_USER,
00035     IPSET_SM_PREPARE_IPMODE,
00036     IPSET_SM_IPMODE,
00037     IPSET_SM_PREPARE_IPDIAG,
00038     IPSET_SM_PREPARE_DIAG,
00039     IPSET_SM_IP_DIAG,
00040     IPSET_SM_PREPARE_SUBDIAG,
00041     IPSET_SM_SUB_DIAG,
00042     IPSET_SM_PREPARE_GATEDIAG,
00043     IPSET_SM_GATE_DIAG,
00044     IPSET_SM_IP_FINISHED,
00045     IPSET_SM_SERVER_STARTUP,
00046     IPSET_SM_SERVER_STARTUP_WAIT,
00047     IPSET_SM_PREPARE_SERVER_FINDMODE,
00048     IPSET_SM_SERVER_FINDMODE,
00049     IPSET_SM_SERVER_AFTER_FINDMODE,
00050     IPSET_SM_SERVER_PREPARE_IP_DIAG,
00051     IPSET_SM_SERVER_IP_DIAG,
00052     IPSET_SM_SERVER_PREPARE_PORT_DIAG,
00053     IPSET_SM_SERVER_PORT_WAIT_FOR_DIAG,
00054     IPSET_SM_SERVER_PORT_DIAG,
00055     IPSET_SM_SERVER_PREPARE_NAME_DIAG,
00056     IPSET_SM_SERVER_NAME_WAIT_FOR_DIAG,
00057     IPSET_SM_SERVER_NAME_DIAG,
00058     IPSET_SM_SERVER_PORT_CORRECTED,
00059     IPSET_SM_SERVER_FINISHED,
00060     IPSET_SM_SAVED,
00061     IPSET_SM_WAIT_FOR_USER,
00062     IPSET_SM_FINISHED
00063 } SM_IPSET;
00064 
00065 typedef struct
00066 {
00067     DWORD   u32oldSrvIp;
00068     DWORD   u32oldIp;
00069     DWORD   u32oldGate;
00070     WORD    u16oldSrvIPPort;
00071     WORD    u16oldSrvNamePort;
00072     SM_IPSET eState; 
00073     BYTE    u8oldMask;
00074     BOOL    boldDHCP;
00075     SEARCH_MODE eoldSrvFindMode;
00076     BYTE au8oldSrvName[sizeof(sPApplConfig.au8Name)];
00077     BYTE    au8oldSrvService[sizeof(sPApplConfig.au8Service)];
00078 } sIPsetControl;
00079 
00080 
00081 // ////////////////////////////////////////////////////////////////////////////
00082 // Local Constants
00083 // ////////////////////////////////////////////////////////////////////////////
00084 
00085 ROM BYTE _cau8hostname_chars[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
00086      'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
00087      'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-' };
00088 
00089 // ////////////////////////////////////////////////////////////////////////////
00090 // Local Variables
00091 // ////////////////////////////////////////////////////////////////////////////
00092  
00093 static BYTE * pdata;
00094 static BYTE _u8CursorPos;
00095 static sIPsetControl * _pIPSetCtrl = NULL;
00096 
00097 
00098 // ////////////////////////////////////////////////////////////////////////////
00099 // Local function prototypes
00100 // ////////////////////////////////////////////////////////////////////////////
00101 
00102 static void _cancelDialog(void);
00103 
00104 
00105 // ////////////////////////////////////////////////////////////////////////////
00106 // ////////////////////////////////////////////////////////////////////////////
00107 
00108 void IPSetInit(BOOL bServer)
00109 {
00110     // Prepare buttons for the dialog:
00111     InputButtonReset(ALL_BTN);
00112     SRAMInitHeap();
00113 
00114     _pIPSetCtrl = (sIPsetControl* )(SRAMalloc(sizeof(sIPsetControl)));
00115     if (_pIPSetCtrl == NULL)
00116     {
00117         return;
00118     }
00119 
00120     if (bServer == TRUE)
00121     {
00122         _pIPSetCtrl->eState = IPSET_SM_SERVER_STARTUP;
00123     }
00124     else
00125     {
00126         _pIPSetCtrl->eState = IPSET_SM_STARTUP;
00127     }
00128 
00129     _pIPSetCtrl->u32oldIp = sPCommonConfig.ManIPAddr.Val;
00130     _pIPSetCtrl->u8oldMask = sPCommonConfig.ManMask;
00131     _pIPSetCtrl->u32oldGate = sPCommonConfig.ManGateway.Val;
00132 
00133     _pIPSetCtrl->boldDHCP = sPCommonConfig.Flags.bIsDHCPEnabled;
00134     _pIPSetCtrl->eoldSrvFindMode = sPApplConfig.eFindMode;
00135     _pIPSetCtrl->u32oldSrvIp = sPApplConfig.sSrvIPAdd.Val;
00136     _pIPSetCtrl->u16oldSrvIPPort = sPApplConfig.sIPPort.Val;
00137     _pIPSetCtrl->u16oldSrvNamePort = sPApplConfig.sNamePort.Val;
00138 
00139     memcpy(_pIPSetCtrl->au8oldSrvName, (void*)sPApplConfig.au8Name, sizeof(_pIPSetCtrl->au8oldSrvName));
00140     memcpy(_pIPSetCtrl->au8oldSrvService, (void*)sPApplConfig.au8Service, sizeof(_pIPSetCtrl->au8oldSrvService));
00141 }
00142 
00143 // ////////////////////////////////////////////////////////////////////////////
00144 // ////////////////////////////////////////////////////////////////////////////
00145 
00146 BOOL IPSetMain(void)
00147 {
00148     if (_pIPSetCtrl == NULL)
00149     {
00150         return TRUE;
00151     }
00152 
00153     // F2_BTN button is for canceling the dialog!
00154     if ((bInputButtonPushed(F2_BTN) == TRUE) && (_pIPSetCtrl->eState < IPSET_SM_SAVED))
00155     {
00156         _cancelDialog();
00157     }
00158 
00159 
00160     switch(_pIPSetCtrl->eState)
00161     {
00162     case IPSET_SM_STARTUP:
00163         StrTbl_GetString(lcdram_row1, STRTBLID_IP_MENU);
00164         lcd_addr2 = 0;
00165         strcpypgm2ram(lcdram_row2, (ROM char *) "    ESC         ");
00166         lcdram_row2[0] = 0xFB;
00167         lcdram_row2[15] = 0xFC;
00168         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK | LCD_ROW2_MASK;
00169 
00170         InputButtonReset(ENC_BTN);
00171         _pIPSetCtrl->eState = IPSET_SM_WAIT_FOR_IP_USER;
00172         break;
00173 
00174     case IPSET_SM_WAIT_FOR_IP_USER:
00175         if (bInputButtonPushed(F1_BTN))
00176         {
00177             _cancelDialog();
00178         }
00179 
00180         if (bInputButtonPushed(ENC_BTN) || bInputButtonPushed(F4_BTN))
00181         {
00182             _pIPSetCtrl->eState = IPSET_SM_PREPARE_IPMODE;
00183         }
00184         break;
00185 
00186     case IPSET_SM_PREPARE_IPMODE:
00187         StrTbl_GetString(lcdram_row1, STRTBLID_IP_ALLOCATION);
00188         _pIPSetCtrl->eState = IPSET_SM_IPMODE;
00189         InputEncoderInit(sPCommonConfig.Flags.bIsDHCPEnabled, 0, 1,ENC_ENDSTOP_MASK);
00190         InputButtonReset(ALL_BTN);
00191         // Intended fall through
00192 
00193     case IPSET_SM_IPMODE:
00194         if (bInputButtonPushed(ENC_BTN) || bInputButtonPushed(F4_BTN))
00195         {
00196             sPCommonConfig.Flags.bIsDHCPEnabled = (BOOL) s16InputEncoderGetValue();
00197             if ( sPCommonConfig.Flags.bIsDHCPEnabled == FALSE)
00198             {
00199                 _pIPSetCtrl->eState = IPSET_SM_PREPARE_IPDIAG;
00200             }
00201             else
00202             {
00203                 _pIPSetCtrl->eState = IPSET_SM_IP_FINISHED;
00204             }
00205         }   
00206         else if (bInputButtonPushed(F1_BTN))
00207         {
00208             _pIPSetCtrl->eState = IPSET_SM_STARTUP;
00209         }
00210         else if (bInputEncoderValueChanged() == TRUE)
00211         {
00212             if (s16InputEncoderGetValue() == 0)
00213             {
00214                 StrTbl_GetString(lcdram_row2, STRTBLID_MANUAL);
00215             }
00216             else
00217             {
00218                 StrTbl_GetString(lcdram_row2, STRTBLID_AUTO);
00219             }
00220 
00221             lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00222                          LCD_ROW2_MASK | LCD_CENTER2_MASK;
00223         }
00224         break;
00225 
00226     case IPSET_SM_PREPARE_IPDIAG:
00227         pdata = sPCommonConfig.ManIPAddr.v;
00228         StrTbl_GetString(lcdram_row1, STRTBLID_IP_ADDRESS);
00229         _pIPSetCtrl->eState = IPSET_SM_PREPARE_DIAG;
00230         break;
00231 
00232     case IPSET_SM_PREPARE_GATEDIAG:
00233     case IPSET_SM_PREPARE_DIAG:
00234     case IPSET_SM_SERVER_PREPARE_IP_DIAG:
00235         InputButtonReset(ALL_BTN);
00236         _u8CursorPos = 0;
00237         InputEncoderInit(pdata[0], 1, 223, 0);
00238         lcd_addr2 = 0;
00239         sprintf(lcdram_row2, (ROM char *) "%3hhu.%3hhu.%3hhu.%3hhu", 
00240                                 pdata[0], pdata[1], pdata[2], pdata[3]);
00241         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK |
00242                      LCD_CENTER1_MASK | LCD_ROW2_MASK;
00243         _pIPSetCtrl->eState++;
00244         break;
00245 
00246     case IPSET_SM_IP_DIAG:
00247     case IPSET_SM_SERVER_IP_DIAG:
00248     case IPSET_SM_GATE_DIAG:
00249         {
00250             BOOL bpushed = FALSE;
00251             BOOL bchanged = FALSE;
00252 
00253             if(OutIsLCDBusy())
00254             {
00255                 // Doing nothing until the LCD has finished.
00256                 break;
00257             }
00258 
00259             bchanged = bInputEncoderValueChanged();
00260             pdata[_u8CursorPos] = s16InputEncoderGetValue();
00261 
00262             if (bInputButtonPushed(F4_BTN))
00263             {
00264                 // IP or gateway dialog was finished!
00265                 _pIPSetCtrl->eState++;
00266                 break;      
00267             } 
00268             else if (bInputButtonPushed(F1_BTN))
00269             {
00270                 if (_pIPSetCtrl->eState == IPSET_SM_SERVER_IP_DIAG)
00271                 {
00272                     _pIPSetCtrl->eState = IPSET_SM_PREPARE_SERVER_FINDMODE;
00273                 }
00274                 else if (_pIPSetCtrl->eState == IPSET_SM_GATE_DIAG)
00275                 {
00276                     _pIPSetCtrl->eState = IPSET_SM_PREPARE_SUBDIAG;
00277                 }
00278                 else if (_pIPSetCtrl->eState == IPSET_SM_IP_DIAG)
00279                 {
00280                     _pIPSetCtrl->eState = IPSET_SM_PREPARE_IPMODE;
00281                 }
00282                 break;      
00283             } 
00284             else if (bInputButtonPushed(ENC_BTN))
00285             {
00286                 // Next digit (single push)
00287                 InputButtonReset(ENC_BTN);
00288                 lcdram_row2[2] = ' ';
00289                 u8ApplTimer = 0;                
00290                 bpushed = TRUE;
00291             }
00292             else if (bchanged == TRUE)
00293             {
00294                 lcdram_row2[2] = ' ';
00295                 u8ApplTimer = 0;
00296             }
00297     
00298             if (u8ApplTimer == 0)
00299             {
00300                 lcd_addr2 = 4*_u8CursorPos;
00301                 if (lcdram_row2[2] != ' ')
00302                 {
00303                     u8ApplTimer = 50;
00304                     strcpypgm2ram(lcdram_row2, (ROM char *) "   ");
00305                 }
00306                 else
00307                 {
00308                     u8ApplTimer = 150;
00309                     sprintf(lcdram_row2, (ROM char *) "%3hhu", pdata[_u8CursorPos]);
00310                 }
00311 
00312                 lcd_status |= LCD_ROW2_MASK;         
00313             }
00314     
00315             if (bpushed == TRUE)
00316             {
00317                 if (++_u8CursorPos == 4)
00318                 {
00319                     _u8CursorPos = 0;
00320                     InputEncoderInit(pdata[0], 1, 223, 0);
00321                 }
00322                 else
00323                 {
00324                     InputEncoderInit(pdata[_u8CursorPos], 0, 255, 0);
00325                 }
00326 
00327                 u8ApplTimer = 0;
00328                 s16InputEncoderGetValue();
00329             }
00330             break;
00331         }
00332     case IPSET_SM_PREPARE_SUBDIAG:
00333         InputButtonReset(ALL_BTN);
00334         StrTbl_GetString(lcdram_row1, STRTBLID_SUBNETMASK);
00335         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK;
00336         InputEncoderInit(sPCommonConfig.ManMask, 8, 30, 0);
00337         _pIPSetCtrl->eState = IPSET_SM_SUB_DIAG;    
00338         // Intended fall through    
00339 
00340     case IPSET_SM_SUB_DIAG:
00341         if (bInputButtonPushed(ENC_BTN)||bInputButtonPushed(F4_BTN))
00342         {
00343             // Subnetmask dialog was finished!
00344             sPCommonConfig.ManMask = (BYTE) s16InputEncoderGetValue();
00345 
00346             if ((_pIPSetCtrl->u32oldIp != sPCommonConfig.ManIPAddr.Val) || 
00347                 (_pIPSetCtrl->u8oldMask != sPCommonConfig.ManMask))
00348             {
00349                 DWORD_VAL tempMask;
00350                 tempMask.Val = IPConvertSubnetToMask(sPCommonConfig.ManMask);
00351 
00352                 sPCommonConfig.ManGateway.Val =
00353                                        tempMask.Val & sPCommonConfig.ManIPAddr.Val;
00354                 sPCommonConfig.ManGateway.v[3] += 1;
00355             }
00356 
00357             _pIPSetCtrl->eState = IPSET_SM_PREPARE_GATEDIAG;
00358             pdata = sPCommonConfig.ManGateway.v;
00359             StrTbl_GetString(lcdram_row1, STRTBLID_GATEWAY_ADDRESS);
00360         } 
00361         else if (bInputButtonPushed(F1_BTN))
00362         {
00363             _pIPSetCtrl->eState = IPSET_SM_PREPARE_IPDIAG;
00364         }
00365         else if (bInputEncoderValueChanged() == TRUE)
00366         {
00367             DWORD_VAL sub;
00368             sub.Val = IPConvertSubnetToMask((BYTE) s16InputEncoderGetValue());
00369             lcd_addr2 = 0;
00370             sprintf(lcdram_row2, (ROM char *) "%3hhu.%3hhu.%3hhu.%3hhu", 
00371                                        sub.v[0], sub.v[1], sub.v[2], sub.v[3]);
00372             lcd_status |= LCD_ROW2_MASK;
00373         }
00374         break;
00375 
00376     case IPSET_SM_IP_FINISHED:
00377         if (_pIPSetCtrl->u32oldIp != sPCommonConfig.ManIPAddr.Val || 
00378             _pIPSetCtrl->u8oldMask != sPCommonConfig.ManMask ||
00379             _pIPSetCtrl->u32oldGate != sPCommonConfig.ManGateway.Val ||
00380             _pIPSetCtrl->boldDHCP != sPCommonConfig.Flags.bIsDHCPEnabled)
00381         {
00382             BYTE * confPtr = (BYTE *)(&sPCommonConfig);
00383             StopMDNSResponder();
00384         
00385             // If IP or mode has changed, than a gratious ARP is necessary!
00386             if ((_pIPSetCtrl->u32oldIp != sPCommonConfig.ManIPAddr.Val)||
00387                 (_pIPSetCtrl->boldDHCP != sPCommonConfig.Flags.bIsDHCPEnabled))
00388             {
00389                 sIPConfig.Flags.bIPunique = FALSE;
00390             }
00391 
00392             if (sPCommonConfig.Flags.bIsDHCPEnabled == FALSE)
00393             {
00394                 DHCPDisable();
00395                 sIPConfig.MyIPAddr.Val = sPCommonConfig.ManIPAddr.Val;
00396                 sIPConfig.MyMask.Val = IPConvertSubnetToMask(sPCommonConfig.ManMask);
00397                 sIPConfig.MyGateway.Val = sPCommonConfig.ManGateway.Val;
00398             }
00399             else
00400             {
00401                 DHCPEnable();
00402                 DHCPReset(FALSE);
00403             }
00404 
00405             // write the entire data into EEPROM
00406             XEEWriteArray(BOOTUP_EEPROM_ADD, confPtr, sizeof(PCOMMON_CONFIG));
00407 
00408             _pIPSetCtrl->eState = IPSET_SM_SAVED;
00409         }
00410         else
00411         {
00412             DHCPReset(TRUE);            
00413             _pIPSetCtrl->eState = IPSET_SM_FINISHED;
00414         }
00415         break;
00416 
00417     case IPSET_SM_SERVER_STARTUP:
00418         StrTbl_GetString(lcdram_row1, STRTBLID_SERVER_MENU);
00419         lcd_addr2 = 0;
00420         strcpypgm2ram(lcdram_row2, (ROM char *) "    ESC         ");
00421         lcdram_row2[0] = 0xFB;
00422         lcdram_row2[10] = 0x7F;
00423         lcdram_row2[15] = 0xFC;
00424         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | 
00425                      LCD_CENTER1_MASK | LCD_ROW2_MASK;
00426         InputButtonReset(ALL_BTN);
00427         _pIPSetCtrl->eState = IPSET_SM_SERVER_STARTUP_WAIT;
00428         break;
00429 
00430     case IPSET_SM_SERVER_STARTUP_WAIT:
00431         if (bInputButtonPushed(F1_BTN))
00432         {
00433             _cancelDialog();
00434         }
00435 
00436         if ((bInputButtonPushed(ENC_BTN) == TRUE)||(bInputButtonPushed(F4_BTN) == TRUE))
00437         {
00438             _pIPSetCtrl->eState = IPSET_SM_PREPARE_SERVER_FINDMODE;
00439         }
00440         break;
00441 
00442     case IPSET_SM_PREPARE_SERVER_FINDMODE:
00443         StrTbl_GetString(lcdram_row1, STRTBLID_FIND_SERVER);
00444         _pIPSetCtrl->eState = IPSET_SM_SERVER_FINDMODE;
00445         if (sPApplConfig.eFindMode == SEARCH_UNKNOWN)
00446         {
00447             sPApplConfig.eFindMode = SEARCH_IP;
00448         }
00449 
00450         InputEncoderInit(sPApplConfig.eFindMode, 1, 3, 0);
00451         InputButtonReset(ALL_BTN);
00452         OutEnableCursor(FALSE);
00453         break;
00454 
00455     case IPSET_SM_SERVER_FINDMODE:
00456         if ((bInputButtonPushed(ENC_BTN) == TRUE)||
00457             (bInputButtonPushed(F4_BTN) == TRUE))
00458         {
00459             sPApplConfig.eFindMode = (BOOL)s16InputEncoderGetValue();
00460             _pIPSetCtrl->eState = IPSET_SM_SERVER_AFTER_FINDMODE;
00461         }
00462         else if (bInputButtonPushed(F1_BTN) == TRUE)
00463         {
00464             // Shift TAB -> Go back to the last menu item.
00465             _pIPSetCtrl->eState = IPSET_SM_SERVER_STARTUP;
00466         }
00467         else if (bInputEncoderValueChanged() == TRUE)
00468         {
00469             BYTE val = (BYTE) s16InputEncoderGetValue();
00470 
00471             if (val == SEARCH_IP)
00472             {
00473                 StrTbl_GetString(lcdram_row2, STRTBLID_IP_ADDRESS);
00474             }
00475             else if (val == SEARCH_NAME)
00476             {
00477                 StrTbl_GetString(lcdram_row2, STRTBLID_NETWORK_NAME);
00478             }
00479             else
00480             {
00481                 StrTbl_GetString(lcdram_row2, STRTBLID_NETWORK_SERVICE);
00482             }
00483 
00484             lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK | LCD_ROW2_MASK | LCD_CENTER2_MASK;
00485         }       
00486         break;
00487 
00488     case IPSET_SM_SERVER_AFTER_FINDMODE:
00489         if (sPApplConfig.eFindMode == SEARCH_IP)
00490         {
00491             _pIPSetCtrl->eState = IPSET_SM_SERVER_PREPARE_IP_DIAG;
00492             pdata = sPApplConfig.sSrvIPAdd.v;
00493             StrTbl_GetString(lcdram_row1, STRTBLID_SERVER_ADDRESS);
00494         }
00495         else
00496         {
00497             if(sPApplConfig.eFindMode == SEARCH_NAME)
00498             {
00499                 pdata = sPApplConfig.au8Name;
00500                 StrTbl_GetString(lcdram_row1, STRTBLID_SERVER_NAME);
00501             }
00502             else
00503             {
00504                 pdata = sPApplConfig.au8Service;
00505                 StrTbl_GetString(lcdram_row1, STRTBLID_SERVICE_NAME);
00506             }
00507 
00508             _pIPSetCtrl->eState = IPSET_SM_SERVER_PREPARE_NAME_DIAG;
00509         }
00510         break;
00511 
00512     case IPSET_SM_SERVER_PREPARE_PORT_DIAG:
00513         StrTbl_GetString(lcdram_row1, STRTBLID_PORT);
00514         lcd_addr1 = 0;
00515         lcd_addr2 = 0;
00516         if (sPApplConfig.eFindMode == SEARCH_IP)
00517         {
00518             pdata = (BYTE *)&sPApplConfig.sIPPort.Val;
00519         }
00520         else
00521         {
00522             pdata = (BYTE *)&sPApplConfig.sNamePort.Val;
00523         }
00524 
00525         sprintf(lcdram_row2, (ROM char *)"%05hu", *((WORD *)pdata));
00526         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_ROW2_MASK;
00527 
00528         InputEncoderInit(lcdram_row2[0]-'0'+26, 26, 35, 0);
00529         InputButtonReset(ALL_BTN);
00530         _u8CursorPos = 0;
00531         _pIPSetCtrl->eState = IPSET_SM_SERVER_PORT_WAIT_FOR_DIAG;
00532         OutEnableCursor(TRUE);
00533         break;
00534 
00535 
00536     case IPSET_SM_SERVER_PORT_DIAG:
00537         if (bInputButtonPushed(F4_BTN) == TRUE) 
00538         {
00539             DWORD val = (DWORD)(atol(lcdram_row2));
00540             OutEnableCursor(FALSE);
00541 
00542             if (val > 65535)
00543             {
00544                 *((WORD *)pdata) = 65535;
00545             }
00546             else if (val == 0)
00547             {
00548                 *((WORD *)pdata) = 1;
00549             }
00550             else
00551             {
00552                 *((WORD *)pdata) = (WORD) val;
00553                 _pIPSetCtrl->eState = IPSET_SM_SERVER_FINISHED;
00554                 break;
00555             }
00556 
00557             _pIPSetCtrl->eState = IPSET_SM_SERVER_PORT_CORRECTED;
00558             StrTbl_GetString(lcdram_row1, STRTBLID_SET_PORT_TO1);
00559             sprintf(lcdram_row2, StrTbl_cau8GetStringPointer(STRTBLID_SET_PORT_TO2), *((WORD *)pdata));
00560 
00561             lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK | LCD_ROW2_MASK | LCD_CENTER2_MASK;
00562             u8ApplTimer = 200;
00563             InputButtonReset(ENC_BTN);
00564         }
00565         else if (bInputButtonPushed(F1_BTN) == TRUE)
00566         {
00567             _pIPSetCtrl->eState = IPSET_SM_SERVER_AFTER_FINDMODE;
00568             OutEnableCursor(FALSE);
00569         }
00570         else if (bInputEncoderValueChanged() == TRUE)
00571         {
00572             lcdram_row2[_u8CursorPos] = _cau8hostname_chars[s16InputEncoderGetValue()];
00573             lcd_status |= LCD_ROW2_MASK;    
00574             _pIPSetCtrl->eState--; 
00575         }
00576         else if (bInputButtonPushed(ENC_BTN) == TRUE)
00577         {
00578             InputButtonReset(ENC_BTN);
00579             if (++_u8CursorPos > 4)
00580             {
00581                 _u8CursorPos = 0;
00582             }
00583             InputEncoderSetValue(lcdram_row2[_u8CursorPos] - '0' + 26, TRUE);
00584             _pIPSetCtrl->eState--;
00585         }   
00586         break;
00587 
00588     case IPSET_SM_SERVER_PREPARE_NAME_DIAG:
00589     {
00590         BYTE i;
00591         _u8CursorPos = strlen(pdata);
00592         if (_u8CursorPos)
00593         {
00594             _u8CursorPos--;
00595             while(pdata[_u8CursorPos]!=_cau8hostname_chars[i++]);
00596         }
00597         else
00598         {
00599             i = 1;
00600         }
00601 
00602         InputEncoderInit(i-1, 0, sizeof(_cau8hostname_chars)-1, 0);
00603 
00604         strcpy(lcdram_row2, pdata);
00605         lcd_addr1 = 0;
00606         lcd_addr2 = 0;
00607         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_ROW2_MASK;
00608 
00609         InputButtonReset(ALL_BTN);
00610         _pIPSetCtrl->eState = IPSET_SM_SERVER_NAME_WAIT_FOR_DIAG;
00611         OutEnableCursor(TRUE);
00612         break;      
00613     }
00614 
00615     case IPSET_SM_SERVER_PORT_WAIT_FOR_DIAG:
00616     case IPSET_SM_SERVER_NAME_WAIT_FOR_DIAG:
00617         if (OutIsLCDBusy()==FALSE)
00618         {
00619             OutSetCursor(_u8CursorPos, 1);
00620             _pIPSetCtrl->eState++;
00621         }
00622         break;
00623 
00624     case IPSET_SM_SERVER_NAME_DIAG:
00625         if (bInputButtonPushed(F4_BTN) == TRUE)
00626         {
00627             OutEnableCursor(FALSE);
00628             if (sPApplConfig.eFindMode == SEARCH_NAME)
00629             {
00630                 _pIPSetCtrl->eState = IPSET_SM_SERVER_PREPARE_PORT_DIAG;
00631             }
00632             else
00633             {
00634                 _pIPSetCtrl->eState = IPSET_SM_SERVER_FINISHED;
00635             }
00636         }
00637         else if (bInputButtonPushed(F1_BTN) == TRUE)
00638         {
00639             // Shift TAB -> Go back to the last menu item.
00640             OutEnableCursor(FALSE);
00641             _pIPSetCtrl->eState = IPSET_SM_PREPARE_SERVER_FINDMODE;
00642         }
00643         else if ((bInputEncoderValueChanged() == TRUE) && (_u8CursorPos<16))
00644         {
00645             pdata[_u8CursorPos] = _cau8hostname_chars[s16InputEncoderGetValue()];
00646             strcpy(lcdram_row2, pdata);
00647             lcd_status |= LCD_ROW2_MASK;
00648 
00649             // Waiting for the display:
00650             _pIPSetCtrl->eState--;   
00651         }
00652         else if (bInputButtonPushed(ENC_BTN) == TRUE)
00653         {
00654             // Next position is selected
00655             InputButtonReset(ENC_BTN);
00656 
00657             if (pdata[_u8CursorPos] && (_u8CursorPos<15))
00658             {
00659                 InputEncoderSetValue(0, TRUE);
00660                 _u8CursorPos++;
00661                 _pIPSetCtrl->eState--;
00662             }
00663         }
00664         else if (bInputButtonPushed(F3_BTN) == TRUE)
00665         {
00666             // Backspace emulation
00667             InputButtonReset(F3_BTN);
00668             pdata[_u8CursorPos] = 0;
00669             lcdram_row2[_u8CursorPos] = ' ';
00670             lcdram_row2[_u8CursorPos+1] = 0;
00671             lcd_status |= LCD_ROW2_MASK;
00672 
00673             if (_u8CursorPos)
00674             {
00675                 BYTE i = 0;
00676                 _u8CursorPos--;
00677                 while(pdata[_u8CursorPos]!=_cau8hostname_chars[i++]);
00678                 InputEncoderSetValue(i-1, TRUE);
00679             }
00680             else
00681             {
00682                 InputEncoderSetValue(0, FALSE);
00683             }
00684             _pIPSetCtrl->eState--;
00685         }
00686     
00687         break;
00688 
00689     case IPSET_SM_SERVER_FINISHED:
00690         if (_pIPSetCtrl->eoldSrvFindMode != sPApplConfig.eFindMode ||
00691             _pIPSetCtrl->u32oldSrvIp != sPApplConfig.sSrvIPAdd.Val ||
00692             _pIPSetCtrl->u16oldSrvIPPort != sPApplConfig.sIPPort.Val ||
00693             _pIPSetCtrl->u16oldSrvNamePort != sPApplConfig.sNamePort.Val ||
00694             (strcmp(_pIPSetCtrl->au8oldSrvName, sPApplConfig.au8Name) != 0) ||
00695             (strcmp(_pIPSetCtrl->au8oldSrvService, sPApplConfig.au8Service) != 0))
00696         {
00697             BYTE * confPtr = (BYTE *)(&sPApplConfig);       
00698 
00699             // write the entire data into EEPROM
00700             XEEWriteArray(APPL_EEPROM_ADD, confPtr, sizeof(SPAPPLDATA));
00701 
00702             _pIPSetCtrl->eState = IPSET_SM_SAVED;       
00703         }
00704         else
00705         {
00706             _pIPSetCtrl->eState = IPSET_SM_FINISHED;
00707         }
00708         break;
00709 
00710     case IPSET_SM_SAVED:
00711         StrTbl_GetString(lcdram_row1, STRTBLID_DATA_WAS);
00712         StrTbl_GetString(lcdram_row2, STRTBLID_SAVED);
00713         lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK | 
00714                      LCD_ROW2_MASK | LCD_CENTER2_MASK;  
00715         _pIPSetCtrl->eState = IPSET_SM_WAIT_FOR_USER;
00716         u8ApplTimer = 200;
00717         InputButtonReset(ALL_BTN);
00718         break;
00719 
00720     case IPSET_SM_SERVER_PORT_CORRECTED:
00721     case IPSET_SM_WAIT_FOR_USER:
00722         if ((u8ApplTimer == 0) || (bInputButtonPushed(ENC_BTN)))
00723         {
00724             _pIPSetCtrl->eState++;
00725         }
00726         break;
00727 
00728     case IPSET_SM_FINISHED:
00729         SRAMfree((BYTE *)_pIPSetCtrl);
00730         _pIPSetCtrl = NULL;
00731         return TRUE;
00732     }
00733 
00734     return FALSE;
00735 }
00736 
00737 // ////////////////////////////////////////////////////////////////////////////
00738 // ////////////////////////////////////////////////////////////////////////////
00739 
00740 static void _cancelDialog(void)
00741 {
00742     // Disable the cursor, if enabled.
00743     OutEnableCursor(FALSE);
00744 
00745     // write the data back without taking changes in account
00746     sPCommonConfig.ManIPAddr.Val = _pIPSetCtrl->u32oldIp;
00747     sPCommonConfig.ManMask = _pIPSetCtrl->u8oldMask;
00748     sPCommonConfig.ManGateway.Val = _pIPSetCtrl->u32oldGate;
00749     sPCommonConfig.Flags.bIsDHCPEnabled = _pIPSetCtrl->boldDHCP;
00750     sPApplConfig.eFindMode = _pIPSetCtrl->eoldSrvFindMode;
00751     sPApplConfig.sSrvIPAdd.Val = _pIPSetCtrl->u32oldSrvIp;
00752     sPApplConfig.sIPPort.Val = _pIPSetCtrl->u16oldSrvIPPort;
00753     sPApplConfig.sNamePort.Val = _pIPSetCtrl->u16oldSrvNamePort;
00754     memcpy(sPApplConfig.au8Name, (void *)_pIPSetCtrl->au8oldSrvName, 
00755                                            sizeof(_pIPSetCtrl->au8oldSrvName));
00756     memcpy(sPApplConfig.au8Service, (void *)_pIPSetCtrl->au8oldSrvService, 
00757                                         sizeof(_pIPSetCtrl->au8oldSrvService));
00758 
00759     StrTbl_GetString(lcdram_row1, STRTBLID_DATA_NOT);
00760     StrTbl_GetString(lcdram_row2, STRTBLID_SAVED);
00761     lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00762                  LCD_ROW2_MASK | LCD_CENTER2_MASK;
00763 
00764     u8ApplTimer = 200;
00765     InputButtonReset(ALL_BTN);
00766     _pIPSetCtrl->eState = IPSET_SM_WAIT_FOR_USER;
00767 }
00768 
00769 // ////////////////////////////////////////////////////////////////////////////
00770 // ////////////////////////////////////////////////////////////////////////////

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