int initDevice() { int retVal=0; if(fdLos==0) { //First time fprintf(stderr,"opening %s\n",LOS_DEVICE); fdLos = open(LOS_DEVICE, O_WRONLY ); if(fdLos<=0) { fprintf(stderr,"Error opening %s (%s):\n",LOS_DEVICE,strerror(errno)); syslog(LOG_ERR,"Error opening %s (%s):\n",LOS_DEVICE,strerror(errno)); handleBadSigs(0); } telemwrap_init(TW_LOS); } return retVal; }
void ip470Setup() { int i; /* channel assignments: ?? */ rmid470(&config470); if((byte)config470.id_prom[5]!=0x8) { printf("Board ID Wrong\n\n"); printf("Board ID Information\n"); printf("\nIdentification: "); for(i = 0; i < 4; i++) /* identification */ printf("%c",config470.id_prom[i]); printf("\nManufacturer's ID: %X",(byte)config470.id_prom[4]); printf("\nIP Model Number: %X",(byte)config470.id_prom[5]); printf("\nRevision: %X",(byte)config470.id_prom[6]); printf("\nReserved: %X",(byte)config470.id_prom[7]); printf("\nDriver I.D. (low): %X",(byte)config470.id_prom[8]); printf("\nDriver I.D. (high): %X",(byte)config470.id_prom[9]); printf("\nTotal I.D. Bytes: %X",(byte)config470.id_prom[10]); printf("\nCRC: %X\n",(byte)config470.id_prom[11]); handleBadSigs(1004); } else { printf("Board ID correct %d\n",(byte)config470.id_prom[5]); } config470.param=0; config470.e_mode=0; config470.mask_reg=0; config470.deb_control=0; config470.deb_clock=1; config470.enable=0; config470.vector=0; for(i = 0; i != 2; i++) /* Curious why != as oppposed to < */ { config470.ev_control[i] = 0;/* event control registers */ config470.deb_duration[i] = 0;/* debounce duration registers */ } // for(i = 0; i < 6; i++) // config470.event_status[i] = 0; /* initialize event status flags */ }
int main(int argc, char *argv[]) { //Temporary variables int retVal=0,pri=0,ind=0; /* Config file thingies */ // int status=0; // char* eString ; sprintf(currentOpenportDir,"%s",OPENPORT_OUTPUT_DIR); char *progName=basename(argv[0]); // retVal=sortOutPidFile(progName); if(retVal<0) return -1; /* Set signal handlers */ signal(SIGUSR1, sigUsr1Handler); signal(SIGUSR2, sigUsr2Handler); signal(SIGTERM, handleBadSigs); signal(SIGINT, handleBadSigs); signal(SIGSEGV, handleBadSigs); signal(SIGRTMIN, refreshLinksHandler); /* Setup log */ setlogmask(LOG_UPTO(LOG_INFO)); openlog (progName, LOG_PID, ANITA_LOG_FACILITY) ; syslog(LOG_INFO,"Starting Openportd\n"); /* Load Config */ kvpReset () ; // status = configLoad (GLOBAL_CONF_FILE,"global") ; // eString = configErrorString (status) ; //Fill event dir names for(pri=0;pri<NUM_PRIORITIES;pri++) { retVal=snprintf(eventTelemDirs[pri],sizeof(eventTelemDirs[pri]),"%s/%s%d",BASE_EVENT_TELEM_DIR,EVENT_PRI_PREFIX,pri); if(retVal<0) { syslog(LOG_ERR,"Error using snprintf -- %s",strerror(errno)); } retVal=snprintf(eventTelemLinkDirs[pri],sizeof(eventTelemLinkDirs[pri]),"%s/link",eventTelemDirs[pri]); if(retVal<0) { syslog(LOG_ERR,"Error using snprintf -- %s",strerror(errno)); } makeDirectories(eventTelemLinkDirs[pri]); } makeDirectories(OPENPORT_OUTPUT_DIR); makeDirectories(OPENPORT_STAGE_DIR); makeDirectories(OPENPORTD_CMD_ECHO_TELEM_LINK_DIR); for(ind=0;ind<NUM_HK_TELEM_DIRS;ind++) { makeDirectories(telemLinkDirs[ind]); } retVal=readConfig(); char currentHeader[FILENAME_MAX]; static int numLinks[NUM_PRIORITIES]={0}; static int numHkLinks[NUM_HK_TELEM_DIRS]={0}; int totalEventLinks=0; int totalHkLinks=0; int totalEventsSent=0; time_t currentTime=0; time_t lastRefresh=0; int hkInd=0; char *tempString=0; int numSent=0; //Setup inotify watches for(pri=0;pri<NUM_PRIORITIES;pri++) { //Setup inotify watches if(wdEvents[pri]==0) { wdEvents[pri]=setupLinkWatchDir(eventTelemLinkDirs[pri]); if(wdEvents[pri]<=0) { fprintf(stderr,"Unable to watch %s\n",eventTelemLinkDirs[pri]); syslog(LOG_ERR,"Unable to watch %s\n",eventTelemLinkDirs[pri]); handleBadSigs(0); } numLinks[pri]=getNumLinks(wdEvents[pri]); } } for(hkInd=0;hkInd<NUM_HK_TELEM_DIRS;hkInd++) { if(wdHks[hkInd]==0) { wdHks[hkInd]=setupLinkWatchDir(telemLinkDirs[hkInd]); if(wdHks[hkInd]<=0) { fprintf(stderr,"Unable to watch %s\n",telemLinkDirs[hkInd]); syslog(LOG_ERR,"Unable to watch %s\n",telemLinkDirs[hkInd]); // handleBadSigs(0); } numHkLinks[hkInd]=getNumLinks(wdHks[hkInd]); } } time(&lastRefresh); int hkCount=0; printf("Before while loop\n"); startCopyScript(); do { if(printToScreen) printf("Initalizing Openportd\n"); currentState=PROG_STATE_RUN; while(currentState==PROG_STATE_RUN) { printf("Inside while loop\n"); if(!sendData) { sleep(1); continue; } //The idea is that we only write an output file if there is space for it int numWaitingToTransfer=countFilesInDir(currentOpenportDir); if(numWaitingToTransfer>2) { fprintf(stderr,"There are %d files waiting to transer, will sleep now\n",numWaitingToTransfer); sleep(1); continue; } if(totalEventsSent%10==0) { printf("Data sent\nEvents:\t"); for(pri=0;pri<NUM_PRIORITIES;pri++) printf("%d ",numEventsSent[pri]); printf("\nHk:\t"); for(hkInd=0;hkInd<NUM_HK_TELEM_DIRS;hkInd++) printf("%d ",numHksSent[hkInd]); printf("\n"); } //Check to see if we need to refresh the links time(¤tTime); if(currentTime>lastRefresh+REFRESH_LINKS_EVERY || needToRefreshLinks) { refreshLinkDirs(); lastRefresh=currentTime; needToRefreshLinks=0; } //Update the link lists //or some time has passed if(totalEventLinks==0) retVal=checkLinkDirs(1,0); else retVal=checkLinkDirs(0,1); totalEventLinks=0; for(pri=0;pri<NUM_PRIORITIES;pri++) { numLinks[pri]=getNumLinks(wdEvents[pri]); totalEventLinks+=numLinks[pri]; } totalHkLinks=0; for(hkInd=0;hkInd<NUM_HK_TELEM_DIRS;hkInd++) { numHkLinks[hkInd]=getNumLinks(wdHks[hkInd]); totalHkLinks+=numHkLinks[hkInd]; } if(!retVal && totalHkLinks==0 && totalEventLinks==0) { //No data needToRefreshLinks=1; usleep(1000); continue; } printf("%d %d %d\n",totalEventLinks,totalHkLinks,retVal); if(totalEventLinks) { //Which priority are we sending currentPri=priorityOrder[orderIndex]; int doneEvent=0; while(!doneEvent && totalEventLinks>0) { while(numLinks[currentPri]==0) { orderIndex++; if(orderIndex>=numOrders) orderIndex=0; currentPri=priorityOrder[orderIndex]; } printf("Trying priority %d -- numLinks %d\n",currentPri,numLinks[currentPri]); if(numLinks[currentPri]) { //Got an event tempString=getLastLink(wdEvents[currentPri]); retVal=snprintf(currentHeader,sizeof(currentHeader),"%s/%s",eventTelemLinkDirs[currentPri],tempString); if(retVal<0) { syslog(LOG_ERR,"Error using snprintf -- %s",strerror(errno)); } // syslog(LOG_INFO,"Trying %s\n",currentHeader); doneEvent=readAndSendEventRamdisk(currentHeader); //Also deletes if(doneEvent) { numEventsSent[currentPri]++; totalEventsSent++; } numLinks[currentPri]--; totalEventLinks--; } } if(currentTime>lastRefresh+REFRESH_LINKS_EVERY || needToRefreshLinks) { refreshLinkDirs(); lastRefresh=currentTime; needToRefreshLinks=0; totalHkLinks=0; for(hkInd=0;hkInd<NUM_HK_TELEM_DIRS;hkInd++) { numHkLinks[hkInd]=getNumLinks(wdHks[hkInd]); totalHkLinks+=numHkLinks[hkInd]; } } //Now try to send some stuff I like numSent=0; if(numHkLinks[OPENPORT_TELEM_HEADER]) readHkAndOpenport(wdHks[OPENPORT_TELEM_HEADER], headersPerEvent,HEADER_TELEM_DIR, HEADER_TELEM_LINK_DIR,sizeof(AnitaEventHeader_t),&numSent); numHksSent[OPENPORT_TELEM_HEADER]+=numSent; numSent=0; if(numHkLinks[OPENPORT_TELEM_CMD_ECHO]) readHkAndOpenport(wdHks[OPENPORT_TELEM_CMD_ECHO],echoesPerEvent, OPENPORTD_CMD_ECHO_TELEM_DIR, OPENPORTD_CMD_ECHO_TELEM_LINK_DIR, sizeof(CommandEcho_t),&numSent); numHksSent[OPENPORT_TELEM_CMD_ECHO]+=numSent; numSent=0; if(numHkLinks[OPENPORT_TELEM_HK]) readHkAndOpenport(wdHks[OPENPORT_TELEM_HK],hkPerEvent,HK_TELEM_DIR, HK_TELEM_LINK_DIR,sizeof(HkDataStruct_t),&numSent); numSent=0; if(numHkLinks[OPENPORT_TELEM_ADU5A_PAT]) readHkAndOpenport(wdHks[OPENPORT_TELEM_ADU5A_PAT],1, ADU5A_PAT_TELEM_DIR, ADU5A_PAT_TELEM_LINK_DIR, sizeof(GpsAdu5PatStruct_t),&numSent); numHksSent[OPENPORT_TELEM_ADU5A_PAT]+=numSent; numSent=0; if(numHkLinks[OPENPORT_TELEM_MONITOR]) readHkAndOpenport(wdHks[OPENPORT_TELEM_MONITOR],monitorPerEvent, MONITOR_TELEM_DIR,MONITOR_TELEM_LINK_DIR, sizeof(MonitorStruct_t),&numSent); numHksSent[OPENPORT_TELEM_MONITOR]+=numSent; // else if(totalEventLinks==0) { // usleep(1000); // } orderIndex++; if(orderIndex>=numOrders) orderIndex=0; } //Now we try and send some data //I'm going to try and modify this but for now if(hkCount%eventBandwidth==0) sendSomeHk(10000); hkCount++; } } while (currentState == PROG_STATE_INIT); stopCopyScript(); unlink(OPENPORTD_PID_FILE); return 0; }
void acromagSetup() { long addr=0; /* Check for Carrier Library */ if(InitCarrierLib() != S_OK) { printf("\nCarrier library failure"); handleBadSigs(1000); } /* Connect to Carrier */ if(CarrierOpen(digitalCarrierNum, &carrierHandle) != S_OK) { printf("\nUnable to Open instance of carrier.\n"); handleBadSigs(1001); } config470.nHandle = carrierHandle; config470.slotLetter=IP470_SLOT; config320.nHandle = carrierHandle; config320.slotLetter=IP320_SLOT; if(printToScreen) { printf("Inititalizing IP470 in slot %c\n",config470.slotLetter); printf("Inititalizing IP320 in slot %c\n",config320.slotLetter); } if(CarrierInitialize(carrierHandle) == S_OK) { /* Initialize Carrier */ SetInterruptLevel(carrierHandle, INTERRUPT_LEVEL); /* Set carrier interrupt level */ } else { printf("\nUnable initialize the carrier %lX", addr); handleBadSigs(1002); } config470.bCarrier=TRUE; config320.bCarrier=TRUE; /* GetCarrierAddress(carrierHandle, &addr); SetCarrierAddress(carrierHandle, addr); */ if(GetIpackAddress(carrierHandle,config470.slotLetter, (long *) &config470.brd_ptr) != S_OK) { printf("\nIpack address failure for IP470\n."); handleBadSigs(10003); } config470.bInitialized = TRUE; if(GetIpackAddress(carrierHandle,config320.slotLetter, (long *) &config320.brd_ptr) != S_OK) { printf("\nIpack address failure for IP320\n."); handleBadSigs(10003); } config320.bInitialized = TRUE; }
int main(int argc, char *argv[]) { int pri,retVal,firstTime=1,ind=0; time_t lastRefresh=0; time_t lastUpdate=0; time_t currentTime=0; char *tempString=0; char *progName=basename(argv[0]); // last_send.tv_sec = 0; // last_send.tv_nsec = 0; //Sort out PID File retVal=sortOutPidFile(progName); if(retVal!=0) { return retVal; } //Directory listing tools // char currentTouchname[FILENAME_MAX]; char currentHeader[FILENAME_MAX]; int numLinks[NUM_PRIORITIES]={0}; int totalEventLinks=0; int wdEvents[NUM_PRIORITIES]={0}; // int sillyEvNum[NUM_PRIORITIES]={0}; /* Set signal handlers */ signal(SIGUSR1, sigUsr1Handler); signal(SIGUSR2, sigUsr2Handler); signal(SIGTERM, handleBadSigs); signal(SIGINT,handleBadSigs); signal(SIGSEGV,handleBadSigs); /* Setup log */ setlogmask(LOG_UPTO(LOG_INFO)); openlog (progName, LOG_PID, ANITA_LOG_FACILITY) ; // Load Config retVal=readConfig(); if(!laptopDebug) { retVal=initDevice(); if(retVal!=0) { return 1; } } else { retVal=0; printf("Running in debug mode not actually trying to talk to device\n"); makeDirectories(fakeOutputDir); } makeDirectories(PRIORITIZERD_EVENT_LINK_DIR); for(ind=0;ind<NUM_HK_TELEM_DIRS;ind++) { makeDirectories(telemLinkDirs[ind]); } //Fill event dir names for(pri=0;pri<NUM_PRIORITIES;pri++) { sprintf(eventTelemDirs[pri],"%s/%s%d",BASE_EVENT_TELEM_DIR, EVENT_PRI_PREFIX,pri); sprintf(eventTelemLinkDirs[pri],"%s/link",eventTelemDirs[pri]); makeDirectories(eventTelemLinkDirs[pri]); if(sendData) { //And setup inotify watches if(wdEvents[pri]==0) { wdEvents[pri]=setupLinkWatchDir(eventTelemLinkDirs[pri]); if(wdEvents[pri]<=0) { fprintf(stderr,"Unable to watch %s\n",eventTelemLinkDirs[pri]); syslog(LOG_ERR,"Unable to watch %s\n",eventTelemLinkDirs[pri]); handleBadSigs(0); } numLinks[pri]=getNumLinks(wdEvents[pri]); } } } time(&lastRefresh); pthread_t thread; retVal = pthread_create(&thread, 0, watchdogThread,0); if (retVal) { syslog(LOG_ERR, "LOSd: create watchdog thread returned %d\n", retVal); } do { if(verbosity) printf("Initializing LOSd\n"); int lastSendData=sendData; retVal=readConfig(); if(lastSendData!=sendData) { break; //Lets restart LOSd } if(firstTime) { sendWakeUpBuffer(); firstTime=0; } int hkCount=0; currentState=PROG_STATE_RUN; while(currentState==PROG_STATE_RUN) { //This is just if LOSd has been turned off when we're out of range if(!sendData) { sleep(1); continue; } //Check to see if we need to refresh the links time(¤tTime); if(currentTime>lastRefresh+REFRESH_LINKS_EVERY) { refreshLinkDirs(); lastRefresh=currentTime; } //Work which priority we're doing currentPri=priorityOrder[orderIndex]; //Will actually change this to almost work in the future if(hkCount%5==0) fillBufferWithHk(); hkCount++; //Check the link dirs if(currentTime>lastUpdate+10 || totalEventLinks<1) { if(totalEventLinks<1) checkLinkDirs(1,0); else checkLinkDirs(0,1); //Maybe I don't need to do this every time lastUpdate=currentTime; } totalEventLinks=0; for(pri=0;pri<NUM_PRIORITIES;pri++) { numLinks[pri]=getNumLinks(wdEvents[pri]); totalEventLinks+=numLinks[pri]; } if(printToScreen && verbosity>1) { printf("Got %d links in %s\n",numLinks[currentPri], eventTelemLinkDirs[currentPri]); } // sillyEvNum[currentPri]=0; if(numLinks[currentPri]>0) { //Got an event tempString=getLastLink(wdEvents[currentPri]); sprintf(currentHeader,"%s/%s",eventTelemLinkDirs[currentPri], tempString); if(printToScreen && verbosity) printf("Starting %s\n",currentHeader); readAndSendEventRamdisk(currentHeader); //Also deletes numLinks[currentPri]--; totalEventLinks--; } //Again I need to improve the bandwidth sharing between data and hk fillBufferWithHk(); // if(totalEventLinks<1) usleep(100); // printf("totalEventLinks %d\n",totalEventLinks); orderIndex++; if(orderIndex>=numOrders) orderIndex=0; } } while(currentState==PROG_STATE_INIT); unlink(LOSD_PID_FILE); syslog(LOG_INFO,"LOSd terminating"); // fprintf(stderr, "Bye bye\n"); return 0; }