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
init_delay: 1.0
init_restart_after: 1.0
shutdown_delay: 10.0
size:

View File

@ -44,6 +44,7 @@ def main() -> None:
conv_power=int(config["streamer"]["pinout"]["conv"]),
sync_delay=float(config["streamer"]["sync_delay"]),
init_delay=float(config["streamer"]["init_delay"]),
init_restart_after=float(config["streamer"]["init_restart_after"]),
width=int(config["streamer"]["size"]["width"]),
height=int(config["streamer"]["size"]["height"]),
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.__streamer.is_running():
await self.__streamer.stop()
await self.__streamer.start()
await self.__streamer.start(no_init_restart=True)
self.__reset_streamer = False
prev = cur

View File

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

View File

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