1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Linq ;
4+ using System . Reactive . Linq ;
5+ using System . Threading . Tasks ;
6+ using SharpBrick . PoweredUp . Protocol ;
7+ using SharpBrick . PoweredUp . Utils ;
8+
9+ namespace SharpBrick . PoweredUp
10+ {
11+ public class TechnicDistanceSensor : Device , IPoweredUpDevice
12+ {
13+ protected SingleValueMode < short > _distlMode ;
14+ protected SingleValueMode < short > _distsMode ;
15+ protected SingleValueMode < short > _singlMode ;
16+ protected MultiValueMode < sbyte > _lightMode ;
17+
18+ public byte ModeIndexDistance { get ; protected set ; } = 0 ;
19+ public byte ModeIndexShortOnlyDistance { get ; protected set ; } = 1 ;
20+ public byte ModeIndexSingleMeasurement { get ; protected set ; } = 2 ;
21+ public byte ModeIndexLight { get ; protected set ; } = 5 ;
22+
23+ public short Distance => _distlMode . SI ;
24+ public IObservable < short > DistanceObservable => _distlMode . Observable . Select ( x => x . SI ) ;
25+ public short ShortOnlyDistance => _distsMode . SI ;
26+ public IObservable < short > DistsObservable => _distsMode . Observable . Select ( x => x . SI ) ;
27+ public short SingleDistanceMeasurementResult => _singlMode . SI ;
28+ public IObservable < short > SinglObservable => _singlMode . Observable . Select ( x => x . SI ) ;
29+
30+ public TechnicDistanceSensor ( )
31+ { }
32+ public TechnicDistanceSensor ( ILegoWirelessProtocol protocol , byte hubId , byte portId )
33+ : base ( protocol , hubId , portId )
34+ {
35+ _distlMode = SingleValueMode < short > ( ModeIndexDistance ) ;
36+ _distsMode = SingleValueMode < short > ( ModeIndexShortOnlyDistance ) ;
37+ _singlMode = SingleValueMode < short > ( ModeIndexSingleMeasurement ) ;
38+ _lightMode = MultiValueMode < sbyte > ( ModeIndexLight ) ;
39+
40+ ObserveForPropertyChanged ( _distlMode . Observable , nameof ( Distance ) ) ;
41+ ObserveForPropertyChanged ( _distsMode . Observable , nameof ( ShortOnlyDistance ) ) ;
42+ ObserveForPropertyChanged ( _singlMode . Observable , nameof ( SingleDistanceMeasurementResult ) ) ;
43+ }
44+
45+ public Task SetEyeLightAsync ( byte leftTop = 0x00 , byte rightTop = 0x00 , byte leftBottom = 0x00 , byte rightBottom = 0x00 )
46+ => _lightMode . WriteDirectModeDataAsync ( new byte [ ] { leftTop , rightTop , leftBottom , rightBottom } ) ;
47+
48+ public IEnumerable < byte [ ] > GetStaticPortInfoMessages ( Version softwareVersion , Version hardwareVersion , SystemType systemType )
49+ => ( ( softwareVersion , hardwareVersion , systemType ) switch
50+ {
51+ ( _, _, _) => @"
52+ 0B-00-43-00-01-03-09-9F-00-60-00
53+ 05-00-43-00-02
54+ 11-00-44-00-00-00-44-49-53-54-4C-00-00-00-00-00-00
55+ 0E-00-44-00-00-01-00-00-00-00-00-40-1C-45
56+ 0E-00-44-00-00-02-00-00-00-00-00-00-C8-42
57+ 0E-00-44-00-00-03-00-00-00-00-00-00-7A-43
58+ 0A-00-44-00-00-04-43-4D-00-00
59+ 08-00-44-00-00-05-91-00
60+ 0A-00-44-00-00-80-01-01-05-01
61+ 11-00-44-00-01-00-44-49-53-54-53-00-00-00-00-00-00
62+ 0E-00-44-00-01-01-00-00-00-00-00-00-A0-43
63+ 0E-00-44-00-01-02-00-00-00-00-00-00-C8-42
64+ 0E-00-44-00-01-03-00-00-00-00-00-00-00-42
65+ 0A-00-44-00-01-04-43-4D-00-00
66+ 08-00-44-00-01-05-F1-00
67+ 0A-00-44-00-01-80-01-01-04-01
68+ 11-00-44-00-02-00-53-49-4E-47-4C-00-00-00-00-00-00
69+ 0E-00-44-00-02-01-00-00-00-00-00-40-1C-45
70+ 0E-00-44-00-02-02-00-00-00-00-00-00-C8-42
71+ 0E-00-44-00-02-03-00-00-00-00-00-00-7A-43
72+ 0A-00-44-00-02-04-43-4D-00-00
73+ 08-00-44-00-02-05-90-00
74+ 0A-00-44-00-02-80-01-01-05-01
75+ 11-00-44-00-03-00-4C-49-53-54-4E-00-00-00-00-00-00
76+ 0E-00-44-00-03-01-00-00-00-00-00-00-80-3F
77+ 0E-00-44-00-03-02-00-00-00-00-00-00-C8-42
78+ 0E-00-44-00-03-03-00-00-00-00-00-00-80-3F
79+ 0A-00-44-00-03-04-53-54-00-00
80+ 08-00-44-00-03-05-10-00
81+ 0A-00-44-00-03-80-01-00-01-00
82+ 11-00-44-00-04-00-54-52-41-57-00-00-00-00-00-00-00
83+ 0E-00-44-00-04-01-00-00-00-00-00-C4-63-46
84+ 0E-00-44-00-04-02-00-00-00-00-00-00-C8-42
85+ 0E-00-44-00-04-03-00-00-00-00-00-C4-63-46
86+ 0A-00-44-00-04-04-75-53-00-00
87+ 08-00-44-00-04-05-90-00
88+ 0A-00-44-00-04-80-01-02-05-00
89+ 11-00-44-00-05-00-4C-49-47-48-54-00-00-00-00-00-00
90+ 0E-00-44-00-05-01-00-00-00-00-00-00-C8-42
91+ 0E-00-44-00-05-02-00-00-00-00-00-00-C8-42
92+ 0E-00-44-00-05-03-00-00-00-00-00-00-C8-42
93+ 0A-00-44-00-05-04-50-43-54-00
94+ 08-00-44-00-05-05-00-10
95+ 0A-00-44-00-05-80-04-00-03-00
96+ 11-00-44-00-06-00-50-49-4E-47-00-00-00-00-00-00-00
97+ 0E-00-44-00-06-01-00-00-00-00-00-00-80-3F
98+ 0E-00-44-00-06-02-00-00-00-00-00-00-C8-42
99+ 0E-00-44-00-06-03-00-00-00-00-00-00-80-3F
100+ 0A-00-44-00-06-04-50-43-54-00
101+ 08-00-44-00-06-05-00-90
102+ 0A-00-44-00-06-80-01-00-01-00
103+ 11-00-44-00-07-00-41-44-52-41-57-00-00-00-00-00-00
104+ 0E-00-44-00-07-01-00-00-00-00-00-00-80-44
105+ 0E-00-44-00-07-02-00-00-00-00-00-00-C8-42
106+ 0E-00-44-00-07-03-00-00-00-00-00-00-80-44
107+ 0A-00-44-00-07-04-50-43-54-00
108+ 08-00-44-00-07-05-90-00
109+ 0A-00-44-00-07-80-01-01-04-00
110+ 11-00-44-00-08-00-43-41-4C-49-42-00-00-00-00-00-00
111+ 0E-00-44-00-08-01-00-00-00-00-00-00-7F-43
112+ 0E-00-44-00-08-02-00-00-00-00-00-00-C8-42
113+ 0E-00-44-00-08-03-00-00-00-00-00-00-7F-43
114+ 0A-00-44-00-08-04-50-43-54-00
115+ 08-00-44-00-08-05-00-00
116+ 0A-00-44-00-08-80-07-00-03-00
117+ "
118+ } ) . Trim ( ) . Split ( "\n " ) . Select ( s => BytesStringUtil . StringToData ( s ) ) ;
119+ }
120+ }
0 commit comments