2019-07-15 11:18:24 -06:00
""" Constants for SSTV specification and each supported mode """
2019-07-15 10:46:41 -06:00
2019-07-15 10:28:23 -06:00
from enum import Enum
2019-07-15 10:46:41 -06:00
2019-07-15 10:28:23 -06:00
class COL_FMT ( Enum ) :
RGB = 1
GBR = 2
YUV = 3
BW = 4
2019-07-15 10:46:41 -06:00
2019-07-15 10:55:57 -06:00
class M1 ( object ) :
2019-07-15 10:28:23 -06:00
NAME = " Martin 1 "
2019-07-15 10:55:57 -06:00
2019-07-15 10:28:23 -06:00
COLOR = COL_FMT . GBR
LINE_WIDTH = 320
LINE_COUNT = 256
SCAN_TIME = 0.146432
SYNC_PULSE = 0.004862
SYNC_PORCH = 0.000572
SEP_PULSE = 0.000572
CHAN_COUNT = 3
2019-07-15 10:55:57 -06:00
CHAN_SYNC = 0
2019-07-15 10:28:23 -06:00
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME )
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 1 ] + CHAN_TIME )
LINE_TIME = SYNC_PULSE + SYNC_PORCH + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
2019-07-15 10:59:15 -06:00
WINDOW_FACTOR = 2.34
2019-07-15 10:28:23 -06:00
2019-07-15 10:55:57 -06:00
HAS_START_SYNC = False
2019-07-16 02:55:18 -06:00
HAS_HALF_SCAN = False
HAS_ALT_SCAN = False
2019-07-15 10:55:57 -06:00
2019-07-15 10:28:23 -06:00
2019-07-16 01:16:20 -06:00
class M2 ( M1 ) :
NAME = " Martin 2 "
LINE_WIDTH = 320
SCAN_TIME = 0.073216
SYNC_PULSE = 0.004862
SYNC_PORCH = 0.000572
SEP_PULSE = 0.000572
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME )
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 1 ] + CHAN_TIME )
LINE_TIME = SYNC_PULSE + SYNC_PORCH + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
WINDOW_FACTOR = 4.68
2019-07-15 10:55:57 -06:00
class S1 ( object ) :
2019-07-15 10:28:23 -06:00
NAME = " Scottie 1 "
COLOR = COL_FMT . GBR
LINE_WIDTH = 320
LINE_COUNT = 256
SCAN_TIME = 0.138240
SYNC_PULSE = 0.009000
SYNC_PORCH = 0.001500
SEP_PULSE = 0.001500
CHAN_COUNT = 3
CHAN_SYNC = 2
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH + CHAN_TIME ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME )
CHAN_OFFSETS . append ( SYNC_PULSE + SYNC_PORCH )
LINE_TIME = SYNC_PULSE + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
2019-07-15 10:59:15 -06:00
WINDOW_FACTOR = 2.48
2019-07-15 10:28:23 -06:00
2019-07-15 10:55:57 -06:00
HAS_START_SYNC = True
2019-07-16 02:55:18 -06:00
HAS_HALF_SCAN = False
HAS_ALT_SCAN = False
2019-07-15 10:28:23 -06:00
2019-07-15 10:55:57 -06:00
2019-07-16 01:35:53 -06:00
class S2 ( S1 ) :
NAME = " Scottie 2 "
LINE_WIDTH = 320
SCAN_TIME = 0.088064
SYNC_PULSE = 0.009000
SYNC_PORCH = 0.001500
SEP_PULSE = 0.001500
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH + CHAN_TIME ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME )
CHAN_OFFSETS . append ( SYNC_PULSE + SYNC_PORCH )
LINE_TIME = SYNC_PULSE + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
WINDOW_FACTOR = 3.82
class SDX ( S2 ) :
NAME = " Scottie DX "
LINE_WIDTH = 320
SCAN_TIME = 0.345600
SYNC_PULSE = 0.009000
SYNC_PORCH = 0.001500
SEP_PULSE = 0.001500
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH + CHAN_TIME ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME )
CHAN_OFFSETS . append ( SYNC_PULSE + SYNC_PORCH )
LINE_TIME = SYNC_PULSE + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
2019-07-16 02:55:18 -06:00
WINDOW_FACTOR = 0.98
2019-07-16 01:35:53 -06:00
2019-07-15 10:55:57 -06:00
class R36 ( object ) :
2019-07-15 10:28:23 -06:00
NAME = " Robot 36 "
COLOR = COL_FMT . YUV
LINE_WIDTH = 320
LINE_COUNT = 240
SCAN_TIME = 0.088000
2019-07-16 02:55:18 -06:00
HALF_SCAN_TIME = 0.044000
2019-07-15 10:28:23 -06:00
SYNC_PULSE = 0.009000
SYNC_PORCH = 0.003000
SEP_PULSE = 0.004500
SEP_PORCH = 0.001500
CHAN_COUNT = 2
2019-07-15 10:55:57 -06:00
CHAN_SYNC = 0
2019-07-15 10:28:23 -06:00
CHAN_TIME = SEP_PULSE + SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME + SEP_PORCH )
2019-07-16 02:55:18 -06:00
LINE_TIME = CHAN_OFFSETS [ 1 ] + HALF_SCAN_TIME
2019-07-15 10:28:23 -06:00
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
2019-07-16 02:55:18 -06:00
HALF_PIXEL_TIME = HALF_SCAN_TIME / LINE_WIDTH
2019-07-16 00:37:32 -06:00
WINDOW_FACTOR = 7.70
2019-07-15 10:28:23 -06:00
2019-07-15 10:55:57 -06:00
HAS_START_SYNC = False
2019-07-16 02:55:18 -06:00
HAS_HALF_SCAN = True
HAS_ALT_SCAN = True
class R72 ( R36 ) :
NAME = " Robot 72 "
LINE_WIDTH = 320
SCAN_TIME = 0.138000
HALF_SCAN_TIME = 0.069000
SYNC_PULSE = 0.009000
SYNC_PORCH = 0.003000
SEP_PULSE = 0.004500
SEP_PORCH = 0.001500
CHAN_COUNT = 3
CHAN_TIME = SEP_PULSE + SCAN_TIME
HALF_CHAN_TIME = SEP_PULSE + HALF_SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME + SEP_PORCH )
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 1 ] + HALF_CHAN_TIME + SEP_PORCH )
LINE_TIME = CHAN_OFFSETS [ 2 ] + HALF_SCAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
HALF_PIXEL_TIME = HALF_SCAN_TIME / LINE_WIDTH
WINDOW_FACTOR = 4.88
HAS_ALT_SCAN = False
2019-07-15 10:55:57 -06:00
2019-12-28 19:56:12 -07:00
# http://www.classicsstv.com/pdmodes.php
# Mode Pixel Line Sync Porch Frame(secs) Resolution VIS VIS+P
# PD120 190 508480 20000 2080 126.103040 640 x 496 95 95
# The line times are for a complete "double" line, comprising sync + porch + Y0 + R-Y + B-Y + Y1. Please note that there are no pulses or porches between the four components.
# Transmission time 126.1 seconds
# Color scan times 121.600ms
# from qsstv
# // name shortName mode imagetime Pix Dis Txl VIS sync fp bp blank synctx fptx bptx blanktx
# "PD120" ,"PD120", PD120, 126.11150,640,496,248,0x5F ,0.02000,0.00000,0.00208,0.00000,0.02000,0.00000,0.00230,0.00000,0.,1900,400
2019-12-28 17:21:30 -07:00
class PD120 ( object ) :
NAME = " PD-120 "
COLOR = COL_FMT . YUV
LINE_WIDTH = 640
LINE_COUNT = 496
SCAN_TIME = 0.121600
2019-12-28 19:56:12 -07:00
HALF_SCAN_TIME = 0.060800
2019-12-28 17:21:30 -07:00
SYNC_PULSE = 0.020000
SYNC_PORCH = 0.002080
SEP_PULSE = 0.000000
SEP_PORCH = 0.001500
CHAN_COUNT = 3
2019-12-28 20:05:33 -07:00
CHAN_SYNC = 0
2019-12-28 17:21:30 -07:00
CHAN_TIME = SEP_PULSE + SCAN_TIME
HALF_CHAN_TIME = SEP_PULSE + HALF_SCAN_TIME
CHAN_OFFSETS = [ SYNC_PULSE + SYNC_PORCH ]
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 0 ] + CHAN_TIME + SEP_PORCH )
CHAN_OFFSETS . append ( CHAN_OFFSETS [ 1 ] + HALF_CHAN_TIME + SEP_PORCH )
LINE_TIME = SYNC_PULSE + 3 * CHAN_TIME
PIXEL_TIME = SCAN_TIME / LINE_WIDTH
2019-12-28 19:56:12 -07:00
HALF_PIXEL_TIME = HALF_SCAN_TIME / LINE_WIDTH
WINDOW_FACTOR = 10
2019-12-28 17:21:30 -07:00
HAS_START_SYNC = True
HAS_HALF_SCAN = False
HAS_ALT_SCAN = False
2019-07-15 10:28:23 -06:00
2019-07-16 01:35:53 -06:00
VIS_MAP = { 8 : R36 ,
2019-07-16 02:55:18 -06:00
12 : R72 ,
2019-07-16 01:35:53 -06:00
40 : M2 ,
44 : M1 ,
56 : S2 ,
60 : S1 ,
2019-12-28 17:21:30 -07:00
76 : SDX ,
95 : PD120 }
2019-07-15 10:55:57 -06:00
BREAK_OFFSET = 0.300
LEADER_OFFSET = 0.010 + BREAK_OFFSET
VIS_START_OFFSET = 0.300 + LEADER_OFFSET
HDR_SIZE = 0.030 + VIS_START_OFFSET
HDR_WINDOW_SIZE = 0.010
VIS_BIT_SIZE = 0.030