📄 httpd.c
字号:
LED_STATUS_ON(); } httpd_conn[socketnum].state = HTTPD_STATE_IDLE; *appstate = TCP_APPSTATE_FINISHED; return 0; case(HTTPD_STATE_POST): #if HTTPD_DEBUG softuart_puts_progmem("HTTP: upload todo (low 16bit only): "); softuart_put_uint16(httpd_conn[socketnum].data_position & 0xFFFF); softuart_puts_progmem(" datalen="); softuart_put_uint16(datalen&0xFFFF); softuart_putnewline(); #endif if (httpd_conn[socketnum].data_position <= datalen){ //find termination: unsigned int endpos; for(endpos=TCP_POS_TXDATA; endpos<TCP_POS_TXDATA+datalen; endpos++){ //quick hack, might return false positives ! if (string_compare_progmem_noeof("---------------", &buffer[endpos])){ endpos-=2; break; } } filesystem_write_data(&buffer[TCP_POS_TXDATA], (endpos-TCP_POS_TXDATA),0); filesystem_close_file(); //pos = httpd_add_progmem_data(HTTPD_CTYPE_HTML,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos); //pos = httpd_add_progmem_data(HTTPD_RNRN,NULL, buffer, pos, 0, NIC_BUFFERSIZE-pos); //pos = httpd_add_progmem_data(PSTR("HTTP/1.0 200 Document follows\r\nContent-Type: text/html\r\n\r\n<html><body>upload done.<br><a href=\"/fs/ls\">-> file list</a></body></html>"),NULL, buffer, TCP_POS_TXDATA, 0, NIC_BUFFERSIZE-pos); //httpd_conn[socketnum].state = 123; pos = httpd_add_progmem_data(PSTR("HTTP/1.0 200 Document follows\r\nContent-Type: text/html\r\n\r\n"),NULL, buffer, TCP_POS_TXDATA, 0, NIC_BUFFERSIZE-pos); httpd_conn[socketnum].state = HTTPD_STATE_ACTIVE; //check if upload successfull if (httpd_conn[socketnum].data_position == datalen) httpd_conn[socketnum].file_id = HTTPD_STATE_FILE_UP_DONE; else httpd_conn[socketnum].file_id = HTTPD_STATE_FILE_UP_ERR; httpd_conn[socketnum].seq_offset = pos - datapos + 1; *appstate = TCP_APPSTATE_HAS_TXDATA; return (pos-TCP_POS_TXDATA); }else{ httpd_conn[socketnum].data_position -= datalen; //filesystem_seek_to(tcp_sockets[socketnum].ack); filesystem_write_data(&buffer[TCP_POS_TXDATA], datalen,0); *appstate = TCP_APPSTATE_EMPTYACK; } return 0; case(123): *appstate = TCP_APPSTATE_FINISHED; return 0; break; /* case(4): case(5): pos = TCP_POS_TXDATA; buffer[pos++] = '.'; *appstate = TCP_APPSTATE_HAS_TXDATA; tcp_sockets[socketnum].misc_state = tcp_sockets[socketnum].misc_state+1; return (pos-TCP_POS_TXDATA); case(6): //finished... *appstate = TCP_APPSTATE_FINISHED; tcp_sockets[socketnum].misc_state = 0; return 0; */ default: *appstate = TCP_APPSTATE_EMPTYACK; } return 0;}//add program data to buffer//replaces $$ by data pointed to by include ptr,//while parsing <include> replace $$.. by special data!//WARNING: very big !! -> rewrite later !unsigned int httpd_add_progmem_data(PGM_P pointer, PGM_P include,unsigned char *buffer, unsigned int pos, unsigned int offset, unsigned int len){ unsigned char data; unsigned char data_next; unsigned char smallbuffer[10]; unsigned char data_available; PGM_P data_ptr; PGM_P data_ptr_old; unsigned char skip_next_data_byte; //start with main data pointer: data_ptr = pointer; data_ptr_old = NULL; data_available = 1; data = pgm_read_byte(data_ptr++); skip_next_data_byte = 0; while (data_available != 0){ if (skip_next_data_byte){ skip_next_data_byte = 0; }else{ if (offset == 0){ //append data: buffer[pos++] = data; len--; }else{ offset--; } } if (len == 0) return 0; data = pgm_read_byte(data_ptr++); data_next = pgm_read_byte(data_ptr); //while parsing the include file we replace //$$TN -> temp now //$$T+ -> max temp today //$$T- -> min temp today //$$CK -> current time //$$FF -> show include file //$$Ixy -> show PORTx.y pin as icon //$$?? -> show enc28j60 revision if ((data == '$') && (data_next == '$')){ switch (pgm_read_byte(data_ptr + 1)){ case ('F'): //include other file ! if (include != NULL){ //reconfigure data pointer //+/- 3: see bolow data_ptr+=3 ! data_ptr_old = data_ptr + 3; data_ptr = include -3; data_available = 2; } break; case ('L'): //dataflash file list pos = filesystem_generate_index(buffer, pos, &len, &offset); if (pos == 0) return 0; //eof break; case ('T'): //temperature request! //if there is not enough space in buffer, abort & wait for next packet: <0XX,X> ///if (pos+5 > NIC_BUFFERSIZE) /// return 0; //temperature fits! //calculate buffer if (pgm_read_byte(data_ptr + 2) == 'N') //TEMP NOW: logger_output_temp(&smallbuffer[0], LOGGER_NOW); else if (pgm_read_byte(data_ptr + 2) == '-') //TEMP MIN logger_output_temp(&smallbuffer[0], LOGGER_MIN); else //TEMP MAX logger_output_temp(&smallbuffer[0], LOGGER_MAX); //copy smallbuffer to ethernetbuffer for (unsigned char i=0; i<5; i++){ if (offset == 0){ buffer[pos++] = smallbuffer[i]; len--; if (len == 0) return 0; }else{ offset--; } } break; case ('C'): //CLOCK: //if there is not enough space in buffer, abort & wait for next packet: <0XX,X> ///if (pos+8 > NIC_BUFFERSIZE) /// return 0; //make sure the time is correct clock_do(); //fill small buffer string_uint8_to_buffer_02dez(&smallbuffer[0], clock[CLOCK_HOUR]); smallbuffer[2] = ':'; string_uint8_to_buffer_02dez(&smallbuffer[3], clock[CLOCK_MIN]); smallbuffer[5] = ':'; string_uint8_to_buffer_02dez(&smallbuffer[6], clock[CLOCK_SEC]); //copy small buffer to ethernet buffer for (unsigned char i=0; i<8; i++){ if (offset == 0){ buffer[pos++] = smallbuffer[i]; len--; if (len == 0) return 0; }else{ offset--; } } break; case ('I'): smallbuffer[0] = pgm_read_byte(data_ptr + 2); smallbuffer[1] = pgm_read_byte(data_ptr + 3); smallbuffer[2] = '_'; smallbuffer[3] = '0' + port_get_portbit(pgm_read_byte(data_ptr + 2), pgm_read_byte(data_ptr + 3)); string_progmem_to_buffer(PSTR(".gif"), &smallbuffer[4], 4); //copy small buffer to ethernet buffer for (unsigned char i=0; i<8; i++){ if (offset == 0){ buffer[pos++] = smallbuffer[i]; len--; if (len == 0) return 0; }else{ offset--; } } data_ptr += 1; //we use one byte more here ! break; case ('?'): string_uint8_to_buffer(&smallbuffer[0], enc28j60_revision); for (unsigned char i=0; i<3; i++){ if (offset == 0){ buffer[pos++] = smallbuffer[i]; len--; if (len == 0) return 0; }else{ offset--; } } break; default: //unknown //do nothing break; } //skip TAG data_ptr += 3; //$$.. skip_next_data_byte = 1; //we have to skip the $ which is inside the data buffer } if (data == 0){ //end of pgm string... is this end of include or end of main ? // if main -> data_available = 1 // if include -> data_available = 2 if (data_available == 1){ data_available = 0; //STOP! }else{ //this was the include, switch back to main! data_available = 1; data_ptr = data_ptr_old; skip_next_data_byte = 1; } } } return pos;}unsigned int httpd_add_progmem_data_bin(PGM_P pointer, unsigned char *buffer, unsigned int pos, unsigned int offset, unsigned int len, unsigned int pgm_datalen){ unsigned char data; //unsigned char data_next; data = pgm_read_byte(pointer++); while (pgm_datalen){ if (offset == 0){ //append data: buffer[pos++] = data; len--; }else{ offset--; } if (len == 0) return 0; data = pgm_read_byte(pointer++); pgm_datalen--; } return pos;}/*unsigned int httpd_add_io_icon(unsigned char *buffer, unsigned int datalen, unsigned int offset, unsigned char socketnum){ unsigned int datapos = 0; //need to add header ?! if (offset < sizeof(HTTPD_BUTTON_HEAD)){ //add gif header: datapos = httpd_add_progmem_data_bin(HTTPD_BUTTON_HEAD, buffer, datapos, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_HEAD)); } if (offset >= sizeof(HTTPD_BUTTON_HEAD)){ offset = offset - sizeof(HTTPD_BUTTON_HEAD); if (offset < sizeof(HTTPD_BUTTON_RED_TABLE)){ //add colortable if ((httpd_conn[socketnum].file_id & 0xff) == HTTPD_STATE_FILE_SET_IO_1_PIC){ //add green datapos = httpd_add_progmem_data_bin(HTTPD_BUTTON_GREEN_TABLE, buffer, datapos, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_GREEN_TABLE)); }else{ //add red datapos = httpd_add_progmem_data_bin(HTTPD_BUTTON_RED_TABLE, buffer, datapos, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_RED_TABLE)); } } } if (offset >= sizeof(HTTPD_BUTTON_RED_TABLE)){ offset = offset - sizeof(HTTPD_BUTTON_RED_TABLE); //add gif data: datapos = httpd_add_progmem_data_bin(HTTPD_BUTTON_DATA, buffer, datapos, offset, NIC_BUFFERSIZE-TCP_POS_TXDATA, sizeof(HTTPD_BUTTON_DATA)); } return datapos+TCP_POS_TXDATA;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -