msd pinout

This commit is contained in:
Devaev Maxim
2018-10-05 20:03:40 +03:00
parent bbaf99c1b4
commit a87963e300
9 changed files with 65 additions and 6 deletions

View File

@@ -37,8 +37,11 @@ def main() -> None:
)
msd = MassStorageDevice(
target=int(config["msd"]["pinout"]["target"]),
reset=int(config["msd"]["pinout"]["reset"]),
device_path=str(config["msd"]["device"]),
init_delay=float(config["msd"]["init_delay"]),
reset_delay=float(config["msd"]["reset_delay"]),
write_meta=bool(config["msd"]["write_meta"]),
loop=loop,
)

View File

@@ -16,6 +16,8 @@ def main() -> None:
logger.info("Cleaning up ...")
with gpio.bcm():
for (name, pin) in [
("msd_target", config["msd"]["pinout"]["target"]),
("msd_reset", config["msd"]["pinout"]["reset"]),
("atx_power_switch", config["atx"]["pinout"]["power_switch"]),
("atx_reset_switch", config["atx"]["pinout"]["reset_switch"]),
("streamer_cap", config["streamer"]["pinout"]["cap"]),

View File

@@ -16,6 +16,7 @@ import aiofiles
import aiofiles.base
from . import aioregion
from . import gpio
from .logging import get_logger
@@ -164,15 +165,25 @@ def _msd_operated(method: Callable) -> Callable:
class MassStorageDevice: # pylint: disable=too-many-instance-attributes
def __init__(
self,
target: int,
reset: int,
device_path: str,
init_delay: float,
reset_delay: float,
write_meta: bool,
loop: asyncio.AbstractEventLoop,
) -> None:
self.__target = gpio.set_output(target)
self.__reset = gpio.set_output(reset)
self._device_path = device_path
self.__init_delay = init_delay
self.__reset_delay = reset_delay
self.__write_meta = write_meta
self.__loop = loop
self.__device_info: Optional[_MassStorageDeviceInfo] = None
@@ -202,7 +213,7 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
with self.__region:
if self.__device_info:
raise MsdAlreadyConnectedToKvmError()
# TODO: disable gpio
gpio.write(self.__target, False)
if not no_delay:
await asyncio.sleep(self.__init_delay)
await self.__load_device_info()
@@ -213,10 +224,17 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
with self.__region:
if not self.__device_info:
raise MsdAlreadyConnectedToPcError()
# TODO: enable gpio
gpio.write(self.__target, True)
self.__device_info = None
get_logger().info("Mass-storage device switched to Server")
@_msd_operated
async def reset(self) -> None:
with self.__region:
gpio.write(self.__reset, True)
await asyncio.sleep(self.__reset_delay)
gpio.write(self.__reset, False)
def get_state(self) -> Dict:
info = (self.__saved_device_info._asdict() if self.__saved_device_info else None)
if info:
@@ -237,7 +255,8 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
async def cleanup(self) -> None:
await self.__close_device_file()
# TODO: disable gpio
gpio.write(self.__target, False)
gpio.write(self.__reset, False)
@_msd_operated
async def __aenter__(self) -> "MassStorageDevice":
@@ -298,6 +317,6 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
await self.__device_file.close()
except Exception:
get_logger().exception("Can't close mass-storage device file")
# TODO: reset device file
await self.reset()
self.__device_file = None
self.__written = 0

View File

@@ -147,6 +147,7 @@ class Server: # pylint: disable=too-many-instance-attributes
app.router.add_get("/msd", self.__msd_state_handler)
app.router.add_post("/msd/connect", self.__msd_connect_handler)
app.router.add_post("/msd/write", self.__msd_write_handler)
app.router.add_post("/msd/reset", self.__msd_reset_handler)
app.router.add_get("/streamer", self.__streamer_state_handler)
app.router.add_post("/streamer/set_params", self.__streamer_set_params_handler)
@@ -298,6 +299,11 @@ class Server: # pylint: disable=too-many-instance-attributes
logger.info("Written %d bytes to mass-storage device", written)
return _json({"written": written})
@_wrap_exceptions_for_web("Mass-storage error")
async def __msd_reset_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response:
await self.__msd.reset()
return _json()
# ===== STREAMER
async def __streamer_state_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response: