public void CanCreateProjectAndGetDeviceVersion() { using (var dbFactory = new TestDbConnectionFactory()) using (var conn = dbFactory.Database()) { var project = new Project { Name = "Test" }; var device = new Device { IpAddress = "192.168.1.1", Name = "MyTestDevice" }; project = ProjectActions.CreateProject(project).Function(conn); var projectDevice = DeviceActions.AddDeviceToProject(project.Id, device).Function(conn); var projectDeviceVersion = ProjectDeviceActions.GetLatestProjectDeviceVersion(projectDevice.Id).Function(conn); projectDeviceVersion = ProjectDeviceActions.SetLatestProjectDeviceVersion(new ProjectDeviceVersion { ProjectDeviceId = projectDevice.Id, HorizontalPercentage = 100, VerticalPercentage = 100, NumberOfHorizontalPixels = 50, NumberOfVerticalPixels = 50, StartAtHorizontalPercentage = 0, StartAtVerticalPercentage = 0 }).Function(conn); projectDeviceVersion = ProjectDeviceActions.GetLatestProjectDeviceVersion(projectDevice.Id).Function(conn); Assert.NotNull(projectDeviceVersion); } }
public void CanSetProjectDeviceMappingsTwice() { using (var dbFactory = new TestDbConnectionFactory()) using (var conn = dbFactory.Database()) { var project = new Project { Name = "Test" }; var device = new Device { IpAddress = "192.168.1.1", Name = "MyTestDevice" }; project = ProjectActions.CreateProject(project).Function(conn); var projectDevice = DeviceActions.AddDeviceToProject(project.Id, device).Function(conn); var projectDeviceVersion = ProjectDeviceActions.SetLatestProjectDeviceVersion(new ProjectDeviceVersion { ProjectDeviceId = projectDevice.Id, HorizontalPercentage = 100, VerticalPercentage = 100, NumberOfHorizontalPixels = 50, NumberOfVerticalPixels = 50, StartAtHorizontalPercentage = 0, StartAtVerticalPercentage = 0 }).Function(conn); var firstMappings = new List <ProjectDeviceVersionMapping> { new ProjectDeviceVersionMapping { HorizontalPosition = 1, VerticalPosition = 1, MappingOrder = 1 } }; var secondMappings = new List <ProjectDeviceVersionMapping> { new ProjectDeviceVersionMapping { HorizontalPosition = 1, VerticalPosition = 1, MappingOrder = 1, }, new ProjectDeviceVersionMapping { HorizontalPosition = 2, VerticalPosition = 1, MappingOrder = 2 } }; ProjectDeviceActions.SetProjectDeviceMappings(projectDeviceVersion.Id, firstMappings).Function(conn); ProjectDeviceActions.SetProjectDeviceMappings(projectDeviceVersion.Id, secondMappings).Function(conn); var result = ProjectDeviceActions.GetProjectDeviceMappings(projectDeviceVersion.Id).Function(conn); Assert.Equal(2, result.Count()); } }
public void BypassDevice(int deviceId, int projectId, bool bypass) { var device = dispatcher.Dispatch(DeviceActions.GetDevice(deviceId)); Guard.This(device).AgainstDefaultValue(string.Format("Cannot find device with device id '{0}'", deviceId)); var projectDevice = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDevice(deviceId, projectId)); Guard.This(projectDevice).AgainstDefaultValue(string.Format("Cannot find project device with device id '{0}' and project id '{1}'", deviceId, projectId)); dispatcher.Dispatch(ProjectDeviceActions.BypassDevice(projectDevice.Id, bypass)); }
public GlobalJsonResult <ProjectVideo> AddMostRecentVideoUploadToProject(int projectId, int videoReferenceId) { var result = dispatcher.Dispatch(VideoActions.SetVideoForProject(projectId, videoReferenceId)); // When a video changes, create new version of project devices var projectDevices = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDevices(projectId)); foreach (var projectDevice in projectDevices) { var latestProjectDeviceVersion = dispatcher.Dispatch(ProjectDeviceActions.GetLatestProjectDeviceVersion(projectDevice.Id)); dispatcher.Dispatch(ProjectDeviceActions.SetLatestProjectDeviceVersion(latestProjectDeviceVersion)); } return(GlobalJsonResult <ProjectVideo> .Success(System.Net.HttpStatusCode.Created, result)); }
public void CanUndoProjectDeviceVersion() { using (var dbFactory = new TestDbConnectionFactory()) using (var conn = dbFactory.Database()) { var project = new Project { Name = "Test" }; var device = new Device { IpAddress = "192.168.1.1", Name = "MyTestDevice" }; project = ProjectActions.CreateProject(project).Function(conn); var projectDevice = DeviceActions.AddDeviceToProject(project.Id, device).Function(conn); var projectDeviceVersion = ProjectDeviceActions.SetLatestProjectDeviceVersion(new ProjectDeviceVersion { ProjectDeviceId = projectDevice.Id, HorizontalPercentage = 100, VerticalPercentage = 100, NumberOfHorizontalPixels = 50, NumberOfVerticalPixels = 50, StartAtHorizontalPercentage = 0, StartAtVerticalPercentage = 0 }).Function(conn); var updatedProjectDeviceVersion = ProjectDeviceActions.SetLatestProjectDeviceVersion(new ProjectDeviceVersion { ProjectDeviceId = projectDevice.Id, HorizontalPercentage = 99, VerticalPercentage = 99, NumberOfHorizontalPixels = 30, NumberOfVerticalPixels = 30, StartAtHorizontalPercentage = 1, StartAtVerticalPercentage = 1 }).Function(conn); var undoneProjectDeviceVersion = ProjectDeviceActions.UndoLatestProjectDeviceVersion(projectDevice.Id).Function(conn); var undoEqualsOriginalProjectDeviceVersion = projectDeviceVersion.PropertiesAreEqual(undoneProjectDeviceVersion); Assert.True(undoEqualsOriginalProjectDeviceVersion); } }
private void ConsumeJobs(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { var job = jobQueue.Take(); while (true) { var retryPeriodInMilliseconds = 5000; try { dispatcher.Dispatch(BackgroundJobActions.MarkAsProcessing(job.Id)); // Check if the job is now obsolete (because a newer version of the project device exists) var jobProjectDeviceVersion = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDeviceVersion(job.ProjectDeviceVersionId)); var projectDeviceVersions = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDeviceVersionsForProjectDevice(jobProjectDeviceVersion.ProjectDeviceId)); if (projectDeviceVersions.Select(pdv => pdv.Version).Max() > jobProjectDeviceVersion.Version) { dispatcher.Dispatch(BackgroundJobActions.MarkAsCancelled(job.Id, "A newer version of the project device now exists")); break; } piSyncService.ProcessProjectDeviceVersion(job); dispatcher.Dispatch(BackgroundJobActions.MarkAsComplete(job.Id)); break; } catch (Exception ex) { dispatcher.Dispatch(BackgroundJobActions.MarkAsErrored(job.Id, ex.Message, ex.StackTrace)); if (cancellationToken.IsCancellationRequested) { break; } cancellationToken.WaitHandle.WaitOne(retryPeriodInMilliseconds); } } } }
public byte[] ProcessBitmap(Bitmap bitmap, ProjectDeviceVersion projectDeviceVersion) { Guard.This(bitmap).AgainstDefaultValue("Bitmap cannot be null"); var mappings = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDeviceMappings(projectDeviceVersion.Id)); var data = new List <byte> { 0, 0, 0, 0 }; var xPercentagePixelGap = (double)(projectDeviceVersion.HorizontalPercentage) / (double)(projectDeviceVersion.NumberOfHorizontalPixels - 1); var yPercentagePixelGap = (double)(projectDeviceVersion.VerticalPercentage) / (double)(projectDeviceVersion.NumberOfVerticalPixels - 1); foreach (var mapping in mappings.OrderBy(m => m.MappingOrder)) { var xPercent = projectDeviceVersion.StartAtHorizontalPercentage + (mapping.HorizontalPosition - 1) * xPercentagePixelGap; var yPercent = projectDeviceVersion.StartAtVerticalPercentage + (mapping.VerticalPosition - 1) * yPercentagePixelGap; var x = (int)Math.Round(xPercent * bitmap.Width / 100, 0); var y = (int)Math.Round(yPercent * bitmap.Height / 100, 0); x = x >= bitmap.Width ? bitmap.Width - 1 : x; y = y >= bitmap.Height ? bitmap.Height - 1 : y; try { var pixelColor = bitmap.GetPixel(x, y); data.Add(pixelColor.R); data.Add(pixelColor.G); data.Add(pixelColor.B); } catch { throw; } } return(data.ToArray()); }
public ProjectDevicePlaybackStatus GetProjectDevicePlaybackStatus(int deviceId, int projectId) { var device = dispatcher.Dispatch(DeviceActions.GetDevice(deviceId)); Guard.This(device).AgainstDefaultValue(string.Format("Cannot find device with device id '{0}'", deviceId)); var projectDevice = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDevice(deviceId, projectId)); Guard.This(projectDevice).AgainstDefaultValue(string.Format("Cannot find project device with device id '{0}' and project id '{1}'", deviceId, projectId)); if (projectDevice.IsBypassed) { return(ProjectDevicePlaybackStatus.Bypassed); } var deviceClient = clientFactory.ForDevice(device); try { deviceClient.LoadVideo(projectDevice.Id); if (!devicePlaybacks.Any(dp => dp.Client.BaseAddress == deviceClient.BaseAddress)) { devicePlaybacks.Add(new DevicePlayback(projectDevice.Id, deviceClient)); } return(ProjectDevicePlaybackStatus.Ready); } catch (PiApiClientCommunicationException) { return(ProjectDevicePlaybackStatus.NotOnline); } catch (PiApiClientRequestException) { return(ProjectDevicePlaybackStatus.NotReady); } }
public VideoMetadata StartReadingVideo(int projectId, int projectDeviceId) { var project = dispatcher.Dispatch(ProjectActions.GetProject(projectId)); Guard.This(project).AgainstDefaultValue(string.Format("Could not find project with project id '{0}'", projectId)); var video = dispatcher.Dispatch(VideoActions.GetVideoForProject(projectId)); Guard.This(video).AgainstDefaultValue(string.Format("Could not find video for project '{0}' (id '{1}')", project.Name, project.Id)); var projectDeviceVersion = dispatcher.Dispatch(ProjectDeviceActions.GetLatestProjectDeviceVersion(projectDeviceId)); Guard.This(projectDeviceVersion).AgainstDefaultValue(string.Format("Could not get latest project device version for project '{0}' (id '{1}')", project.Name, project.Id)); reader = videoFileReader(); reader.Open(video.FilePath); framesRead = 0; framesToRead = reader.FrameCount; this.videoReference = video; this.projectDeviceVersion = projectDeviceVersion; return(new VideoMetadata(reader.FrameCount, reader.FrameRate)); }
public void ProcessProjectDeviceVersion(BackgroundJob job) { var projectDeviceVersion = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDeviceVersion(job.ProjectDeviceVersionId)); Guard.This(projectDeviceVersion).AgainstDefaultValue(string.Format("Could not find project device version '{0}'", job.ProjectDeviceVersionId)); var device = dispatcher.Dispatch(DeviceActions.GetProjectDevice(projectDeviceVersion.ProjectDeviceId)); Guard.This(device).AgainstDefaultValue(string.Format("Could not find project device with project device Id '{0}'", projectDeviceVersion.ProjectDeviceId)); Guard.This(device).WithRule(d => deviceStatusService.IsOnline(device), string.Format("Device {0} (with IP Address {1}) is not online", device.Name, device.IpAddress)); var project = dispatcher.Dispatch(ProjectActions.GetProjectFromProjectDevice(projectDeviceVersion.ProjectDeviceId)); Guard.This(project).AgainstDefaultValue(string.Format("Could not find project from project device with id '{0}'", projectDeviceVersion.ProjectDeviceId)); var video = dispatcher.Dispatch(VideoActions.GetVideoForProject(project.Id)); Guard.This(video).AgainstDefaultValue(string.Format("Could not find video for project '{0}'", project.Name)); using (var videoProcessor = videoProcessorInstantiator()) { var videoMetadata = videoProcessor.StartReadingVideo(project.Id, projectDeviceVersion.ProjectDeviceId); var client = piClientFactory.ForDevice(device); // Update video metadata (use project device id instead of video id with client (could have the same video in multiple configurations) var existingVideosOnPi = client.GetAllVideoMetadata(); var existingVideoOnPi = existingVideosOnPi.SingleOrDefault(v => v.Id == projectDeviceVersion.ProjectDeviceId); if (existingVideoOnPi == null) { client.CreateVideoMetadata(new VideoMetadataCreateRequest { Id = projectDeviceVersion.ProjectDeviceId, FileName = video.FilePath, FrameRate = videoMetadata.FrameRate }); } else { client.UpdateVideoMetadata(new VideoMetadataPutRequest { Id = projectDeviceVersion.ProjectDeviceId, FileName = video.FilePath, FrameRate = videoMetadata.FrameRate, }); } // Clear, then send frames to Pi client.ClearFrames(projectDeviceVersion.ProjectDeviceId); int framePosition = 1; while (true) { var read = videoProcessor.ReadNext1000Frames(); client.SendFrames(projectDeviceVersion.ProjectDeviceId, new AppendFramesRequest { AppendFrameRequests = read.Frames .Select(f => new AppendFrameRequest { BinaryData = f, Position = framePosition }) .ToArray() }); dispatcher.Dispatch(BackgroundJobActions.MarkPercentageCompletion(job.Id, read.PercentageComplete)); if (!read.MoreFrames) { break; } framePosition++; } } }
public GlobalJsonResult <ProjectDeviceVersion> SetLatestProjectDeviceVersion(int projectDeviceId, [FromBody] ProjectDeviceVersion projectDeviceVersion) { var result = dispatcher.Dispatch(ProjectDeviceActions.SetLatestProjectDeviceVersion(projectDeviceVersion)); return(GlobalJsonResult <ProjectDeviceVersion> .Success(System.Net.HttpStatusCode.Created, result)); }
public GlobalJsonResult <ProjectDeviceVersion> GetLatest(int projectDeviceId) { var result = dispatcher.Dispatch(ProjectDeviceActions.GetLatestProjectDeviceVersion(projectDeviceId)); return(GlobalJsonResult <ProjectDeviceVersion> .Success(System.Net.HttpStatusCode.OK, result)); }
public GlobalJsonResult <IEnumerable <ProjectDevice> > GetProjectDevices(int projectId) { var result = dispatcher.Dispatch(ProjectDeviceActions.GetProjectDevices(projectId)); return(GlobalJsonResult <IEnumerable <ProjectDevice> > .Success(System.Net.HttpStatusCode.OK, result)); }
public GlobalJsonResult <ProjectDeviceVersion> SetProjectDeviceMappings(int projectDeviceVersionId, IEnumerable <ProjectDeviceVersionMapping> mappings) { var result = dispatcher.Dispatch(ProjectDeviceActions.SetProjectDeviceMappings(projectDeviceVersionId, mappings)); return(GlobalJsonResult <ProjectDeviceVersion> .Success(System.Net.HttpStatusCode.Created, result)); }