📄 maindemo.c
字号:
/*
* CGI Command Codes
*/
#define CGI_CMD_DIGOUT (0)
#define CGI_CMD_LCDOUT (1)
#define CGI_CMD_LAB3 (2)
/*
* CGI Variable codes. - There could be 00h-FFh variables.
* NOTE: When specifying variables in your dynamic pages (.cgi),
* use the hexadecimal numbering scheme and always zero pad it
* to be exactly two characters. Eg: "%04", "%2C"; not "%4" or "%02C"
*/
#define VAR_LED0 (0x00)
#define VAR_LED1 (0x01)
#define VAR_LED2 (0x10)
#define VAR_LED3 (0x11)
#define VAR_LED4 (0x12)
#define VAR_LED5 (0x13)
#define VAR_LED6 (0x14)
#define VAR_LED7 (0x15)
#define VAR_ANAIN_AN0 (0x02)
#define VAR_ANAIN_AN1 (0x03)
#define VAR_DIGIN0 (0x04) // Button0 on Explorer16
#define VAR_DIGIN1 (0x0D) // Button1 on Explorer16
#define VAR_DIGIN2 (0x0E) // Button2 on Explorer16
#define VAR_DIGIN3 (0x0F) // Button3 on Explorer16
#define VAR_STACK_VERSION (0x16)
#define VAR_STACK_DATE (0x17)
#define VAR_STROUT_LCD (0x05)
#define VAR_MAC_ADDRESS (0x06)
#define VAR_SERIAL_NUMBER (0x07)
#define VAR_IP_ADDRESS (0x08)
#define VAR_SUBNET_MASK (0x09)
#define VAR_GATEWAY_ADDRESS (0x0A)
#define VAR_DHCP (0x0B) // Use this variable when the web page is updating us
#define VAR_DHCP_TRUE (0x0B) // Use this variable when we are generating the web page
#define VAR_DHCP_FALSE (0x0C) // Use this variable when we are generating the web page
/*
* CGI Command codes (CGI_CMD_DIGOUT).
* Should be a one digit numerical value
*/
#define CMD_LED1 (0x0)
#define CMD_LED2 (0x1)
/*********************************************************************
* Function: void HTTPExecCmd(BYTE** argv, BYTE argc)
*
* PreCondition: None
*
* Input: argv - List of arguments
* argc - Argument count.
*
* Output: None
*
* Side Effects: None
*
* Overview: This function is a "callback" from HTTPServer
* task. Whenever a remote node performs
* interactive task on page that was served,
* HTTPServer calls this functions with action
* arguments info.
* Main application should interpret this argument
* and act accordingly.
*
* Following is the format of argv:
* If HTTP action was : thank.htm?name=Joe&age=25
* argv[0] => thank.htm
* argv[1] => name
* argv[2] => Joe
* argv[3] => age
* argv[4] => 25
*
* Use argv[0] as a command identifier and rests
* of the items as command arguments.
*
* Note: THIS IS AN EXAMPLE CALLBACK.
********************************************************************/
#if defined(STACK_USE_HTTP_SERVER)
ROM char COMMANDS_OK_PAGE[] = "INDEX.CGI";
ROM char CONFIG_UPDATE_PAGE[] = "CONFIG.CGI";
ROM char CMD_LAB3_FAIL_PAGE[] = "Lab3Fail.htm";
ROM char CMD_LAB3_OK_PAGE[] = "Lab3Ok_cn.htm";
ROM char CMD_LAB3_BAD_PAGE[] = "Lab3Bad.htm";
// Copy string with NULL termination.
#define COMMANDS_OK_PAGE_LEN (sizeof(COMMANDS_OK_PAGE))
#define CONFIG_UPDATE_PAGE_LEN (sizeof(CONFIG_UPDATE_PAGE))
#define CMD_LAB3_FAIL_PAGE_LEN (sizeof(CMD_LAB3_FAIL_PAGE))
#define CMD_LAB3_OK_PAGE_LEN (sizeof(CMD_LAB3_OK_PAGE))
#define CMD_LAB3_BAD_PAGE_LEN (sizeof(CMD_LAB3_BAD_PAGE))
void HTTPExecCmd(BYTE** argv, BYTE argc)
{
BYTE command;
BYTE var;
/*
* Design your pages such that they contain command code
* as a one character numerical value.
* Being a one character numerical value greatly simplifies
* the job.
*/
command = argv[0][0] - '0';
/*
* Find out the cgi file name and interpret parameters
* accordingly
*/
switch(command)
{
case CGI_CMD_DIGOUT: // ACTION=0
/*
* Identify the parameters.
* Compare it in upper case format.
*/
var = argv[1][0] - '0';
switch(var)
{
case CMD_LED1: // NAME=0
// Toggle LED.
LED1_IO ^= 1;
break;
case CMD_LED2: // NAME=1
// Toggle LED.
LED2_IO ^= 1;
break;
}
memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
break;
#if defined(USE_LCD)
case CGI_CMD_LCDOUT: // ACTION=1
if(argc > 2) // Text provided in argv[2]
{
// Write 32 received characters or less to LCDText
if(strlen(argv[2]) < 32)
{
memset(LCDText, ' ', 32);
strcpy(LCDText, argv[2]);
}
else
{
memcpy(LCDText, (void*)argv[2], 32);
}
// Write LCDText to the LCD
LCDUpdate();
}
else // No text provided
{
LCDErase();
}
memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
break;
#endif
case CGI_CMD_LAB3:
if(argc >= 3)
{
if(argv[1][0] == 'T')
{
// TODO: Uncomment this code and select proper index into argv[][] array
if(strcmp(argv[2], "asdf") == 0)
{
memcpypgm2ram((void*)argv[0], (ROM void*)CMD_LAB3_OK_PAGE, CMD_LAB3_OK_PAGE_LEN);
}
else
{
memcpypgm2ram((void*)argv[0], (ROM void*)CMD_LAB3_BAD_PAGE, CMD_LAB3_BAD_PAGE_LEN);
}
break;
}
}
memcpypgm2ram((void*)argv[0], (ROM void*)CMD_LAB3_FAIL_PAGE, CMD_LAB3_FAIL_PAGE_LEN);
break;
default:
memcpypgm2ram((void*)argv[0], (ROM void*)CMD_LAB3_FAIL_PAGE, CMD_LAB3_FAIL_PAGE_LEN);
break;
}
}
#endif
/*********************************************************************
* Function: WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
*
* PreCondition: None
*
* Input: var - Variable Identifier
* ref - Current callback reference with
* respect to 'var' variable.
* val - Buffer for value storage.
*
* Output: Variable reference as required by application.
*
* Side Effects: None
*
* Overview: This is a callback function from HTTPServer() to
* main application.
* Whenever a variable substitution is required
* on any html pages, HTTPServer calls this function
* 8-bit variable identifier, variable reference,
* which indicates whether this is a first call or
* not. Application should return one character
* at a time as a variable value.
*
* Note: Since this function only allows one character
* to be returned at a time as part of variable
* value, HTTPServer() calls this function
* multiple times until main application indicates
* that there is no more value left for this
* variable.
* On begining, HTTPGetVar() is called with
* ref = HTTP_START_OF_VAR to indicate that
* this is a first call. Application should
* use this reference to start the variable value
* extraction and return updated reference. If
* there is no more values left for this variable
* application should send HTTP_END_OF_VAR. If
* there are any bytes to send, application should
* return other than HTTP_START_OF_VAR and
* HTTP_END_OF_VAR reference.
*
* THIS IS AN EXAMPLE CALLBACK.
* MODIFY THIS AS PER YOUR REQUIREMENTS.
********************************************************************/
#if defined(STACK_USE_HTTP_SERVER)
WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
{
// Temporary variables designated for storage of a whole return
// result to simplify logic needed since one byte must be returned
// at a time.
static BYTE VarString[20];
/*
* First of all identify variable.
*/
switch(var)
{
case VAR_LED0:
*val = LED0_IO ? '1':'0';
break;
case VAR_LED1:
*val = LED1_IO ? '1':'0';
break;
case VAR_LED2:
*val = LED2_IO ? '1':'0';
break;
case VAR_LED3:
*val = LED3_IO ? '1':'0';
break;
case VAR_LED4:
*val = LED4_IO ? '1':'0';
break;
case VAR_LED5:
*val = LED5_IO ? '1':'0';
break;
case VAR_LED6:
*val = LED6_IO ? '1':'0';
break;
case VAR_LED7:
*val = LED7_IO ? '1':'0';
break;
case VAR_ANAIN_AN0:
*val = AN0String[(BYTE)ref];
if(AN0String[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(AN0String[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
// case VAR_ANAIN_AN1:
// *val = AN1String[(BYTE)ref];
// if(AN1String[(BYTE)ref] == '\0')
// return HTTP_END_OF_VAR;
// else if(AN1String[(BYTE)++ref] == '\0' )
// return HTTP_END_OF_VAR;
// return ref;
case VAR_DIGIN0:
*val = BUTTON0_IO ? '1':'0';
break;
case VAR_DIGIN1:
*val = BUTTON1_IO ? '1':'0';
break;
case VAR_DIGIN2:
*val = BUTTON2_IO ? '1':'0';
break;
case VAR_DIGIN3:
*val = BUTTON3_IO ? '1':'0';
break;
case VAR_STACK_VERSION:
if(ref == HTTP_START_OF_VAR)
{
strcpypgm2ram(VarString, VERSION);
}
*val = VarString[(BYTE)ref];
if(VarString[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(VarString[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
case VAR_STACK_DATE:
if(ref == HTTP_START_OF_VAR)
{
strcpypgm2ram(VarString, __DATE__);
}
*val = VarString[(BYTE)ref];
if(VarString[(BYTE)ref] == '\0')
return HTTP_END_OF_VAR;
else if(VarString[(BYTE)++ref] == '\0' )
return HTTP_END_OF_VAR;
return ref;
}
return HTTP_END_OF_VAR;
}
#endif
#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM)
ROM char FTP_USER_NAME[] = "ftp";
ROM char FTP_USER_PASS[] = "microchip";
#undef FTP_USER_NAME_LEN
#define FTP_USER_NAME_LEN (sizeof(FTP_USER_NAME)-1)
#define FTP_USER_PASS_LEN (sizeof(FTP_USER_PASS)-1)
BOOL FTPVerify(char *login, char *password)
{
if ( !memcmppgm2ram(login, (ROM void*)FTP_USER_NAME, FTP_USER_NAME_LEN) )
{
if ( !memcmppgm2ram(password, (ROM void*)FTP_USER_PASS, FTP_USER_PASS_LEN) )
return TRUE;
}
return FALSE;
}
#endif
/*********************************************************************
* Function: void InitializeBoard(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Initialize board specific hardware.
*
* Note: None
********************************************************************/
static void InitializeBoard(void)
{
// LEDs
LED0_TRIS = 0;
LED1_TRIS = 0;
LED2_TRIS = 0;
LED3_TRIS = 0;
LED4_TRIS = 0;
LED5_TRIS = 0;
LED6_TRIS = 0;
#if !defined(EXPLORER_16) // Pin multiplexed with a button on EXPLORER_16
LED7_TRIS = 0;
#endif
LED0_IO = 0;
LED1_IO = 0;
LED2_IO = 0;
LED3_IO = 0;
LED4_IO = 0;
LED5_IO = 0;
LED6_IO = 0;
LED7_IO = 0;
#ifdef __C30__
#if defined(__dsPIC33F__) || defined(__PIC24H__)
// Crank up the core frequency
PLLFBD = 39; // Multiply by 40 for 160MHz VCO output (8MHz XT oscillator)
CLKDIV = 0x0000; // FRC: divide by 2, PLLPOST: divide by 2, PLLPRE: divide by 2
// Port I/O
AD1PCFGHbits.PCFG23 = 1; // Make RA7 (BUTTON1) a digital input
#endif
// ADC
AD1CON1 = 0x84E4; // Turn on, auto sample start, auto-convert, 12 bit mode (on parts with a 12bit A/D)
AD1CON2 = 0x0404; // AVdd, AVss, int every 2 conversions, MUXA only, scan
AD1CON3 = 0x1007; // ?
// AD1CON3 = 0x1003; // 16 Tad auto-sample, Tad = 3*Tcy
AD1CHS = 0; // Input to AN0 (potentiometer)
AD1PCFGbits.PCFG5 = 0; // Disable digital input on AN5 (potentiometer)
AD1PCFGbits.PCFG4 = 0; // Disable digital input on AN4 (TC1047A temp sensor)
AD1CSSL = 1<<5; // Scan pot
// Enable ADC interrupt // TODO for MASTERS
#if defined(MPFS_USE_EEPROM)
IFS0bits.AD1IF = 0;
IEC0bits.AD1IE = 1;
#endif
// UART
UARTTX_TRIS = 0;
UARTRX_TRIS = 1;
U2BRG = (INSTR_FREQ+8ul*BAUD_RATE)/16/BAUD_RATE-1;
U2MODE = 0x8000; // UARTEN set
U2STA = 0x0400; // UTXEN set
#else
// Enable 4x PLL on PIC18F87J10, PIC18F97J60, etc.
OSCTUNE = 0x40;
// Set up analog features of PORTA
// PICDEM.net 2 board has POT on AN2, Temp Sensor on AN3
#if defined(PICDEMNET2)
ADCON0 = 0b10001001; // ADON, Channel 2, Calibrate next conversion
ADCON1 = 0b00001011; // Vdd/Vss is +/-REF, AN0, AN1, AN2, AN3 are analog
TRISA = 0x2F;
#else
ADCON0 = 0b00000001; // ADON, Channel 0
ADCON1 = 0b00001110; // Vdd/Vss is +/-REF, AN0 is analog
TRISA = 0x23;
#endif
ADCON2 = 0b10111110; // Right justify, 20TAD ACQ time, Fosc/64 (~21.0kHz)
// Enable internal PORTB pull-ups
INTCON2bits.RBPU = 0;
// Configure USART
TXSTA = 0b00100000; // Low BRG speed
RCSTA = 0b10010000;
SPBRG = SPBRG_VAL;
// Enable Interrupts
T0CON = 0;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
// Do a calibration A/D conversion
#if defined(__18F87J10) || defined(__18F86J15) || defined(__18F86J10) || defined(__18F85J15) || defined(__18F85J10) || defined(__18F67J10) || defined(__18F66J15) || defined(__18F66J10) || defined(__18F65J15) || defined(__18F65J10) || defined(__18F97J60) || defined(__18F96J65) || defined(__18F96J60) || defined(__18F87J60) || defined(__18F86J65) || defined(__18F86J60) || defined(__18F67J60) || defined(__18F66J65) || defined(__18F66J60)
ADCON0bits.ADCAL = 1;
ADCON0bits.GO = 1;
while(ADCON0bits.GO);
ADCON0bits.ADCAL = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -