/** Waits for alarm to start playing sounds @return True or False indicating if the sounds started playing at the correct time. */ TBool CTestSystemChangeFor::WaitAndCheckSoundPlayStartL() { TBuf<MAX_TEXT_MESSAGE> messageLog(0); TRequestStatus status; TAlarmId returnedAlarmId; FOREVER { iAlarmServerSession.NotifyChange(status,returnedAlarmId); User::WaitForRequest(status); if (status.Int() == EAlarmChangeEventSoundPlaying) { iNow.UniversalTime(); INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); TDateTime aStartTime(iNow.DateTime()); messageLog.Format(KDateTime, aStartTime.Year(),TInt(aStartTime.Month()),aStartTime.Day(), aStartTime.Hour(),aStartTime.Minute(),aStartTime.Second(),aStartTime.MicroSecond()); FormatLogMessage(_L("Sound started (UTC time) to play at:- "), messageLog); // no checking done as sounds are played straight away after system time change INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); INFO_PRINTF1(_L("Sound Started At Expected Time")); iSoundStop = CalculateSoundStopL(iNow); return ETrue; } } }
/** Waits for alarm to start playing sounds @return True or False indicating if the sounds started playing at the correct time. */ TBool CTestSystemChangeUntil::WaitAndCheckSoundPlayStartL(TBool aUntilExpired) { TBuf<MAX_TEXT_MESSAGE> messageLog(0); TRequestStatus status; TAlarmId returnedAlarmId; FOREVER { iAlarmServerSession.NotifyChange(status,returnedAlarmId); User::WaitForRequest(status); if (status.Int() == EAlarmChangeEventSoundPlaying) { iNow.UniversalTime(); INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); TDateTime aStartTime(iNow.DateTime()); messageLog.Format(KDateTime, aStartTime.Year(),TInt(aStartTime.Month()),aStartTime.Day(), aStartTime.Hour(),aStartTime.Minute(),aStartTime.Second(),aStartTime.MicroSecond()); FormatLogMessage(_L("Sound started (UTC time) to play at:- "), messageLog); TTimeIntervalMinutes minutesDifference; User::LeaveIfError(iNow.MinutesFrom(iSilentUntil, minutesDifference)); TInt difference = minutesDifference.Int(); if (aUntilExpired) { INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); INFO_PRINTF1(_L("Sound Started At Expected Time")); iSoundStop = CalculateSoundStopL(iNow); return ETrue; } else { if (iNewSysGreaterExp) { INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); INFO_PRINTF1(_L("Sound Started At Expected Time")); iSoundStop = CalculateSoundStopL(iNow); return ETrue; } else { if (difference == 0) { INFO_PRINTF3(KPlayStart,returnedAlarmId,iAlarmId); INFO_PRINTF1(_L("Sound Started At Expected Time")); iSoundStop = CalculateSoundStopL(iNow); return ETrue; } else { INFO_PRINTF1(KAlarmSoundStartError); return EFalse; } } } } } }
int main( int argc, char *argv[]) { const char *program = basename(argv[0]); int fps = DEFAULT_FPS; suseconds_t frameDuration = 1000000 / fps; bool isDaemon = false; uint32_t sourceDisplayNumber = DEFAULT_SOURCE_DISPLAY_NUMBER; uint32_t destDisplayNumber = DEFAULT_DESTINATION_DISPLAY_NUMBER; int32_t layerNumber = DEFAULT_LAYER_NUMBER; const char *pidfile = NULL; //--------------------------------------------------------------------- static const char *sopts = "d:f:hl:p:s:D"; static struct option lopts[] = { { "destination", required_argument, NULL, 'd' }, { "fps", required_argument, NULL, 'f' }, { "help", no_argument, NULL, 'h' }, { "layer", required_argument, NULL, 'l' }, { "pidfile", required_argument, NULL, 'p' }, { "source", required_argument, NULL, 's' }, { "daemon", no_argument, NULL, 'D' }, { NULL, no_argument, NULL, 0 } }; int opt = 0; while ((opt = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) { switch (opt) { case 'd': destDisplayNumber = atoi(optarg); break; case 'f': fps = atoi(optarg); if (fps > 0) { frameDuration = 1000000 / fps; } else { fps = 1000000 / frameDuration; } break; case 'h': printUsage(stdout, program); exit(EXIT_SUCCESS); break; case 'l': layerNumber = atoi(optarg); break; case 'p': pidfile = optarg; break; case 's': sourceDisplayNumber = atoi(optarg); break; case 'D': isDaemon = true; break; default: printUsage(stderr, program); exit(EXIT_FAILURE); break; } } //--------------------------------------------------------------------- struct pidfh *pfh = NULL; if (isDaemon) { if (pidfile != NULL) { pid_t otherpid; pfh = pidfile_open(pidfile, 0600, &otherpid); if (pfh == NULL) { fprintf(stderr, "%s is already running %jd\n", program, (intmax_t)otherpid); exit(EXIT_FAILURE); } } if (daemon(0, 0) == -1) { fprintf(stderr, "daemonize failed\n"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } if (pfh) { pidfile_write(pfh); } openlog(program, LOG_PID, LOG_USER); } //--------------------------------------------------------------------- if (signal(SIGINT, signalHandler) == SIG_ERR) { perrorLog(isDaemon, program, "installing SIGINT signal handler"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } //--------------------------------------------------------------------- if (signal(SIGTERM, signalHandler) == SIG_ERR) { perrorLog(isDaemon, program, "installing SIGTERM signal handler"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } //--------------------------------------------------------------------- bcm_host_init(); //--------------------------------------------------------------------- int result = 0; //--------------------------------------------------------------------- // Make sure the VC_DISPLAY variable isn't set. unsetenv("VC_DISPLAY"); //--------------------------------------------------------------------- DISPMANX_DISPLAY_HANDLE_T sourceDisplay = vc_dispmanx_display_open(sourceDisplayNumber); if (sourceDisplay == 0) { messageLog(isDaemon, program, LOG_ERR, "open source display failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } DISPMANX_MODEINFO_T sourceInfo; result = vc_dispmanx_display_get_info(sourceDisplay, &sourceInfo); if (result != 0) { messageLog(isDaemon, program, LOG_ERR, "getting source display dimensions failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } //--------------------------------------------------------------------- DISPMANX_DISPLAY_HANDLE_T destDisplay = vc_dispmanx_display_open(destDisplayNumber); if (destDisplay == 0) { messageLog(isDaemon, program, LOG_ERR, "open destination display failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } DISPMANX_MODEINFO_T destInfo; result = vc_dispmanx_display_get_info(destDisplay, &destInfo); if (result != 0) { messageLog(isDaemon, program, LOG_ERR, "getting destination display dimensions failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } //--------------------------------------------------------------------- messageLog(isDaemon, program, LOG_INFO, "copying from [%d] %dx%d to [%d] %dx%d", sourceDisplayNumber, sourceInfo.width, sourceInfo.height, destDisplayNumber, destInfo.width, destInfo.height); //--------------------------------------------------------------------- uint32_t image_ptr; DISPMANX_RESOURCE_HANDLE_T resource = vc_dispmanx_resource_create(VC_IMAGE_RGBA32, destInfo.width, destInfo.height, &image_ptr); //--------------------------------------------------------------------- VC_RECT_T sourceRect; vc_dispmanx_rect_set(&sourceRect, 0, 0, destInfo.width << 16, destInfo.height << 16); VC_RECT_T destRect; vc_dispmanx_rect_set(&destRect, 0, 0, 0, 0); //--------------------------------------------------------------------- VC_DISPMANX_ALPHA_T alpha = { DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS, 255, 0 }; DISPMANX_UPDATE_HANDLE_T update = vc_dispmanx_update_start(0); if (update == 0) { messageLog(isDaemon, program, LOG_ERR, "display update failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } DISPMANX_ELEMENT_HANDLE_T element; element = vc_dispmanx_element_add(update, destDisplay, layerNumber, &destRect, resource, &sourceRect, DISPMANX_PROTECTION_NONE, &alpha, NULL, DISPMANX_NO_ROTATE); if (element == 0) { messageLog(isDaemon, program, LOG_ERR, "failed to create DispmanX element"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } vc_dispmanx_update_submit_sync(update); //--------------------------------------------------------------------- struct timeval start_time; struct timeval end_time; struct timeval elapsed_time; //--------------------------------------------------------------------- while (run) { gettimeofday(&start_time, NULL); //----------------------------------------------------------------- result = vc_dispmanx_snapshot(sourceDisplay, resource, DISPMANX_NO_ROTATE); if (result != 0) { messageLog(isDaemon, program, LOG_ERR, "DispmanX snapshot failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } //----------------------------------------------------------------- update = vc_dispmanx_update_start(0); if (update == 0) { messageLog(isDaemon, program, LOG_ERR, "display update failed"); exitAndRemovePidFile(EXIT_FAILURE, pfh); } vc_dispmanx_element_change_source(update, element, resource); vc_dispmanx_update_submit_sync(update); //----------------------------------------------------------------- gettimeofday(&end_time, NULL); timersub(&end_time, &start_time, &elapsed_time); if (elapsed_time.tv_sec == 0) { if (elapsed_time.tv_usec < frameDuration) { usleep(frameDuration - elapsed_time.tv_usec); } } } //--------------------------------------------------------------------- update = vc_dispmanx_update_start(0); vc_dispmanx_element_remove(update, element); vc_dispmanx_update_submit_sync(update); vc_dispmanx_resource_delete(resource); vc_dispmanx_display_close(sourceDisplay); vc_dispmanx_display_close(destDisplay); //--------------------------------------------------------------------- messageLog(isDaemon, program, LOG_INFO, "exiting"); if (isDaemon) { closelog(); } if (pfh) { pidfile_remove(pfh); } //--------------------------------------------------------------------- return 0 ; }