// get a random file in the directory // automatically wrap if we've hit the end void LLDir_Win32::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { S32 num_files; S32 which_file; HANDLE random_search_h; fname = ""; llutf16string pathname = utf8str_to_utf16str(dirname); pathname += utf8str_to_utf16str(mask); WIN32_FIND_DATA FileData; fname[0] = NULL; num_files = countFilesInDir(dirname,mask); if (!num_files) { return; } which_file = ll_rand(num_files); // llinfos << "Random select mp3 #" << which_file << llendl; // which_file now indicates the (zero-based) index to which file to play if ((random_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) { while (which_file--) { if (!FindNextFile(random_search_h, &FileData)) { return; } } FindClose(random_search_h); fname = utf16str_to_utf8str(llutf16string(FileData.cFileName)); } }
// get a random file in the directory // automatically wrap if we've hit the end void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { S32 num_files; S32 which_file; DIR *dirp; dirent *entryp = NULL; fname = ""; num_files = countFilesInDir(dirname,mask); if (!num_files) { return; } which_file = ll_rand(num_files); // llinfos << "Random select file #" << which_file << llendl; // which_file now indicates the (zero-based) index to which file to play if (!((dirp = opendir(dirname.c_str())))) { while (which_file--) { if (!((entryp = readdir(dirp)))) { return; } } if ((!which_file) && entryp) { fname = entryp->d_name; } closedir(dirp); } }
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 startPlayback() { int priority; int eventCount=0; PlaybackRequest_t pReq; char purgeFile[FILENAME_MAX]; char evNumAsString[180]; struct dirent **linkList; syslog(LOG_INFO,"Playbackd Starting Playback"); printf("Playbackd Starting Playback\n"); while(currentState==PROG_STATE_RUN) { int numPri0Links=countFilesInDir(eventTelemLinkDirs[0]); // printf("Here\n"); if(numPri0Links<100) { // printf("Here\n"); for(priority=startPriority;priority<=stopPriority;priority++) { int numLinks=getListofPurgeFiles(priorityPurgeDirs[priority], &linkList); int i; // printf("Here: %d -- %s\n",numLinks,priorityPurgeDirs[priority]); for(i=0;i<numLinks;i++) { //Loop over files; sprintf(purgeFile,"%s/%s",priorityPurgeDirs[priority],linkList[i]->d_name); // printf("%s\n",purgeFile); printf("Got purgeFile: %s\n",purgeFile); gzFile Purge=gzopen(purgeFile,"r"); int sentFiles=0; if(Purge) { while(1) { char *test=gzgets(Purge,evNumAsString,179); // printf("evNumAsString: %s\n",evNumAsString); if(test==Z_NULL) break; // printf("%d %d\n",test,evNumAsString); pReq.eventNumber=strtoul(evNumAsString,NULL,10); if(pReq.eventNumber>=startEvent) { printf("Got string: %s num: %u\n", evNumAsString,pReq.eventNumber); pReq.pri=0; // printf("Freda\n"); sendEvent(&pReq); usleep(1000*msSleepPeriod); eventCount++; // printf("Fred: eventCount: %d\n",eventCount); if(eventCount+numPri0Links>100) { // printf("sleep\n");sleep(60); numPri0Links=countFilesInDir(eventTelemLinkDirs[0]); eventCount=0; } sentFiles=1; } // printf("Fredrick\n"); } // printf("Here\n"); gzclose(Purge); if(sentFiles) removeFile(purgeFile); } else { unlink(purgeFile); } if(eventCount+numPri0Links>100) break; } for(i=0;i<numLinks;i++) { free(linkList[i]); } free(linkList); } printf("sleep\n");sleep(1); } printf("sleep\n");sleep(1); eventCount=0; } }