@@ -28,29 +28,39 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
2828 @unmute_volume : Float64 = 60.0
2929
3030 def on_load
31- transport.tokenizer = Tokenizer .new(" \r " )
3231 self [:type ] = :projector
3332 end
3433
3534 def connected
35+ @ready = false
36+ self [:ready ] = false
37+
38+ schedule.in(20 .seconds) do
39+ if ! @ready
40+ logger.error { " Epson failed to be ready after 20 seconds. Reconnecting..." }
41+ disconnect
42+ end
43+ end
44+
3645 # Have to init comms
37- send(" ESC/VP.net\x10\x03\x00\x00\x00\x00 " )
46+ send(" ESC/VP.net\x10\x03\x00\x00\x00\x00 " , priority: 99 )
3847 schedule.every(52 .seconds, true ) { do_poll }
3948 end
4049
4150 def disconnected
51+ transport.tokenizer = nil
4252 schedule.clear
4353 end
4454
4555 def power (state : Bool )
4656 if state
4757 @power_target = true
4858 logger.debug { " -- epson Proj, requested to power on" }
49- do_send(:power , " ON" , delay: 40 .seconds, name: " power" , priority: 99 )
59+ do_send(:power , " ON" , timeout: 110 .seconds, delay: 5 .seconds, name: " power" , priority: 99 )
5060 else
5161 @power_target = false
5262 logger.debug { " -- epson Proj, requested to power off" }
53- do_send(:power , " OFF" , delay: 10 .seconds, name: " power" , priority: 99 )
63+ do_send(:power , " OFF" , timeout: 140 .seconds, delay: 5 .seconds, name: " power" , priority: 99 )
5464 end
5565 @power_stable = false
5666 self [:power ] = state
@@ -64,8 +74,8 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
6474
6575 def switch_to (input : Input )
6676 logger.debug { " -- epson Proj, requested to switch to: #{ input } " }
67- do_send(:input , input.value.to_s(16 ), name: :input )
6877 mute(false , layer: MuteLayer ::Video )
78+ do_send(:input , input.value.to_s(16 ), name: :input , timeout: 6 .seconds, delay: 1 .second)
6979
7080 # for a responsive UI
7181 self [:input ] = input # for a responsive UI
@@ -74,7 +84,7 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
7484 end
7585
7686 def input ?
77- do_send(:input , priority: 0 , wait: false )
87+ do_send(:input , priority: 0 )
7888 self [:input ]?.try(& .as_s?)
7989 end
8090
@@ -84,7 +94,7 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
8494 percentage = vol / 100.0
8595 vol_actual = (percentage * 255.0 ).round_away.to_i
8696
87- @unmute_volume = self [:volume ].as_f if (muted = vol == 0.0 ) && self [:volume ]?
97+ @unmute_volume = self [:volume ].as_f if (muted = vol.zero? ) && self [:volume ]?
8898 do_send(:volume , vol_actual, ** options, name: :volume )
8999
90100 # for a responsive UI
@@ -94,7 +104,7 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
94104 end
95105
96106 def volume ?
97- do_send(:volume , priority: 0 , wait: false )
107+ do_send(:volume , priority: 0 )
98108 self [:volume ]?.try(& .as_f)
99109 end
100110
@@ -104,21 +114,17 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
104114 layer : MuteLayer = MuteLayer ::AudioVideo ,
105115 )
106116 case layer
107- when .audio_video?
108- do_send(:video_mute , state ? " ON" : " OFF" , name: :video_mute , wait: false )
109- do_send(:av_mute , state ? " ON" : " OFF" , name: :mute , wait: false )
110- # do_send(:av_mute, name: :mute?, priority: 0, retries: 0)
111- when .video?
112- do_send(:video_mute , state ? " ON" : " OFF" , name: :video_mute , wait: false )
113- # video_mute?
117+ when .video?, .audio_video?
118+ do_send(:av_mute , state ? " ON" : " OFF" , name: :mute )
119+ video_mute?
114120 when .audio?
115121 val = state ? 0.0 : @unmute_volume
116122 volume(val)
117123 end
118124 end
119125
120126 def video_mute ?
121- do_send(:video_mute , priority: 0 , wait: false )
127+ do_send(:av_mute , priority: 0 )
122128 !! self [:video_mute ]?.try(& .as_bool)
123129 end
124130
@@ -144,6 +150,8 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
144150 " 14: exhaust shutter error" ,
145151 " 15: obstacle detection error" ,
146152 " 16: IF board discernment error" ,
153+ " 17: Communication error of 'Stack projection function'" ,
154+ " 18: I2C error" ,
147155 ]
148156
149157 def inspect_error
@@ -162,10 +170,24 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
162170 RESPONSE = COMMAND .to_h.invert
163171
164172 def received (data, task)
173+ data = String .new(data)
174+ logger.debug { " << Received from Epson Proj: #{ data.inspect } " }
175+
176+ # cleanup the data
177+ data = data.strip.strip(':' ).strip
178+
179+ # projector returns ":" on success
165180 return task.try(& .success) if data.size <= 2
166- # Because we see sometimes see responses like ':::PWR'
167- data = String .new(data[1 ..- 2 ]).lstrip(':' )
168- logger.debug { " << Received from Epson Proj: #{ data } " }
181+
182+ if ! @ready
183+ if data.includes?(" ESC/VP.net" )
184+ logger.debug { " -- Epson projector ready to accept commands" }
185+ transport.tokenizer = Tokenizer .new(" :" )
186+ @ready = true
187+ self [:ready ] = true
188+ end
189+ return task.try(& .success)
190+ end
169191
170192 # Handle IMEVENT messages
171193 if data.starts_with?(" IMEVENT=" )
@@ -207,9 +229,9 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
207229 self [:video_mute ] = false unless powered
208230 end
209231 when :av_mute
210- self [:video_mute ] = self [:audio_mute ] = data[1 ] == " ON"
211- self [:volume ] = 0.0
232+ self [:video_mute ] = data[1 ] == " ON"
212233 when :video_mute
234+ # we don't use this command
213235 self [:video_mute ] = data[1 ] == " ON"
214236 when :volume
215237 # convert to a percentage
@@ -235,7 +257,7 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
235257 volume?
236258 video_mute?
237259 end
238- do_send(:lamp , priority: 20 , wait: false )
260+ do_send(:lamp , priority: 20 )
239261 end
240262
241263 private def parse_imevent (data : String )
@@ -314,7 +336,7 @@ class Epson::Projector::EscVp21 < PlaceOS::Driver
314336 private def do_send (command , param = nil , ** options)
315337 command = COMMAND [command]
316338 cmd = param ? " #{ command } #{ param } \r " : " #{ command } ?\r "
317- logger.debug { " >> Sending to Epson Proj: #{ command } : #{ cmd } " }
339+ logger.debug { " >> Sending to Epson Proj - #{ command } : #{ cmd } " }
318340 send(cmd, ** options)
319341 end
320342end
0 commit comments