using System;
using System.Windows.Input;
using Fitness.Models;
+using Fitness.Services;
using Tizen.NUI.Binding;
namespace Fitness.ViewModels
public class ExercisingViewModel : ChangeWorkoutViewModel
{
private WorkoutState state;
+ private SquatService squatService;
public ExercisingViewModel(WorkoutViewModel workoutViewModel)
{
EndWorkout = new Command(ExecuteEndWorkout);
State = WorkoutState.Playing;
CurrentWorkout = workoutViewModel;
+ squatService = new SquatService()
+ {
+ HoldTimeThreshold = 1200,
+ };
}
/// <summary>
public string PauseResumeLabel { get; private set; } = "Pause";
+ /// <summary>
+ /// Gets or sets the <see cref="SquatService"/> property.
+ /// </summary>
+ public SquatService SquatService
+ {
+ get => squatService;
+ set
+ {
+ if (value != squatService)
+ {
+ squatService = value;
+ RaisePropertyChanged();
+ }
+ }
+ }
+
protected override void GoPrevious()
{
if (State == WorkoutState.Playing)
using System.Threading.Tasks;
using Fitness.Models;
using Fitness.ViewModels;
+using Tizen.Multimedia;
using Tizen.NUI;
using Tizen.NUI.BaseComponents;
using Tizen.NUI.Binding;
Preview: new Coordinates() // fixed for now
{
Position = new Position(0, 0),
- Size = new Size(1920, 1080),
+ Size = new Tizen.NUI.Size(1920, 1080),
},
Camera: new Coordinates() // fixed for now
{
Position = new Position(1356, 144),
- Size = new Size(500, 292),
+ Size = new Tizen.NUI.Size(500, 292),
});
/// <summary>
{
if (cameraView.PreviewState == Tizen.Multimedia.CameraState.Preview)
{
+ cameraView.Preview -= DetectPreview;
cameraView.StopPreview();
}
}
if (cameraView.PreviewState == Tizen.Multimedia.CameraState.Created || cameraView.PreviewState == Tizen.Multimedia.CameraState.Captured)
{
cameraView.StartPreview();
+ cameraView.Preview += DetectPreview;
}
}
InitializeComponent();
PlayingView.PreviewStub.Relayout += OnPlayingViewRelayout;
+ cameraView.Preview += DetectPreview;
}
private async Task TriggerStates(bool isPlaying)
if (isPlaying)
{
(Task scalePreview, Task movePreview) = Animate(Preview, pause.Preview, playing.Preview, source.Token);
- (Task scaleCamera, Task moveCamera) = Animate(cameraView, pause.Camera, playing.Camera, source.Token);
+ (Task scaleCamera, Task moveCamera) = Animate(cameraOverlayView, pause.Camera, playing.Camera, source.Token);
await Task.WhenAll(scalePreview, movePreview, scaleCamera, moveCamera);
PauseView.Hide();
PauseView.Show();
(Task scalePreview, Task movePreview) = Animate(Preview, playing.Preview, pause.Preview, source.Token);
- (Task scaleCamera, Task moveCamera) = Animate(cameraView, playing.Camera, pause.Camera, source.Token);
+ (Task scaleCamera, Task moveCamera) = Animate(cameraOverlayView, playing.Camera, pause.Camera, source.Token);
await Task.WhenAll(scalePreview, movePreview, scaleCamera, moveCamera);
}
private void SetPositionAndSize(bool isPlaying)
{
- cameraView.Size = playing.Camera.Size;
+ cameraOverlayView.Size = playing.Camera.Size;
Preview.Size = playing.Preview.Size;
if (isPlaying)
{
- cameraView.Position = playing.Camera.Position;
- cameraView.ScaleX = 1;
- cameraView.ScaleY = 1;
+ cameraOverlayView.Position = playing.Camera.Position;
+ cameraOverlayView.ScaleX = 1;
+ cameraOverlayView.ScaleY = 1;
Preview.Position = playing.Preview.Position;
Preview.ScaleX = 1;
Preview.ScaleY = 1;
else
{
var cameraScale = pause.Camera.Size.Width / playing.Camera.Size.Width;
- cameraView.Position = pause.Camera.Position;
- cameraView.PivotPoint = new Position(0, 0);
- cameraView.ScaleX = cameraScale;
- cameraView.ScaleY = cameraScale;
+ cameraOverlayView.Position = pause.Camera.Position;
+ cameraOverlayView.PivotPoint = new Position(0, 0);
+ cameraOverlayView.ScaleX = cameraScale;
+ cameraOverlayView.ScaleY = cameraScale;
var previewScale = pause.Preview.Size.Width / playing.Preview.Size.Width;
Preview.Position = pause.Preview.Position;
}
}
+ private void DetectPreview(object sender, PreviewEventArgs e)
+ {
+ if (BindingContext is ViewModels.ExercisingViewModel viewModel)
+ {
+ _ = viewModel.SquatService.DetectSquat(e.Preview);
+ }
+ }
+
private struct Coordinates
{
public Position Position;
- public Size Size;
+ public Tizen.NUI.Size Size;
public float Scale;
}
}
</View.Layout>
<TextLabel BindingContext="{Binding Source={x:Reference Root}, Path=BindingContext}"
- Text="{Binding Hold, StringFormat='{0:ss}'}"
+ Text="{Binding SquatService.Hold}"
TextColor="#000C2B"
PixelSize="40"
HorizontalAlignment="Center"
Size="{views:SizeInUnits Width=36, Height=16}"/>
<TextLabel BindingContext="{Binding Source={x:Reference Root}, Path=BindingContext}"
- Text="{Binding Repetitions}"
+ Text="{Binding SquatService.Count}"
TextColor="#000C2B"
PixelSize="40"
HorizontalAlignment="Center"
Size="{views:SizeInUnits Width=36, Height=16}"/>
<TextLabel BindingContext="{Binding Source={x:Reference Root}, Path=BindingContext}"
- Text="{Binding Score}"
+ Text="{Binding SquatService.Score}"
TextColor="#000C2B"
PixelSize="40"
HorizontalAlignment="Center"