mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 09:10:30 +08:00
msd pinout
This commit is contained in:
parent
bbaf99c1b4
commit
a87963e300
@ -21,8 +21,13 @@ kvmd:
|
|||||||
state_poll: 0.1
|
state_poll: 0.1
|
||||||
|
|
||||||
msd:
|
msd:
|
||||||
|
pinout:
|
||||||
|
target: 12
|
||||||
|
reset: 13
|
||||||
|
|
||||||
device: "/dev/kvmd-msd"
|
device: "/dev/kvmd-msd"
|
||||||
init_delay: 2.0
|
init_delay: 2.0
|
||||||
|
reset_delay: 1.0
|
||||||
write_meta: true
|
write_meta: true
|
||||||
chunk_size: 65536
|
chunk_size: 65536
|
||||||
|
|
||||||
|
|||||||
@ -21,8 +21,13 @@ kvmd:
|
|||||||
state_poll: 0.1
|
state_poll: 0.1
|
||||||
|
|
||||||
msd:
|
msd:
|
||||||
|
pinout:
|
||||||
|
target: 12
|
||||||
|
reset: 13
|
||||||
|
|
||||||
device: "/dev/kvmd-msd"
|
device: "/dev/kvmd-msd"
|
||||||
init_delay: 2.0
|
init_delay: 2.0
|
||||||
|
reset_delay: 1.0
|
||||||
write_meta: true
|
write_meta: true
|
||||||
chunk_size: 65536
|
chunk_size: 65536
|
||||||
|
|
||||||
|
|||||||
@ -37,8 +37,11 @@ def main() -> None:
|
|||||||
)
|
)
|
||||||
|
|
||||||
msd = MassStorageDevice(
|
msd = MassStorageDevice(
|
||||||
|
target=int(config["msd"]["pinout"]["target"]),
|
||||||
|
reset=int(config["msd"]["pinout"]["reset"]),
|
||||||
device_path=str(config["msd"]["device"]),
|
device_path=str(config["msd"]["device"]),
|
||||||
init_delay=float(config["msd"]["init_delay"]),
|
init_delay=float(config["msd"]["init_delay"]),
|
||||||
|
reset_delay=float(config["msd"]["reset_delay"]),
|
||||||
write_meta=bool(config["msd"]["write_meta"]),
|
write_meta=bool(config["msd"]["write_meta"]),
|
||||||
loop=loop,
|
loop=loop,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -16,6 +16,8 @@ def main() -> None:
|
|||||||
logger.info("Cleaning up ...")
|
logger.info("Cleaning up ...")
|
||||||
with gpio.bcm():
|
with gpio.bcm():
|
||||||
for (name, pin) in [
|
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_power_switch", config["atx"]["pinout"]["power_switch"]),
|
||||||
("atx_reset_switch", config["atx"]["pinout"]["reset_switch"]),
|
("atx_reset_switch", config["atx"]["pinout"]["reset_switch"]),
|
||||||
("streamer_cap", config["streamer"]["pinout"]["cap"]),
|
("streamer_cap", config["streamer"]["pinout"]["cap"]),
|
||||||
|
|||||||
27
kvmd/msd.py
27
kvmd/msd.py
@ -16,6 +16,7 @@ import aiofiles
|
|||||||
import aiofiles.base
|
import aiofiles.base
|
||||||
|
|
||||||
from . import aioregion
|
from . import aioregion
|
||||||
|
from . import gpio
|
||||||
|
|
||||||
from .logging import get_logger
|
from .logging import get_logger
|
||||||
|
|
||||||
@ -164,15 +165,25 @@ def _msd_operated(method: Callable) -> Callable:
|
|||||||
class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
target: int,
|
||||||
|
reset: int,
|
||||||
|
|
||||||
device_path: str,
|
device_path: str,
|
||||||
init_delay: float,
|
init_delay: float,
|
||||||
|
reset_delay: float,
|
||||||
write_meta: bool,
|
write_meta: bool,
|
||||||
|
|
||||||
loop: asyncio.AbstractEventLoop,
|
loop: asyncio.AbstractEventLoop,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|
||||||
|
self.__target = gpio.set_output(target)
|
||||||
|
self.__reset = gpio.set_output(reset)
|
||||||
|
|
||||||
self._device_path = device_path
|
self._device_path = device_path
|
||||||
self.__init_delay = init_delay
|
self.__init_delay = init_delay
|
||||||
|
self.__reset_delay = reset_delay
|
||||||
self.__write_meta = write_meta
|
self.__write_meta = write_meta
|
||||||
|
|
||||||
self.__loop = loop
|
self.__loop = loop
|
||||||
|
|
||||||
self.__device_info: Optional[_MassStorageDeviceInfo] = None
|
self.__device_info: Optional[_MassStorageDeviceInfo] = None
|
||||||
@ -202,7 +213,7 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
|||||||
with self.__region:
|
with self.__region:
|
||||||
if self.__device_info:
|
if self.__device_info:
|
||||||
raise MsdAlreadyConnectedToKvmError()
|
raise MsdAlreadyConnectedToKvmError()
|
||||||
# TODO: disable gpio
|
gpio.write(self.__target, False)
|
||||||
if not no_delay:
|
if not no_delay:
|
||||||
await asyncio.sleep(self.__init_delay)
|
await asyncio.sleep(self.__init_delay)
|
||||||
await self.__load_device_info()
|
await self.__load_device_info()
|
||||||
@ -213,10 +224,17 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
|||||||
with self.__region:
|
with self.__region:
|
||||||
if not self.__device_info:
|
if not self.__device_info:
|
||||||
raise MsdAlreadyConnectedToPcError()
|
raise MsdAlreadyConnectedToPcError()
|
||||||
# TODO: enable gpio
|
gpio.write(self.__target, True)
|
||||||
self.__device_info = None
|
self.__device_info = None
|
||||||
get_logger().info("Mass-storage device switched to Server")
|
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:
|
def get_state(self) -> Dict:
|
||||||
info = (self.__saved_device_info._asdict() if self.__saved_device_info else None)
|
info = (self.__saved_device_info._asdict() if self.__saved_device_info else None)
|
||||||
if info:
|
if info:
|
||||||
@ -237,7 +255,8 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
async def cleanup(self) -> None:
|
async def cleanup(self) -> None:
|
||||||
await self.__close_device_file()
|
await self.__close_device_file()
|
||||||
# TODO: disable gpio
|
gpio.write(self.__target, False)
|
||||||
|
gpio.write(self.__reset, False)
|
||||||
|
|
||||||
@_msd_operated
|
@_msd_operated
|
||||||
async def __aenter__(self) -> "MassStorageDevice":
|
async def __aenter__(self) -> "MassStorageDevice":
|
||||||
@ -298,6 +317,6 @@ class MassStorageDevice: # pylint: disable=too-many-instance-attributes
|
|||||||
await self.__device_file.close()
|
await self.__device_file.close()
|
||||||
except Exception:
|
except Exception:
|
||||||
get_logger().exception("Can't close mass-storage device file")
|
get_logger().exception("Can't close mass-storage device file")
|
||||||
# TODO: reset device file
|
await self.reset()
|
||||||
self.__device_file = None
|
self.__device_file = None
|
||||||
self.__written = 0
|
self.__written = 0
|
||||||
|
|||||||
@ -147,6 +147,7 @@ class Server: # pylint: disable=too-many-instance-attributes
|
|||||||
app.router.add_get("/msd", self.__msd_state_handler)
|
app.router.add_get("/msd", self.__msd_state_handler)
|
||||||
app.router.add_post("/msd/connect", self.__msd_connect_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/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_get("/streamer", self.__streamer_state_handler)
|
||||||
app.router.add_post("/streamer/set_params", self.__streamer_set_params_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)
|
logger.info("Written %d bytes to mass-storage device", written)
|
||||||
return _json({"written": 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
|
# ===== STREAMER
|
||||||
|
|
||||||
async def __streamer_state_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response:
|
async def __streamer_state_handler(self, _: aiohttp.web.Request) -> aiohttp.web.Response:
|
||||||
|
|||||||
@ -21,8 +21,13 @@ kvmd:
|
|||||||
state_poll: 0.1
|
state_poll: 0.1
|
||||||
|
|
||||||
msd:
|
msd:
|
||||||
|
pinout:
|
||||||
|
target: 12
|
||||||
|
reset: 13
|
||||||
|
|
||||||
device: "/dev/kvmd-msd"
|
device: "/dev/kvmd-msd"
|
||||||
init_delay: 2.0
|
init_delay: 2.0
|
||||||
|
reset_delay: 1.0
|
||||||
write_meta: true
|
write_meta: true
|
||||||
chunk_size: 65536
|
chunk_size: 65536
|
||||||
|
|
||||||
|
|||||||
@ -69,9 +69,7 @@
|
|||||||
<div class="ctl-dropdown-content">
|
<div class="ctl-dropdown-content">
|
||||||
<div class="ctl-dropdown-content-buttons">
|
<div class="ctl-dropdown-content-buttons">
|
||||||
<button id="show-about-button">• Show about</button>
|
<button id="show-about-button">• Show about</button>
|
||||||
<hr>
|
|
||||||
<button id="show-keyboard-button">• Show keyboard</button>
|
<button id="show-keyboard-button">• Show keyboard</button>
|
||||||
<hr>
|
|
||||||
<button id="show-stream-button">• Show stream</button>
|
<button id="show-stream-button">• Show stream</button>
|
||||||
<hr>
|
<hr>
|
||||||
<button disabled id="stream-screenshot-button">• Take a screenshot</button>
|
<button disabled id="stream-screenshot-button">• Take a screenshot</button>
|
||||||
@ -91,6 +89,7 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<div class="ctl-dropdown-content-buttons">
|
<div class="ctl-dropdown-content-buttons">
|
||||||
<button disabled id="stream-reset-button">• Reset stream</button>
|
<button disabled id="stream-reset-button">• Reset stream</button>
|
||||||
|
<button disabled id="msd-reset-button">• Reset mass storage</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -18,6 +18,8 @@ function Msd() {
|
|||||||
|
|
||||||
tools.setOnClick($("msd-switch-to-kvm-button"), () => __clickSwitchButton("kvm"));
|
tools.setOnClick($("msd-switch-to-kvm-button"), () => __clickSwitchButton("kvm"));
|
||||||
tools.setOnClick($("msd-switch-to-server-button"), () => __clickSwitchButton("server"));
|
tools.setOnClick($("msd-switch-to-server-button"), () => __clickSwitchButton("server"));
|
||||||
|
|
||||||
|
tools.setOnClick($("msd-reset-button"), __clickResetButton);
|
||||||
};
|
};
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
@ -86,6 +88,18 @@ function Msd() {
|
|||||||
__applyState();
|
__applyState();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var __clickResetButton = function() {
|
||||||
|
var http = tools.makeRequest("POST", "/kvmd/msd/reset", function() {
|
||||||
|
if (http.readyState === 4) {
|
||||||
|
if (http.status !== 200) {
|
||||||
|
ui.error("MSD reset error:<br>", http.responseText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
__applyState();
|
||||||
|
});
|
||||||
|
__applyState();
|
||||||
|
};
|
||||||
|
|
||||||
var __applyState = function() {
|
var __applyState = function() {
|
||||||
if (__state.connected_to === "server") {
|
if (__state.connected_to === "server") {
|
||||||
$("msd-another-another-user-uploads").style.display = "none";
|
$("msd-another-another-user-uploads").style.display = "none";
|
||||||
@ -123,6 +137,7 @@ function Msd() {
|
|||||||
$("msd-select-new-image-button").disabled = (!__state.in_operate || __state.connected_to !== "kvm" || __state.busy || __upload_http);
|
$("msd-select-new-image-button").disabled = (!__state.in_operate || __state.connected_to !== "kvm" || __state.busy || __upload_http);
|
||||||
$("msd-upload-new-image-button").disabled = (!__state.in_operate || __state.connected_to !== "kvm" || __state.busy || !__image_file);
|
$("msd-upload-new-image-button").disabled = (!__state.in_operate || __state.connected_to !== "kvm" || __state.busy || !__image_file);
|
||||||
$("msd-abort-uploading-button").disabled = (!__state.in_operate || !__upload_http);
|
$("msd-abort-uploading-button").disabled = (!__state.in_operate || !__upload_http);
|
||||||
|
$("msd-reset-button").disabled = (!__state.in_operate || __upload_http);
|
||||||
|
|
||||||
$("msd-new-image").style.display = (__image_file ? "block" : "none");
|
$("msd-new-image").style.display = (__image_file ? "block" : "none");
|
||||||
$("msd-progress").setAttribute("data-label", "Waiting for upload ...");
|
$("msd-progress").setAttribute("data-label", "Waiting for upload ...");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user