Repository navigation
Expand file tree
/
Copy pathSensorService.cs
More file actions
78 lines (68 loc) · 2.88 KB
/
Copy pathSensorService.cs
File metadata and controls
78 lines (68 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using System.Windows.Threading;
using Windows.Devices.Sensors;
namespace FoldVision
{
/// <summary>
/// Gestiona la detección del ángulo de la tapa usando el sensor Inclinómetro.
/// (Una fusión de giroscopios y acelerómetros físicos que Windows usa para calcular
/// el ángulo exacto de la bisagra en grados).
/// Si el dispositivo no tiene este hardware físico, la app informará que no es compatible.
///
/// Expone FoldFactorChanged con valores normalizados 0.0 (abierto) a 1.0 (cerrado).
/// </summary>
public class SensorService
{
public static SensorService Instance { get; } = new SensorService();
private Inclinometer? _inclinometer;
/// <summary>Factor de pliegue normalizado: 0.0 = tapa abierta, 1.0 = tapa cerrada.</summary>
public event EventHandler<float>? FoldFactorChanged;
/// <summary>Ángulo crudo en grados de la bisagra, útil para OSD/Debug.</summary>
public event EventHandler<float>? AngleChanged;
public bool Start()
{
try
{
_inclinometer = Inclinometer.GetDefault();
if (_inclinometer != null)
{
// Reducir la latencia al mínimo que soporte el hardware (ej. 10ms o 16ms en lugar de 100ms)
_inclinometer.ReportInterval = Math.Max(_inclinometer.MinimumReportInterval, 10);
_inclinometer.ReadingChanged += Inclinometer_ReadingChanged;
return true;
}
}
catch { }
return false;
}
private void Inclinometer_ReadingChanged(Inclinometer sender,
InclinometerReadingChangedEventArgs args)
{
// Pitch ≈ ángulo de la bisagra. Varía entre dispositivos; usamos el rango 130°→10°.
float pitch = args.Reading.PitchDegrees;
float factor = CalculateFoldFactor(pitch);
FoldFactorChanged?.Invoke(this, factor);
AngleChanged?.Invoke(this, pitch);
}
/// <summary>
/// Permite simular el ángulo manualmente desde la ventana de depuración.
/// </summary>
public void SetDebugAngle(float angleDegrees)
{
FoldFactorChanged?.Invoke(this, CalculateFoldFactor(angleDegrees));
AngleChanged?.Invoke(this, angleDegrees);
}
private static float CalculateFoldFactor(float angle)
{
float start = AppSettings.AngleStart;
float max = AppSettings.AngleMax;
if (angle <= start) return 0f;
return Math.Clamp((angle - start) / (max - start), 0f, 1f);
}
public void Stop()
{
if (_inclinometer != null)
_inclinometer.ReadingChanged -= Inclinometer_ReadingChanged;
}
}
}