//----------------------------------------------------------------------// // incubator.cc // // see /usr/share/doc/howto/en/html/Serial-Programming-HOWTO/x115.html // // Latest revision: 12-14-2005 // //----------------------------------------------------------------------// #include "incubator.h" speed_t BAUDRATE = B9600; Alarm *a; Incubator *f; int ALARM_COUNT=0; enum{ OFF, READY, RINGING }; const int ON = 1; const int SLEEPTIME=10; // seconds between successive readings int main(void) { int fd[MAX_PORTS]; initialize_app_globals(); //// Open any additional ports here if(PORTS>0) fd[0] = open_port(SERIAL_PORT_0, PORT0_ADDRESS); if(PORTS>1) fd[1] = open_port(SERIAL_PORT_1, PORT1_ADDRESS); sleep(5); monitor(fd); //// Close any additional ports here if(PORTS>1) close(fd[1]); if(PORTS>0) close(fd[0]); exit(EXIT_SUCCESS); } //------------------------------------------------------------------// // initialize_app_globals // // Change alarm threshold and initial states here. // //------------------------------------------------------------------// void initialize_app_globals(void) { int frzr,k,count=0,cmd_start,location=0,label_start,skip=0; a = new Alarm[ALARMS]; f = new Incubator[INCUBATORS]; char tempstring[FILENAMELENGTH]; char label[FILENAMELENGTH]; FILE *fp; for(k=0;k= INCUBATORS) { printf("Error reading alarms\n"); exit(1); } f[frzr].state = ON; printf("Incubator %d state is ", frzr); switch(f[frzr].state) { case 0: printf("off\n"); break; case 1: printf("on\n"); break; default: printf("%d\n",f[frzr].state); break; } if(feof(fp)) break; count++; if(count >= ALARMS) { printf("Too many alarms\n"); exit(1); } } ALARM_COUNT = count; printf("Alarm count = %d\n",ALARM_COUNT); for(k=0;k0) { port0 = f[0].port; fd0 = file_descriptor[0]; } if(PORTS>1) { port1 = f[1].port; fd1 = file_descriptor[1]; } FD_ZERO(&readfs); maxfd = max(fd0, fd1)+1; /* maximum bit entry (fd) to test */ printf("maxfd = %d\n", maxfd); printf("Waiting for data\n"); while (1) { FD_SET(fd0, &readfs); /* set testing for source 1 */ FD_SET(fd1, &readfs); /* set testing for source 2 */ /* block until input becomes available */ n = select(maxfd, &readfs, NULL, NULL, &timeout); //printf("%d ",n);fflush(stdout); if (FD_ISSET(fd0, &readfs)) /* input from source 1 available */ handle_input(0, fd0); if (FD_ISSET(fd1, &readfs)) /* input from source 2 available */ handle_input(1, fd1); } printf("ending loop\n"); } //------------------------------------------------------------------// // handle_input // //------------------------------------------------------------------// void handle_input(int inc, int fd) { int port, k, n, len, alarm; int got_alarm[ALARM_COUNT]; char tempstring[128]; char *buffer; struct tm *tmstruct; time_t t; // current time in seconds since 1970 char thetime[256]; // current time as string thetime[0] = 0; buffer = new char[128]; port = f[inc].port; for(k=0;k0) { //// Put server time in logs, first part of buffer is garbled. time(&t); // Read clock -> time_t tmstruct = localtime(&t); // time_t -> tm struct strftime(thetime, 256, "%A %B %d %I:%M:%S %P %Y", tmstruct); sprintf(f[inc].inc_string, "%s %s", thetime, buffer+29); len = (int) strlen(f[inc].inc_string); for(k=0;kRINGING if(a[alarm].state == READY && inc == a[alarm].inc) { if(strstr(f[inc].inc_string, "LO") && f[inc].state == ON) { got_alarm[alarm] = 1; printf("Low Alarm %d\n",alarm); } if(strstr(f[inc].inc_string, "HI") && f[inc].state == ON) { got_alarm[alarm] = 1; printf("High Alarm %d\n",alarm); } } //// RINGING->READY if(a[alarm].state == RINGING && inc == a[alarm].inc) { if(!strstr(f[inc].inc_string, "LO") && !strstr(f[inc].inc_string, "HI")) { a[alarm].state = READY; memset(tempstring, ' ', 75); tempstring[75] = 0; } } } for(alarm=0; alarm\n"); fprintf(fp,"\n\nIncubator Conditions\n\n\ \n\

Incubator conditions at %s

\n\ Time stamp: %ld
\n\ \n\ \n", tempstring,current_time); fprintf(fp,"\n", f[inc].inc_string, f[inc].state_string, f[inc].location); fprintf(fp,"
Conditions Alarm state Location
%s \t %s\t %s
\n\n\n"); fclose(fp); system("/home/incubator/programs/incubator/logcommands"); } //--------------------------------------------------------------------// // alarm_ring // //--------------------------------------------------------------------// void alarm_ring(int alarm) { char tempstring[FILENAMELENGTH]; int inc = a[alarm].inc; int status=0; log_temperatures(inc); printf("executing alarm %d\n",alarm); sprintf(tempstring, "Executing %s", a[alarm].command); tempstring[79]=0; sleep(1); sprintf(tempstring,"Incubator %d conditions %s alarm %d\n", inc, f[inc].inc_string, alarm); syslog(LOG_WARNING, tempstring); printf("sending alarm >>%s\n<<",a[alarm].command); status = system(a[alarm].command); if(status!=0) { sprintf(tempstring,"Error executing alarm command: \n%d %s\n", inc, a[alarm].command); syslog(LOG_WARNING, tempstring); } } //--------------------------------------------------------------------------// // remove_terminal_cr // //--------------------------------------------------------------------------// void remove_terminal_cr(char *s) { int pos = max(0, (int)(strlen(s))-1); if(s[pos]=='\n') s[pos]=0; } //--------------------------------------------------------------------------// // between - returns 1 if a is between b and c // //--------------------------------------------------------------------------// int between(int a,int b,int c) { if((a>=b)&&(a<=c)) return(1); else return(0); }