//****************************************************************************** // MARTe Library // $Log: driver_test.cpp,v $ // Revision 1.17 2009/03/31 08:11:37 aneto // Support for multiple input // // Revision 1.16 2009/01/26 09:20:38 aneto // linux support // // Revision 1.15 2008/08/01 16:29:13 rvitelli // trigger // // Revision 1.14 2008/08/01 14:09:26 rvitelli // First working version // // Revision 1.13 2008/06/19 10:15:46 rvitelli // Lowered sleep between GetData calls to allow execution of LongSleeps. Probably a problem due to execution of mod_writer and driver_test on the same processor. // // Revision 1.12 2008/06/19 07:22:49 rvitelli // Added std_dev // // Revision 1.11 2008/06/18 17:19:04 rvitelli // Optimization. // // Revision 1.10 2008/06/18 17:06:36 rvitelli // Added variance statistic. // // Revision 1.9 2008/06/18 16:49:21 rvitelli // Minor bug. //****************************************************************************** #include "Console.h" #include "Sleep.h" #include "ATCAadcDrv.h" #include "Threads.h" #include "LoggerService.h" #include "File.h" #include "SXMemory.h" #include "ConfigurationDataBase.h" #include "GCReferenceContainer.h" #include "GlobalObjectDataBase.h" #include "MenuContainer.h" #include "ProcessorType.h" const char *cdbMap= "+ATCA_DRIVER={\n" " Class = ATCAadcDrv\n" " Title = \"ATCA Driver test\" \n" " SoftTrigger=1\n" " NumberOfOutputs=8\n" " NumberOfInputs=64\n" " ExtTriggerAndClock=1\n" "}\n" "+MENUS={" " Class = MenuContainer\n" " Title = \"ATCA ADC Driver Test\" \n" " +START_ACK_MENU={\n" " Class = MenuEntry\n" " Title = \"Start Acquisition\"\n" " }\n" " +STOP_ACK_MENU={\n" " Class = MenuEntry\n" " Title = \"Stop Acquisition\"\n" " }\n" " +SAVE_DATA_MENU={\n" " Class = MenuEntry\n" " Title = \"Save acquired data\"\n" " }\n" " +PRINT_DATA_MENU={\n" " Class = MenuEntry\n" " Title = \"Print last buffer\"\n" " }\n" "}"; volatile int keepAlive = 0; int64 max_timer = 0; float mean_exec_time = 0; float meansquare_exec_time = 0; float variance_exec_time = 0; const int32 BUFFER_BOARD_TRF_SIZE = 33 + 2 * HEADER_LENGTH; const int32 MAX_SAMPLES_TO_SAVE = 100; int32 buffer[70]; uint32 outputBuffer[3]; uint32 dataBrd1[BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE]; int32 dataBrd2[BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE]; int32 printLastBuffer = 0; GCRTemplate driver; void __thread_decl acquisitionThread(void *ptr){ int k = 0; int64 timer = 0; int64 timer_after = 0; int ret = 0; max_timer = 0; mean_exec_time = 0; meansquare_exec_time = 0; variance_exec_time = 0; driver->EnableAcquisition(); int triggerReceived = 0; memset(buffer, 0, BUFFER_BOARD_TRF_SIZE * sizeof(int32)); memset(dataBrd1, 0, BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE * sizeof(int32)); memset(dataBrd2, 0, BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE * sizeof(int32)); //Console con; printf("Starting\n"); while (keepAlive != 0){ timer = HRT::HRTCounter(); SleepSec(10E-6); ret = driver->GetData(0, buffer); printf("Time: [%d], k = %d, BUFFER_BOARD_TRF_SIZE = %d!\n", dataBrd1[0], k, BUFFER_BOARD_TRF_SIZE); printf("Time End = %d, Status = %d\n", dataBrd1[BUFFER_BOARD_TRF_SIZE - 1], dataBrd1[BUFFER_BOARD_TRF_SIZE - 2]); if(dataBrd1[0] == 0 && k > 5){ triggerReceived = 1; k = 0; max_timer = 0; mean_exec_time = 0; meansquare_exec_time = 0; variance_exec_time = 0; printf("Trigger received!\n"); } if(printLastBuffer > 0){ printf("H[%d] = %d F[%d] = %d\n", k, 0, k, dataBrd1[BUFFER_BOARD_TRF_SIZE - 1]); printLastBuffer = 0; } if(triggerReceived == 1 && k < MAX_SAMPLES_TO_SAVE){ for(int j=0; jWriteData(0, (int32 *)outputBuffer); timer_after = HRT::HRTCounter(); if ( (timer_after - timer) > max_timer) { max_timer = timer_after - timer; } mean_exec_time += (float)(timer_after - timer); meansquare_exec_time += (float)((timer_after - timer)*(timer_after - timer)); k++; } driver->DisableAcquisition(); mean_exec_time /= k; variance_exec_time = ( (meansquare_exec_time - max_timer*max_timer)/k - mean_exec_time*mean_exec_time); keepAlive = 1; } bool StartAcquisition(StreamInterface &in,StreamInterface &out,void *userData){ if(keepAlive != 0){ out.Printf("Acquisition already started\n"); return False; } keepAlive = 1; ProcessorType runCore(0x8); Threads::BeginThread(acquisitionThread, NULL, THREADS_DEFAULT_STACKSIZE, NULL, XH_NotHandled, runCore); return True; } bool StopAcquisition(StreamInterface &in,StreamInterface &out,void *userData){ if(keepAlive == 0){ out.Printf("Acquisition already stopped\n"); return False; } out.Printf("Stopping acquisition\n"); keepAlive = 0; while(keepAlive != 1){ SleepSec(1.0); } keepAlive = 0; out.Printf("Acquisition stopped\n"); out.Printf("\nmax_timer = %f\n", max_timer*HRT::HRTPeriod()*1000000); out.Printf("mean_exec_time = %f\n", mean_exec_time*HRT::HRTPeriod()*1000000); out.Printf("dev_std_exec_time = %f\n", sqrt(variance_exec_time)*HRT::HRTPeriod()*1000000); out.Printf("max_error = %f\n", (max_timer-mean_exec_time)*HRT::HRTPeriod()*1000000); } bool SaveData(StreamInterface &in,StreamInterface &out,void *userData){ out.Printf("Saving Data\n"); File outputFile; FString dataDump; FString filename; FString dataDump2; dataDump.SetSize(BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE); dataDump2.SetSize(BUFFER_BOARD_TRF_SIZE * MAX_SAMPLES_TO_SAVE); out.Printf("Printing in FString\n"); for(int k=0; kReadFromStream(config,NULL)){ CStaticAssertErrorCondition(ParametersError,"Init: cdb.ReadFromStream failed"); return -1; } GCRTemplate godb = GetGlobalObjectDataBase(); godb->ObjectLoadSetup(cdb,NULL); GCRTemplate mc; mc = godb->Find("MENUS"); if (!mc.IsValid()){ CStaticAssertErrorCondition(FatalError,"cannot find MENUS MenuContainer object\n"); return -2; } driver = godb->Find("ATCA_DRIVER"); if (!driver.IsValid()){ CStaticAssertErrorCondition(FatalError,"cannot find ATCA_DRIVER MenuContainer object\n"); return -2; } Console con(PerformCharacterInput); con.SetPaging(True); mc->SetupItem("START_ACK_MENU", StartAcquisition, NULL, NULL, NULL); mc->SetupItem("STOP_ACK_MENU", StopAcquisition, NULL, NULL, NULL); mc->SetupItem("SAVE_DATA_MENU", SaveData, NULL, NULL, NULL); mc->SetupItem("PRINT_LAST_BUFFER", PrintLastBuffer, NULL, NULL, NULL); mc->TextMenu(con,con); // LSStopService(); return 0; }