71
71
from pykob .morse import Reader , Sender
72
72
73
73
COMPILE_INFO = globals ().get ("__compiled__" )
74
- __version__ = '1.1 .0'
74
+ __version__ = '1.2 .0'
75
75
VERSION = __version__ if COMPILE_INFO is None else __version__ + 'c'
76
76
TELEGRAM_VERSION_TEXT = "Telegram " + VERSION
77
77
@@ -402,7 +402,7 @@ def print(self, text, bold=False, italic=False, update=True, spacing=0.0): # ty
402
402
pygame .display .flip ()
403
403
return
404
404
405
- def show_closer_state (self , open ): # type: (bool) -> None
405
+ def show_closer_state (self , open , update = False ): # type: (bool, bool) -> None
406
406
"""
407
407
Render a '~' or '+' in the bottom left corner of the screen
408
408
based on the open/closed state. Erase what might have been
@@ -414,9 +414,11 @@ def show_closer_state(self, open): # type: (bool) -> None
414
414
self ._screen .blit (self ._KC_open_sprite , self ._KC_state_pt )
415
415
else :
416
416
self ._screen .blit (self ._KC_closed_sprite , self ._KC_state_pt )
417
+ if update :
418
+ pygame .display .flip ()
417
419
return
418
420
419
- def show_wire_state (self , connected ): # type: (bool) -> None
421
+ def show_wire_state (self , connected , update = False ): # type: (bool, bool) -> None
420
422
"""
421
423
Render a closed or open circle for connected or disconnected
422
424
in the bottom right corner of the screen based on the connected
@@ -428,6 +430,8 @@ def show_wire_state(self, connected): # type: (bool) -> None
428
430
self ._screen .blit (self ._WC_sprite , self ._W_state_pt )
429
431
else :
430
432
self ._screen .blit (self ._WD_sprite , self ._W_state_pt )
433
+ if update :
434
+ pygame .display .flip ()
431
435
return
432
436
433
437
def shutdown (self ): # type: () -> None
@@ -535,6 +539,7 @@ class TelegramConfig:
535
539
FONT_SIZE_KEY = "font_size"
536
540
PAGE_CLEAR_IDLE_TIME_KEY = "page_clear_idle_time"
537
541
PAGE_ADVANCE_SECONDS_KEY = "page_advance_seconds"
542
+ PAGE_NEW_ON_KEY_OPEN_KEY = "page_new_on_key_open"
538
543
PAGE_COLOR_KEY = "page_color"
539
544
PAGE_WIDTH_KEY = "page_width"
540
545
TEXT_COLOR_KEY = "text_color"
@@ -562,6 +567,7 @@ def __init__(self, tgcfg_file_path): # type: (str|None) -> None
562
567
self ._text_color = "black" # type: str|tuple[int,int,int]
563
568
self ._page_clear_idle_time = 18.0 # type: float # Seconds of idle before clear
564
569
self ._page_advance_seconds = 2.8 # type: float # Time to take to scroll the page (-1 means no 'new page')
570
+ self ._page_new_on_key_open = False # type: bool # Scroll in a new form when the key is opened
565
571
self ._page_color = (198 ,189 ,150 ) # type: str|tuple[int,int,int] # Tan
566
572
self ._page_width = 980 # type: int # The page color portion width. 980 is reasonable.
567
573
self ._masthead_filep = None # type: str|None
@@ -701,6 +707,14 @@ def page_color(self, color): # type: (str|tuple[int,int,int]) -> None
701
707
self ._page_color = color
702
708
return
703
709
710
+ @property
711
+ def page_new_on_key_open (self ): # type: () -> bool
712
+ return self ._page_new_on_key_open
713
+ @page_new_on_key_open .setter
714
+ def page_new_on_key_open (self , b ): # type: (bool) -> None
715
+ self ._page_new_on_key_open = b
716
+ return
717
+
704
718
@property
705
719
def page_width (self ): # type: () -> int
706
720
return self ._page_width
@@ -798,6 +812,8 @@ def load(self, filep=None): # type: (str|None) -> None
798
812
self ._page_advance_seconds = value
799
813
case self .PAGE_COLOR_KEY :
800
814
self ._page_color = literal_eval (value ) if value and value [0 ] == '(' else value
815
+ case self .PAGE_NEW_ON_KEY_OPEN_KEY :
816
+ self ._page_new_on_key_open = value
801
817
case self .PAGE_WIDTH_KEY :
802
818
self ._page_width = value
803
819
case self .TEXT_COLOR_KEY :
@@ -990,7 +1006,7 @@ def _from_internet(self, code):
990
1006
if code == STARTMSG :
991
1007
self ._form .new_form ()
992
1008
self ._form .show_closer_state (self ._kob .virtual_closer_is_open )
993
- self ._form .show_wire_state (self ._connected )
1009
+ self ._form .show_wire_state (self ._connected , update = True )
994
1010
elif code == ENDMSG :
995
1011
# Don't do anything at end. Timeout or new message (STARTMSG)
996
1012
# will display a new form.
@@ -1124,15 +1140,16 @@ def _set_virtual_closer_closed(self, close):
1124
1140
Handle change of Circuit Closer state.
1125
1141
1126
1142
A state of:
1127
- True: 'latch'
1128
- False: 'unlatch'
1143
+ close= True: 'latch'
1144
+ close= False: 'unlatch'
1129
1145
"""
1130
1146
was_closed = not self ._kob .virtual_closer_is_open
1147
+ log .debug ("Telegram._set_virtual_closer_closed: {}:{}" .format (was_closed , close ), 2 , dt = "" )
1131
1148
if close and was_closed :
1132
1149
return
1133
1150
open = not close
1134
1151
self ._kob .virtual_closer_is_open = open
1135
- self ._form .show_closer_state (open )
1152
+ self ._form .show_closer_state (open , update = True )
1136
1153
code = LATCH_CODE if close else UNLATCH_CODE
1137
1154
# if not self._internet_station_active:
1138
1155
if True : # Allow breaking in to an active wire message
@@ -1154,17 +1171,18 @@ def _set_virtual_closer_closed(self, close):
1154
1171
self ._set_local_loop_active (True )
1155
1172
if was_closed :
1156
1173
# The closer was closed and now it's open
1157
- # Flush the reader and display a new form
1174
+ # Flush the reader
1175
+ ignoring_inet = self ._ignore_internet .is_set ()
1158
1176
self ._ignore_internet .set ()
1159
1177
rdr = self ._reader
1160
1178
if rdr is not None :
1161
1179
rdr .setCallback (None ) # Don't have it call back
1180
+ if self ._tgcfg .page_new_on_key_open :
1162
1181
self ._form .new_form ()
1163
- self ._form .show_closer_state (self ._kob .virtual_closer_is_open )
1164
- self ._form .show_wire_state (self ._connected )
1182
+ if rdr is not None :
1165
1183
self ._new_Reader ()
1166
- else :
1167
- self ._ignore_internet .clear ()
1184
+ if not ignoring_inet :
1185
+ self ._ignore_internet .clear ()
1168
1186
return
1169
1187
1170
1188
@@ -1231,13 +1249,21 @@ def main_loop(self):
1231
1249
self ._shutdown .set ()
1232
1250
self ._control_c_pressed .set ()
1233
1251
break
1252
+ elif c == '\x01 ' : # advance the form on ^A
1253
+ ignoring_inet = self ._ignore_internet .is_set ()
1254
+ self ._ignore_internet .set ()
1255
+ self ._form .new_form ()
1256
+ self ._last_display_t = sys .float_info .max
1257
+ if not ignoring_inet :
1258
+ self ._ignore_internet .clear ()
1234
1259
elif c == '\x18 ' : # display a new form on ^X
1235
1260
ignoring_inet = self ._ignore_internet .is_set ()
1236
1261
self ._ignore_internet .set ()
1237
1262
self ._form .new_form (fresh = True )
1238
1263
if self ._tgcfg .welcome_msg is not None :
1239
1264
self ._form .print (self ._tgcfg .welcome_msg )
1240
1265
self ._form .new_line (2 )
1266
+ self ._last_display_t = sys .float_info .max
1241
1267
if not ignoring_inet :
1242
1268
self ._ignore_internet .clear ()
1243
1269
else :
@@ -1257,6 +1283,7 @@ def main_loop(self):
1257
1283
self ._ignore_internet .set ()
1258
1284
self ._form .new_form (fresh = True , disp_masthead = False )
1259
1285
self ._form .new_line (1 )
1286
+ self ._last_display_t = sys .float_info .max
1260
1287
if not ignoring_inet :
1261
1288
self ._ignore_internet .clear ()
1262
1289
continue
@@ -1276,7 +1303,7 @@ def main_loop(self):
1276
1303
self ._form .print (self ._tgcfg .welcome_msg )
1277
1304
self ._form .new_line (2 )
1278
1305
self ._form .show_closer_state (self ._kob .virtual_closer_is_open )
1279
- self ._form .show_wire_state (self ._connected )
1306
+ self ._form .show_wire_state (self ._connected , update = True )
1280
1307
if not ignoring_inet :
1281
1308
self ._ignore_internet .clear ()
1282
1309
self ._last_display_t = sys .float_info .max
@@ -1366,7 +1393,7 @@ def start(self):
1366
1393
self ._clock = pygame .time .Clock ()
1367
1394
self ._form .new_form (fresh = True )
1368
1395
self ._form .show_closer_state (self ._kob .virtual_closer_is_open )
1369
- self ._form .show_wire_state (self ._connected )
1396
+ self ._form .show_wire_state (self ._connected , update = True )
1370
1397
self ._running = True
1371
1398
self ._dt = 0
1372
1399
return
0 commit comments