/************************************************************************/ /* */ /* Daniel John McAuley */ /* u9556575 */ /* Queens University Belfast */ /* Level 4 1999/2000 */ /* */ /* Final Year Project CGI component */ /* */ /* File: netcon_cgi.c */ /* Description: CGI program to interface with serial port */ /* on PC, for communication between Web Page */ /* and PIC based remote environmental controller */ /* */ /* See Final Year Report for more information */ /* */ /* Version: 1.0b */ /* */ /* */ /* To-do: More error check and handling */ /* Interrupt driven serial possibility */ /* Take out all hardcoded numerial bounds */ /* */ /************************************************************************/ #include #include "cgic.h" #include #define MESSAGE_SIZE 16 #define NO_BYTES_TO_READ 512 #define NO_BYTES_TO_WRITE 512 #define START_OF_TEMP 5 #define END_OF_TEMP 10 #define TEMP_SIZE 5 char str_received[MESSAGE_SIZE]; /************************************************************************/ /* PIC Env globals */ /************************************************************************/ struct status{ char TEMP_STATUS[10]; char PORTB_PIN0_STATUS[10]; char PORTB_PIN1_STATUS[10]; char PORTB_PIN2_STATUS[10]; char PORTB_PIN3_STATUS[10]; char PORTB_PIN4_STATUS[10]; char PORTB_PIN5_STATUS[10]; char PORTB_PIN6_STATUS[10]; char PORTB_PIN7_STATUS[10]; }; /************************************************************************/ /* PIC Comm Messages */ /************************************************************************/ const char PORTB_PIN0_RD[10] = {"C_PTB_0_RD"}; const char PORTB_PIN1_RD[10] = {"C_PTB_1_RD"}; const char PORTB_PIN2_RD[10] = {"C_PTB_2_RD"}; const char PORTB_PIN3_RD[10] = {"C_PTB_3_RD"}; const char PORTB_PIN4_RD[10] = {"C_PTB_4_RD"}; const char PORTB_PIN5_RD[10] = {"C_PTB_5_RD"}; const char PORTB_PIN6_RD[10] = {"C_PTB_6_RD"}; const char PORTB_PIN7_RD[10] = {"C_PTB_7_RD"}; const char PORTB_PIN4_ON[10] = {"C_PTB_4_ON"}; const char PORTB_PIN5_ON[10] = {"C_PTB_5_ON"}; const char PORTB_PIN6_ON[10] = {"C_PTB_6_ON"}; const char PORTB_PIN7_ON[10] = {"C_PTB_7_ON"}; const char PORTB_PIN4_OFF[10] = {"C_PTB_4_OF"}; const char PORTB_PIN5_OFF[10] = {"C_PTB_5_OF"}; const char PORTB_PIN6_OFF[10] = {"C_PTB_6_OF"}; const char PORTB_PIN7_OFF[10] = {"C_PTB_7_OF"}; const char TEMP_SENSOR_READ[10] = {"C_DS_01_RD"}; /************************************************************************/ /* CGI Env Structure */ /************************************************************************/ struct data{ char device_buff[3]; char scene_buff[7]; char portb_pin0_buff[5]; char portb_pin1_buff[5]; char portb_pin2_buff[5]; char portb_pin3_buff[5]; char portb_pin4_buff[5]; char portb_pin5_buff[5]; char portb_pin6_buff[5]; char portb_pin7_buff[5]; char temp_sensor_buff[5]; char clui_buff[16]; }; /************************************************************************/ HANDLE serialcomm; /* Handle for serialport session */ char port[] = {"COM1"}; /* Desired serial port name */ /************************************************************************/ /************************************************************************/ /* Function Prototypes */ /************************************************************************/ int serial_open(void); int serial_setup(void); int serial_read(char * received_str); int serial_write(char * str_to_write); int serial_close(void); int serial_timeouts(void); int flush_buffers(void); int scene_control(struct data scene_data); void netcon_cgi(void); void temp_scene(struct data scene_data); void input_scene(struct data scene_data); void output_scene(struct data scene_data); void clui_scene(struct data scene_data); void build_message(struct data scene_data,char * scene_commands,const char * msg_ptr ); void extract_data(char * source_buff, char * dest_buff); void gen_flush_buff(char *buffer, int buff_size); void output_TEMP_HTML(struct data scene_data,float temp); void output_INPUT_HTML(struct status input_data); void output_OUTPUTS_HTML(struct status output_data); void output_CLUI_HTML(struct data scene_data,char * clui_resp); void error_HTML(void); struct data capture_cgi(void); float get_temp(char * temp_data); /************************************************************************/ /* CGI main */ /************************************************************************/ int cgiMain() { #if DEBUG /* Load a saved CGI scenario if we're debugging */ cgiReadEnvironment("/home/boutell/public_html/capcgi.dat"); #endif flush_buffers(); netcon_cgi(); return 0; } /************************************************************************/ /* Program Functions */ /************************************************************************/ /************************************************************************/ /* NETcon_cgi main function */ /************************************************************************/ void netcon_cgi(void){ struct data scene_data; scene_data = capture_cgi(); scene_control(scene_data); } /************************************************************************/ /* capture_data */ /************************************************************************/ struct data capture_cgi(void){ struct data scene_data; cgiFormStringNoNewlines("DEVICE", scene_data.device_buff, 3); cgiFormStringNoNewlines("SCENE", scene_data.scene_buff, 7); cgiFormStringNoNewlines("PORTB_PIN0", scene_data.portb_pin0_buff, 5); cgiFormStringNoNewlines("PORTB_PIN1", scene_data.portb_pin1_buff, 5); cgiFormStringNoNewlines("PORTB_PIN2", scene_data.portb_pin2_buff, 5); cgiFormStringNoNewlines("PORTB_PIN3", scene_data.portb_pin3_buff, 5); cgiFormStringNoNewlines("PORTB_PIN4", scene_data.portb_pin4_buff, 5); cgiFormStringNoNewlines("PORTB_PIN5", scene_data.portb_pin5_buff, 5); cgiFormStringNoNewlines("PORTB_PIN6", scene_data.portb_pin6_buff, 5); cgiFormStringNoNewlines("PORTB_PIN7", scene_data.portb_pin7_buff, 5); cgiFormStringNoNewlines("TEMP_SENSOR", scene_data.temp_sensor_buff, 5); cgiFormStringNoNewlines("CLUI_CMD", scene_data.clui_buff, 17); return(scene_data); } /************************************************************************/ /* scene_control */ /************************************************************************/ int scene_control(struct data scene_data){ if(serial_open() != 0){ error_HTML(); return(-1); } serial_setup(); if(strstr(scene_data.scene_buff,"TEMP")){ // Determine scene inline temp_scene(scene_data); } if(strstr(scene_data.scene_buff,"INPUT")){ input_scene(scene_data); } if(strstr(scene_data.scene_buff,"OUTPUT")){ output_scene(scene_data); } if(strstr(scene_data.scene_buff,"CLUI")){ clui_scene(scene_data); } else{ //error handle } serial_close(); return(0); } /************************************************************************/ /* serial_open */ /************************************************************************/ int serial_open() { serialcomm = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); if (serialcomm == INVALID_HANDLE_VALUE){ /* error opening port */ return (-1); } return(0); } /************************************************************************/ /* serial_setup */ /************************************************************************/ int serial_setup() { DCB dcb; char settings[] = {"9600,n,8,1"}; FillMemory(&dcb, sizeof(dcb), 0); dcb.DCBlength = sizeof(dcb); if (!BuildCommDCB(settings, &dcb)) { fprintf(cgiOut, "Cannot do buildcomm
\n"); // Couldn't build the DCB. Usually a problem // with the communications specification string. return FALSE; } if (!SetCommState(serialcomm, &dcb)){ // Error in SetCommState. Possibly a problem with the communications // port handle or a problem with the DCB structure itself. return FALSE; } else return TRUE; // DCB is ready for use. } /************************************************************************/ /* serial_read */ /************************************************************************/ int serial_read(char * received_str) { int BYTES_TO_READ = 16; DWORD bytes_read = 0; if (!ReadFile(serialcomm,received_str,BYTES_TO_READ,&bytes_read,0)){ return(-1); } else return(0); } /************************************************************************/ /* serial_write */ /************************************************************************/ int serial_write(char * str_to_write) { int BYTES_TO_WRITE = 16; DWORD bytes_written = 0; if(!WriteFile(serialcomm,str_to_write,BYTES_TO_WRITE,&bytes_written,0)){ return(-1); } else return(0); } /************************************************************************/ /* serial_close */ /************************************************************************/ int serial_close(){ if(!CloseHandle(serialcomm)){ return(-1); } else return(0); } /************************************************************************/ /* flush buffers */ /************************************************************************/ int flush_buffers(){ PurgeComm(serialcomm,PURGE_TXCLEAR); PurgeComm(serialcomm,PURGE_RXCLEAR); return(0); } /************************************************************************/ /* serial_timeouts */ /************************************************************************/ int serial_timeouts(){ COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 0; timeouts.ReadTotalTimeoutConstant = 0; timeouts.ReadTotalTimeoutMultiplier = 0; if (!SetCommTimeouts(serialcomm, &timeouts)){ return(-1); // Error setting time-outs. } else return(0); } /************************************************************************/ /* temp_scene */ /************************************************************************/ void temp_scene(struct data scene_data){ float temp =0.0; //For temp value char temp_cmd[16]; // Output command buffer char temp_resp[16]; // Response buff char temp_data[10]; // For temp data section build_message(scene_data,temp_cmd,TEMP_SENSOR_READ); flush_buffers(); gen_flush_buff(temp_resp,MESSAGE_SIZE); serial_write(temp_cmd); serial_read(temp_resp); extract_data(temp_resp,temp_data); temp = get_temp(temp_data); output_TEMP_HTML(scene_data,temp); } /************************************************************************/ /* build_message */ /************************************************************************/ void build_message(struct data scene_data,char * scene_commands,const char * msg_ptr ){ int i,j=0; gen_flush_buff(scene_commands,MESSAGE_SIZE); scene_commands[0] = '*'; // Start of PIC comm indicator scene_commands[1] = scene_data.device_buff[0]; // Copy the destination address scene_commands[2] = scene_data.device_buff[1]; scene_commands[3] = '0'; // Copy the source address scene_commands[4] = '0'; j=0; for(i=5;i<15;i++){ scene_commands[i] = msg_ptr[j]; j++; } scene_commands[15] = '#'; } /************************************************************************/ /* input_scene */ /************************************************************************/ void input_scene(struct data scene_data){ char input_cmd[16]; char input_resp[16]; struct status input_data; build_message(scene_data,input_cmd,PORTB_PIN0_RD); // Build message flush_buffers(); gen_flush_buff(input_resp,MESSAGE_SIZE); serial_write(input_cmd); // Write to port serial_read(input_resp); // read from port extract_data(input_resp,input_data.PORTB_PIN0_STATUS); // Extract the data section build_message(scene_data,input_cmd,PORTB_PIN1_RD); flush_buffers(); gen_flush_buff(input_resp,MESSAGE_SIZE); serial_write(input_cmd); serial_read(input_resp); extract_data(input_resp,input_data.PORTB_PIN1_STATUS); build_message(scene_data,input_cmd,PORTB_PIN2_RD); flush_buffers(); gen_flush_buff(input_resp,MESSAGE_SIZE); serial_write(input_cmd); serial_read(input_resp); extract_data(input_resp,input_data.PORTB_PIN2_STATUS); build_message(scene_data,input_cmd,PORTB_PIN3_RD); flush_buffers(); gen_flush_buff(input_resp,MESSAGE_SIZE); serial_write(input_cmd); serial_read(input_resp); extract_data(input_resp,input_data.PORTB_PIN3_STATUS); output_INPUT_HTML(input_data); } /************************************************************************/ /* output_scene */ /************************************************************************/ void output_scene(struct data scene_data){ char output_cmd[16]; char output_resp[16]; struct status output_data; // Pin 4 Check command action and build appropriate message if(strstr(scene_data.portb_pin4_buff,"READ")){ build_message(scene_data,output_cmd,PORTB_PIN4_RD); } if(strstr(scene_data.portb_pin4_buff,"ON")){ build_message(scene_data,output_cmd,PORTB_PIN4_ON); } if(strstr(scene_data.portb_pin4_buff,"OFF")){ build_message(scene_data,output_cmd,PORTB_PIN4_OFF); } serial_write(output_cmd); // Output the message serial_read(output_resp); // Read response extract_data(output_resp,output_data.PORTB_PIN4_STATUS); // Extract the data // Pin 5 Check command action and build appropriate message if(strstr(scene_data.portb_pin5_buff,"READ")){ build_message(scene_data,output_cmd,PORTB_PIN5_RD); } if(strstr(scene_data.portb_pin5_buff,"ON")){ build_message(scene_data,output_cmd,PORTB_PIN5_ON); } if(strstr(scene_data.portb_pin5_buff,"OFF")){ build_message(scene_data,output_cmd,PORTB_PIN5_OFF); } serial_write(output_cmd); serial_read(output_resp); extract_data(output_resp,output_data.PORTB_PIN5_STATUS); // Pin 6 if(strstr(scene_data.portb_pin6_buff,"READ")){ build_message(scene_data,output_cmd,PORTB_PIN6_RD); } if(strstr(scene_data.portb_pin6_buff,"ON")){ build_message(scene_data,output_cmd,PORTB_PIN6_ON); } if(strstr(scene_data.portb_pin6_buff,"OFF")){ build_message(scene_data,output_cmd,PORTB_PIN6_OFF); } serial_write(output_cmd); serial_read(output_resp); extract_data(output_resp,output_data.PORTB_PIN6_STATUS); // Pin 7 if(strstr(scene_data.portb_pin7_buff,"READ")){ build_message(scene_data,output_cmd,PORTB_PIN7_RD); } if(strstr(scene_data.portb_pin7_buff,"ON")){ build_message(scene_data,output_cmd,PORTB_PIN7_ON); } if(strstr(scene_data.portb_pin7_buff,"OFF")){ build_message(scene_data,output_cmd,PORTB_PIN7_OFF); } serial_write(output_cmd); serial_read(output_resp); extract_data(output_resp,output_data.PORTB_PIN7_STATUS); output_OUTPUTS_HTML(output_data); } /************************************************************************/ /* clui_scene */ /************************************************************************/ void clui_scene(struct data scene_data){ char clui_resp[MESSAGE_SIZE+1] = {"NOT_AVAILABLE!!!"}; // Not in design if(strlen(scene_data.clui_buff) != 16){ // Incorporated error handle output_CLUI_HTML(scene_data,"Not a recognised CLUI cmd!"); // Planned as future option } if(strlen(scene_data.clui_buff) == 16){ flush_buffers(); gen_flush_buff(clui_resp,MESSAGE_SIZE); serial_write(scene_data.clui_buff); serial_read(clui_resp); clui_resp[MESSAGE_SIZE] = '\0'; // Ensure clui_resp is terminated properly output_CLUI_HTML(scene_data,clui_resp); } } /************************************************************************/ /* extract data */ /************************************************************************/ void extract_data(char * source_buff, char * dest_buff){ int i,j=0; for(i=5;i<15;i++){ dest_buff[j] = source_buff[i]; j++; } } /************************************************************************/ /* generic flush buffer */ /************************************************************************/ void gen_flush_buff(char *buffer, int buff_size){ int i=0; for(i=0;i\n"); fprintf(cgiOut, "-== NETcon==- SCENE: Temp sensor response\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "Temperature\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",scene_data.device_buff); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device Read:%s
Current Temperature:%.1f
\n", temp); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device:
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "TEMP | INPUTS | OUTPUTS | CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); } /************************************************************************/ /* output_INPUT_HTML */ /************************************************************************/ void output_INPUT_HTML(struct status input_data){ char * pin0,*pin1,*pin2,*pin3; if(strstr(input_data.PORTB_PIN0_STATUS,"R_PTB_0_ON")){ // Pin 0 search pin0 = "ON"; } if(strstr(input_data.PORTB_PIN0_STATUS,"R_PTB_0_OF")){ pin0 = "OFF"; } if(strstr(input_data.PORTB_PIN1_STATUS,"R_PTB_1_ON")){ // Pin 1 search pin1 = "ON"; } if(strstr(input_data.PORTB_PIN1_STATUS,"R_PTB_1_OF")){ pin1 = "OFF"; } if(strstr(input_data.PORTB_PIN2_STATUS,"R_PTB_2_ON")){ // Pin 2 search pin2 = "ON"; } if(strstr(input_data.PORTB_PIN2_STATUS,"R_PTB_2_OF")){ pin2 = "OFF"; } if(strstr(input_data.PORTB_PIN3_STATUS,"R_PTB_3_ON")){ // Pin 3 search pin3 = "ON"; } if(strstr(input_data.PORTB_PIN3_STATUS,"R_PTB_3_OF")){ pin3 = "OFF"; } cgiHeaderContentType("text/html"); fprintf(cgiOut, "<head>\n"); fprintf(cgiOut, "<title>-== NETcon==- SCENE: Input response\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin0,pin0); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin1,pin1); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin2,pin2); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Input NameStatus
Input 1 [Port B: Pin 0]:\"%s\"
Input 2 [Port B: Pin 1]:\"%s\"
Input 3 [Port B: Pin 2]:\"%s\"
Input 4 [Port B: Pin 3]:\"%s\"
\n",pin3,pin3); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device:
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "TEMP | INPUTS | OUTPUTS | CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); } /************************************************************************/ /* output_OUTPUTS_HTML */ /************************************************************************/ void output_OUTPUTS_HTML(struct status output_data){ char * pin4,*pin5,*pin6,*pin7; if(strstr(output_data.PORTB_PIN4_STATUS,"R_PTB_4_ON")){ // Pin 4 search pin4 = "ON"; } if(strstr(output_data.PORTB_PIN4_STATUS,"R_PTB_4_OF")){ pin4 = "OFF"; } if(strstr(output_data.PORTB_PIN5_STATUS,"R_PTB_5_ON")){ // Pin 5 search pin5 = "ON"; } if(strstr(output_data.PORTB_PIN5_STATUS,"R_PTB_5_OF")){ pin5 = "OFF"; } if(strstr(output_data.PORTB_PIN6_STATUS,"R_PTB_6_ON")){ // Pin 6 search pin6 = "ON"; } if(strstr(output_data.PORTB_PIN6_STATUS,"R_PTB_6_OF")){ pin6 = "OFF"; } if(strstr(output_data.PORTB_PIN7_STATUS,"R_PTB_7_ON")){ // Pin 7 search pin7 = "ON"; } if(strstr(output_data.PORTB_PIN7_STATUS,"R_PTB_7_OF")){ pin7 = "OFF"; } cgiHeaderContentType("text/html"); fprintf(cgiOut, "<head>\n"); fprintf(cgiOut, "<title>-== NETcon==- SCENE: Output response\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin4,pin4); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin5,pin5); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",pin6,pin6); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Action OutputStatus
\n"); fprintf(cgiOut, "Output 1 [PortB: Pin 4]:\"%s\"
\n"); fprintf(cgiOut, "Output 2 [PortB: Pin 5]:\"%s\"
\n"); fprintf(cgiOut, "Output 3 [PortB: Pin 6]:\"%s\"
\n"); fprintf(cgiOut, "Output 4 [PortB: Pin 7]:\"%s\"
\n",pin7,pin7); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device:
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "TEMP | INPUTS | OUTPUTS | CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); } /************************************************************************/ /* Output if serial error */ /************************************************************************/ void error_HTML(void){ cgiHeaderContentType("text/html"); fprintf(cgiOut, "<head>\n"); fprintf(cgiOut, "<title>-== NETcon==- ERROR\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "Error\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "There has been an error in setting up serial communication!\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "Another application may be using COM1...\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "TEMP | INPUTS | OUTPUTS | CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); } /************************************************************************/ /* output_CLUI_HTML */ /************************************************************************/ void output_CLUI_HTML(struct data scene_data,char * clui_resp){ cgiHeaderContentType("text/html"); fprintf(cgiOut, "<head>\n"); fprintf(cgiOut, "<title>-== NETcon==- SCENE: CLUI Response\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n",scene_data.device_buff); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n", scene_data.clui_buff); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device used:%s
Command issued:%s
PIC Response:%s
\n", clui_resp); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Enter CLUI command:
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
Device:
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, " \n"); fprintf(cgiOut, "\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "TEMP | INPUTS | OUTPUTS | CLUI\n"); fprintf(cgiOut, "
\n"); fprintf(cgiOut, "\n"); } /************************************************************************/ /* temp conversion fn */ /************************************************************************/ float get_temp(char * temp_data){ float temp =0; int slsb = 0; float lsb =0; if(temp_data[9] == 0x00){ lsb = temp_data[8]; /* Like this to avoid convert loss from int to float */ temp = lsb/2; return(temp); } if(temp_data[9] == 0xFF){ slsb = (~temp_data[8] + 0x01); /* Get around conversion here? */ temp = slsb/2; return(temp); } return(-99); } /************************************************************************/ /* END */ /************************************************************************/