Add support for LinkPi SmartHUB power port#1729
Add support for LinkPi SmartHUB power port#1729Kwiboo wants to merge 1 commit intolabgrid-project:masterfrom
Conversation
4017869 to
ed5bb15
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #1729 +/- ##
========================================
+ Coverage 45.8% 46.0% +0.2%
========================================
Files 182 183 +1
Lines 14718 14816 +98
========================================
+ Hits 6743 6829 +86
- Misses 7975 7987 +12
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
b741e89 to
d956ef3
Compare
3549390 to
b5bc7df
Compare
b5bc7df to
2c615c4
Compare
2c615c4 to
ea747b2
Compare
ea747b2 to
eecf893
Compare
eecf893 to
189726b
Compare
189726b to
21a249c
Compare
c782167 to
2f70e4c
Compare
2f70e4c to
20b0a4b
Compare
20b0a4b to
cb0be2b
Compare
cb0be2b to
a603731
Compare
3953541 to
931b1fd
Compare
931b1fd to
658a1ef
Compare
| self.path = path | ||
|
|
||
| def _command(self, command): | ||
| with serial.Serial(self.path, 115200, timeout=2) as s: |
There was a problem hiding this comment.
How do we handle the case when two users want to switch different ports simultenously? Is the serial.open() already going to fail, what does the error message look like?
There was a problem hiding this comment.
I was able to trigger an error reading power status for two different ports after a few tries of parallel labgrid-client power get.
Something like following or something similar could possible happen:
Selected role main from configuration file
INFO StepLogger: → LinkPiSmartHUBPowerDriver.get()
INFO StepLogger: ⚠ LinkPiSmartHUBPowerDriver.get() [0.255s] exception=SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
Traceback (most recent call last):
File "/home/labgrid/lib/python3.12/site-packages/labgrid/remote/client.py", line 2304, in main
args.func(session)
File "/home/labgrid/lib/python3.12/site-packages/labgrid/remote/client.py", line 980, in power
res = getattr(drv, action)()
^^^^^^^^^^^^^^^^^^^^^^
File "/home/labgrid/lib/python3.12/site-packages/labgrid/binding.py", line 102, in wrapper
return func(self, *_args, **_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/labgrid/lib/python3.12/site-packages/labgrid/step.py", line 215, in wrapper
_result = func(*_args, **_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/labgrid/lib/python3.12/site-packages/labgrid/driver/powerdriver.py", line 107, in get
return self.proxy.get(self.port.path, self.port.index)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/labgrid/lib/python3.12/site-packages/labgrid/util/agentwrapper.py", line 29, in __call__
return self.wrapper.call(self.name, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/labgrid/lib/python3.12/site-packages/labgrid/util/agentwrapper.py", line 107, in call
raise AgentException(e)
labgrid.util.agentwrapper.AgentException: SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
In above scenario there was likely two simultaneous serial.open() but only one could serial.readline() and succeeded or in worst case possible returned wrong power status.
There was a problem hiding this comment.
I was also able to trigger similar error using labgrid-client power cycle:
Selected role main from configuration file
INFO StepLogger: → LinkPiSmartHUBPowerDriver.cycle()
INFO StepLogger: → LinkPiSmartHUBPowerDriver.off()
INFO StepLogger: ← LinkPiSmartHUBPowerDriver.off() [0.138s]
INFO StepLogger: → LinkPiSmartHUBPowerDriver.on()
INFO StepLogger: ⚠ LinkPiSmartHUBPowerDriver.on() [1.006s] exception=SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
INFO StepLogger: ⚠ LinkPiSmartHUBPowerDriver.cycle() [3.145s] exception=SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
LinkPi SmartHUB is a 12-port USB3.0 HUB utilizing four RTS5411 USB3.0 4-port HUB controllers, a FT232R USB UART IC and a STM32F103RB MCU for port power control. Add a LinkPiSmartHUBPowerPort resource and a LinkPiSmartHUBPowerDriver with an accompanying linkpismarthub agent to support power on/off the ports of the LinkPi SmartHUB using a simple line-based protocol over a serial port. Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
Description
LinkPi SmartHUB is a 12-port USB3.0 HUB utilizing four RTS5411 USB3.0 4-port HUB controllers, a FT232R USB UART IC and a STM32F103RB MCU for port power control. Maximum output power of each USB port is up to 15W.
Add a LinkPiSmartHUBPowerPort resource and a LinkPiSmartHUBPowerDriver with an accompanying linkpismarthub agent to support power on/off the ports of the LinkPi SmartHUB using a simple line-based protocol over a serial port.
Known commands:
onoff <port> <1|0>- switch port power on/offstate- get current power state of all portsSetOWP <1|0> <1|0> ...- set the power-on state of all portsGetOWP- get the power-on state of all portsResponses are in JSON format, e.g.:
A version announcement is continuously sent every second:
Please note that the port name printed on the hub does not match the internal port index used with the commands.
Links
Information on the LinkPi SmartHUB is hard to find, following links mention it:
Checklist