mmgen-node-tools/mmgen_node_tools/PollDisplay.py

74 lines
1.7 KiB
Python
Executable file

#!/usr/bin/env python3
#
# mmgen = Multi-Mode GENerator, a command-line cryptocurrency wallet
# Copyright (C)2013-2022 The MMGen Project <mmgen@tuta.io>
# Licensed under the GNU General Public License, Version 3:
# https://www.gnu.org/licenses
# Public project repositories:
# https://github.com/mmgen/mmgen-wallet
# https://gitlab.com/mmgen/mmgen-wallet
"""
mmgen_node_tools.PollDisplay: update and display RPC data; get input from user
"""
import sys,threading
from mmgen.util import msg
from mmgen.term import get_char
class PollDisplay:
info = None
input = None
poll_secs = 1
def __init__(self,cfg):
self.cfg = cfg
self.info_lock = threading.Lock() # self.info accessed by 2 threads
self.display_kill_flag = threading.Event()
def get_input(self):
return get_char(immed_chars='q',prehold_protect=False,num_bytes=1)
async def process_input(self,rpc):
return True
async def run(self,rpc):
async def do_display():
with self.info_lock:
self.info = None
self.input = None
self.enable_display = True
count = 1
while True:
with self.info_lock:
if self.enable_display:
self.info = await self.get_info(rpc)
self.display(count)
if self.display_kill_flag.wait(self.poll_secs):
self.display_kill_flag.clear()
return
count += 1
async def process_input():
if self.input == None:
sys.exit(1)
elif self.input == 'q':
msg('')
sys.exit(0)
elif self.info:
if await self.process_input(rpc):
return True
else:
return True
def get_input():
self.input = self.get_input()
self.display_kill_flag.set()
while True:
threading.Thread(target=get_input,daemon=True).start()
await do_display()
if await process_input():
break