initial restart streamer for crappy video devices

This commit is contained in:
Devaev Maxim 2018-07-15 12:04:10 +03:00
parent fbf3f1981a
commit 25ddee3fb1
5 changed files with 28 additions and 11 deletions

View File

@ -33,6 +33,7 @@ kvmd:
sync_delay: 1.0 sync_delay: 1.0
init_delay: 1.0 init_delay: 1.0
init_restart_after: 1.0
shutdown_delay: 10.0 shutdown_delay: 10.0
size: size:

View File

@ -44,6 +44,7 @@ def main() -> None:
conv_power=int(config["streamer"]["pinout"]["conv"]), conv_power=int(config["streamer"]["pinout"]["conv"]),
sync_delay=float(config["streamer"]["sync_delay"]), sync_delay=float(config["streamer"]["sync_delay"]),
init_delay=float(config["streamer"]["init_delay"]), init_delay=float(config["streamer"]["init_delay"]),
init_restart_after=float(config["streamer"]["init_restart_after"]),
width=int(config["streamer"]["size"]["width"]), width=int(config["streamer"]["size"]["width"]),
height=int(config["streamer"]["size"]["height"]), height=int(config["streamer"]["size"]["height"]),
cmd=list(map(str, config["streamer"]["cmd"])), cmd=list(map(str, config["streamer"]["cmd"])),

View File

@ -285,7 +285,7 @@ class Server: # pylint: disable=too-many-instance-attributes
if self.__reset_streamer: if self.__reset_streamer:
if self.__streamer.is_running(): if self.__streamer.is_running():
await self.__streamer.stop() await self.__streamer.stop()
await self.__streamer.start() await self.__streamer.start(no_init_restart=True)
self.__reset_streamer = False self.__reset_streamer = False
prev = cur prev = cur

View File

@ -18,6 +18,7 @@ class Streamer: # pylint: disable=too-many-instance-attributes
conv_power: int, conv_power: int,
sync_delay: float, sync_delay: float,
init_delay: float, init_delay: float,
init_restart_after: float,
width: int, width: int,
height: int, height: int,
@ -30,6 +31,7 @@ class Streamer: # pylint: disable=too-many-instance-attributes
self.__conv_power = (gpio.set_output(conv_power) if conv_power > 0 else conv_power) self.__conv_power = (gpio.set_output(conv_power) if conv_power > 0 else conv_power)
self.__sync_delay = sync_delay self.__sync_delay = sync_delay
self.__init_delay = init_delay self.__init_delay = init_delay
self.__init_restart_after = init_restart_after
self.__width = width self.__width = width
self.__height = height self.__height = height
@ -39,19 +41,19 @@ class Streamer: # pylint: disable=too-many-instance-attributes
self.__proc_task: Optional[asyncio.Task] = None self.__proc_task: Optional[asyncio.Task] = None
async def start(self) -> None: async def start(self, no_init_restart: bool=False) -> None:
assert not self.__proc_task logger = get_logger()
get_logger().info("Starting streamer ...") logger.info("Starting streamer ...")
await self.__set_hw_enabled(True) await self.__inner_start()
self.__proc_task = self.__loop.create_task(self.__process()) if self.__init_restart_after > 0.0 and not no_init_restart:
logger.info("Stopping streamer to restart ...")
await self.__inner_stop()
logger.info("Starting again ...")
await self.__inner_start()
async def stop(self) -> None: async def stop(self) -> None:
assert self.__proc_task
get_logger().info("Stopping streamer ...") get_logger().info("Stopping streamer ...")
self.__proc_task.cancel() await self.__inner_stop()
await asyncio.gather(self.__proc_task, return_exceptions=True)
await self.__set_hw_enabled(False)
self.__proc_task = None
def is_running(self) -> bool: def is_running(self) -> bool:
return bool(self.__proc_task) return bool(self.__proc_task)
@ -69,6 +71,18 @@ class Streamer: # pylint: disable=too-many-instance-attributes
if self.is_running(): if self.is_running():
await self.stop() await self.stop()
async def __inner_start(self) -> None:
assert not self.__proc_task
await self.__set_hw_enabled(True)
self.__proc_task = self.__loop.create_task(self.__process())
async def __inner_stop(self) -> None:
assert self.__proc_task
self.__proc_task.cancel()
await asyncio.gather(self.__proc_task, return_exceptions=True)
await self.__set_hw_enabled(False)
self.__proc_task = None
async def __set_hw_enabled(self, enabled: bool) -> None: async def __set_hw_enabled(self, enabled: bool) -> None:
# XXX: This sequence is very important to enable converter and cap board # XXX: This sequence is very important to enable converter and cap board
if self.__cap_power > 0: if self.__cap_power > 0:

View File

@ -33,6 +33,7 @@ kvmd:
sync_delay: 1.0 sync_delay: 1.0
init_delay: 1.0 init_delay: 1.0
init_restart_after: 1.0
shutdown_delay: 10.0 shutdown_delay: 10.0
size: size: