27#define SSTVENC_VIS_BIT_START1 (0)
30#define SSTVENC_VIS_BIT_START2 (1)
33#define SSTVENC_VIS_BIT_START3 (2)
36#define SSTVENC_VIS_BIT_START4 (3)
42#define SSTVENC_VIS_BIT_DATA1 (4)
48#define SSTVENC_VIS_BIT_DATA2 (5)
54#define SSTVENC_VIS_BIT_DATA3 (6)
60#define SSTVENC_VIS_BIT_DATA4 (7)
66#define SSTVENC_VIS_BIT_DATA5 (8)
72#define SSTVENC_VIS_BIT_DATA6 (9)
78#define SSTVENC_VIS_BIT_DATA7 (10)
84#define SSTVENC_VIS_BIT_PARITY (11)
89#define SSTVENC_VIS_BIT_STOP (12)
94#define SSTVENC_VIS_BIT_END (13)
108#define SSTVENC_ENCODER_SCAN_SEGMENT_FRONTPORCH (0)
113#define SSTVENC_ENCODER_SCAN_SEGMENT_CH0 (1)
118#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP01 (2)
123#define SSTVENC_ENCODER_SCAN_SEGMENT_CH1 (3)
128#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP12 (4)
133#define SSTVENC_ENCODER_SCAN_SEGMENT_CH2 (5)
138#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP23 (6)
143#define SSTVENC_ENCODER_SCAN_SEGMENT_CH3 (7)
149#define SSTVENC_ENCODER_SCAN_SEGMENT_BACKPORCH (8)
154#define SSTVENC_ENCODER_SCAN_SEGMENT_NEXT (9)
255 uint8_t segment, uint8_t ch);
266 uint8_t next_segment);
387 printf(
"%s: entering phase 0x%02x\n", __func__, phase);
394 const uint8_t* framebuffer) {
408 printf(
"%s: empty sequence\n", __func__);
412 printf(
"%s: calling on_done callback\n", __func__);
419 printf(
"%s: begin sequence %p\n", __func__, (
void*)seq);
431 printf(
"%s: returning pulse at %p\n", __func__, (
void*)pulse);
436 printf(
"%s: end of pulse sequence, calling callback\n",
445 printf(
"%s: end of pulse sequence, no callback\n", __func__);
455 printf(
"%s: begin sending VIS header\n", __func__);
474 for (uint8_t i = 0; i < 8; i++) {
480 if ((ones % 2) == 1) {
492 printf(
"%s: VIS header start bit 1\n", __func__);
497 return &(enc->
pulse);
500 printf(
"%s: VIS header start bit 2\n", __func__);
505 return &(enc->
pulse);
508 printf(
"%s: VIS header start bit 3\n", __func__);
513 return &(enc->
pulse);
516 printf(
"%s: VIS header start bit 4\n", __func__);
521 return &(enc->
pulse);
530 printf(
"%s: VIS header data bit\n", __func__);
535 return &(enc->
pulse);
538 printf(
"%s: VIS header parity bit\n", __func__);
543 return &(enc->
pulse);
546 printf(
"%s: VIS header stop bit\n", __func__);
551 return &(enc->
pulse);
554 printf(
"%s: VIS header is finished\n", __func__);
564 printf(
"%s: initial sequence done\n", __func__);
571 printf(
"%s: begin image scan\n", __func__);
581 printf(
"%s: begin row %u\n", __func__, enc->
vars.
scan.
y);
587 uint8_t segment, uint8_t ch) {
589 printf(
"%s: begin row %u channel %u\n", __func__, enc->
vars.
scan.
y,
599 printf(
"%s: %" PRIu32
" ns per pixel\n", __func__,
619 const uint16_t row_length = 3 * enc->
mode->
width;
673 return &(enc->
pulse);
679 printf(
"%s: begin row %u front porch\n", __func__, enc->
vars.
scan.
y);
688 printf(
"%s: begin row %u gap 0/1\n", __func__, enc->
vars.
scan.
y);
697 printf(
"%s: begin row %u gap 1/2\n", __func__, enc->
vars.
scan.
y);
706 printf(
"%s: begin row %u gap 2/3\n", __func__, enc->
vars.
scan.
y);
716 printf(
"%s: begin row %u back porch\n", __func__, enc->
vars.
scan.
y);
724 uint8_t next_segment) {
726 printf(
"%s: entering segment 0x%02x\n", __func__, next_segment);
734 printf(
"%s: end of final image sequence\n", __func__);
747 printf(
"%s: front porch pulse = %p (*, %u)\n", __func__,
759 printf(
"%s: ch0 pulse = %p (%u, %u)\n", __func__,
770 printf(
"%s: gap 0/1 pulse = %p (*, %u)\n", __func__,
782 printf(
"%s: ch1 pulse = %p (%u, %u)\n", __func__,
793 printf(
"%s: gap 1/2 pulse = %p (*, %u)\n", __func__,
805 printf(
"%s: ch2 pulse = %p (%u, %u)\n", __func__,
816 printf(
"%s: gap 2/3 pulse = %p (*, %u)\n", __func__,
830 printf(
"%s: ch3 pulse = %p (%u, %u)\n", __func__,
840 printf(
"%s: back porch pulse = %p (*, %u)\n", __func__,
845 printf(
"%s: back porch pulse = %p\n", __func__, (
void*)pulse);
853 printf(
"%s: end of scan line\n", __func__);
865 printf(
"%s: YUV2 increment two rows\n", __func__);
871 printf(
"%s: increment single row\n", __func__);
879 printf(
"%s: repeat for row %u\n", __func__, enc->
vars.
scan.
y);
887 printf(
"%s: end of image\n", __func__);
892#define SSTVENC_ENCODER_FSK_SEGMENT_BEGIN (0)
893#define SSTVENC_ENCODER_FSK_SEGMENT_PREAMBLE (1)
894#define SSTVENC_ENCODER_FSK_SEGMENT_ID (2)
895#define SSTVENC_ENCODER_FSK_SEGMENT_TAIL (3)
896#define SSTVENC_ENCODER_FSK_SEGMENT_DONE (4)
904 printf(
"%s: load FSK preamble\n", __func__);
917 printf(
"%s: preamble byte 0x%02x\n", __func__,
927 printf(
"%s: end of preamble, load FSK ID byte 0\n",
935 printf(
"%s: FSK ID byte %u = 0x%02x\n", __func__,
945 printf(
"%s: end of FSK ID, load FSK TAIL byte 0\n",
958 printf(
"%s: FSK TAIL byte %u = 0x%02x\n", __func__,
967 printf(
"%s: end of FSK TAIL\n", __func__);
983 printf(
"%s: initialise FSK state\n", __func__);
989 printf(
"%s: no FSK defined\n", __func__);
999 printf(
"%s: end of FSK byte\n", __func__);
1008 printf(
"%s: end of FSK\n", __func__);
1016 printf(
"%s: FSK bit value 1\n", __func__);
1021 printf(
"%s: FSK bit value 0\n", __func__);
1028 return &(enc->
pulse);
1034 switch (enc->
phase) {
1037 printf(
"%s: initialise encoder\n", __func__);
1043 printf(
"%s: next VIS pulse\n", __func__);
1055 printf(
"%s: end of VIS\n", __func__);
1066 printf(
"%s: end of init sequence\n", __func__);
1079 printf(
"%s: end of image scan\n", __func__);
1088 printf(
"%s: end of final sequence\n", __func__);
1098 printf(
"%s: end of FSK ID\n", __func__);
#define SSTVENC_CSO_CH_NONE
#define SSTVENC_CSO_CH_Y2
#define SSTVENC_CSO_MODE_YUV2
#define SSTVENC_MODE_GET_CH(n, mode)
#define SSTVENC_CSO_MASK_MODE
#define SSTVENC_ENCODER_PHASE_INIT
#define SSTVENC_ENCODER_PHASE_FINALSEQ
#define SSTVENC_ENCODER_PHASE_VIS
#define SSTVENC_ENCODER_PHASE_INITSEQ
#define SSTVENC_ENCODER_PHASE_DONE
#define SSTVENC_ENCODER_PHASE_SCAN
#define SSTVENC_ENCODER_PHASE_FSK
#define SSTVENC_ENCODER_SCAN_SEGMENT_CH0
#define SSTVENC_ENCODER_SCAN_SEGMENT_FRONTPORCH
#define SSTVENC_ENCODER_SCAN_SEGMENT_BACKPORCH
#define SSTVENC_ENCODER_SCAN_SEGMENT_NEXT
#define SSTVENC_ENCODER_SCAN_SEGMENT_CH3
#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP23
#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP01
#define SSTVENC_ENCODER_SCAN_SEGMENT_CH1
#define SSTVENC_ENCODER_SCAN_SEGMENT_CH2
#define SSTVENC_ENCODER_SCAN_SEGMENT_GAP12
#define SSTVENC_VIS_BIT_START1
#define SSTVENC_VIS_BIT_DATA6
#define SSTVENC_VIS_BIT_DATA4
#define SSTVENC_VIS_BIT_DATA3
#define SSTVENC_VIS_BIT_START4
#define SSTVENC_VIS_BIT_START3
#define SSTVENC_VIS_BIT_DATA7
#define SSTVENC_VIS_BIT_DATA2
#define SSTVENC_VIS_BIT_DATA1
#define SSTVENC_VIS_BIT_PARITY
#define SSTVENC_VIS_BIT_START2
#define SSTVENC_VIS_BIT_DATA5
#define SSTVENC_VIS_BIT_STOP
const uint8_t * framebuffer
static const struct sstvenc_encoder_pulse * sstvenc_encoder_next_vis_pulse(struct sstvenc_encoder *const enc)
static const struct sstvenc_encoder_pulse * sstvenc_encoder_next_image_pulse(struct sstvenc_encoder *const enc)
const struct sstvenc_mode * mode
static void sstvenc_encoder_begin_gap23(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_frontporch(struct sstvenc_encoder *const enc)
static const struct sstvenc_encoder_pulse * sstvenc_encoder_next_fsk_pulse(struct sstvenc_encoder *const enc)
static const struct sstvenc_encoder_pulse * sstvenc_encoder_next_seq_pulse(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_on_initseq_done(struct sstvenc_encoder *const enc)
static uint32_t sstvenc_encoder_vis_data_freq(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_on_finalseq_done(struct sstvenc_encoder *const enc)
static uint32_t sstvenc_encoder_vis_parity_freq(struct sstvenc_encoder *const enc)
#define SSTVENC_ENCODER_FSK_SEGMENT_PREAMBLE
struct sstvenc_encoder::sstvenc_encoder_phase_data::sstvenc_encoder_phase_scan_data scan
#define SSTVENC_ENCODER_FSK_SEGMENT_TAIL
static void sstvenc_encoder_begin_scanline(struct sstvenc_encoder *const enc)
void sstvenc_encoder_callback(struct sstvenc_encoder *const enc)
struct sstvenc_encoder::sstvenc_encoder_phase_data::sstvenc_encoder_phase_fsk_data fsk
struct sstvenc_encoder_pulse pulse
sstvenc_encoder_callback * seq_done_cb
#define SSTVENC_ENCODER_FSK_SEGMENT_BEGIN
static void sstvenc_encoder_next_scan_seg(struct sstvenc_encoder *const enc, uint8_t next_segment)
static void sstvenc_encoder_begin_channel(struct sstvenc_encoder *const enc, uint8_t segment, uint8_t ch)
void sstvenc_encoder_init(struct sstvenc_encoder *const enc, const struct sstvenc_mode *mode, const char *fsk_id, const uint8_t *framebuffer)
static void sstvenc_encoder_fsk_load_next(struct sstvenc_encoder *const enc)
#define SSTVENC_ENCODER_FSK_SEGMENT_DONE
const struct sstvenc_encoder_pulse * seq
static void sstvenc_encoder_new_phase(struct sstvenc_encoder *const enc, uint8_t phase)
static void sstvenc_encoder_begin_fsk(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_vis(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_gap01(struct sstvenc_encoder *const enc)
static const uint8_t sstvenc_encoder_fsk_tail[]
#define SSTVENC_ENCODER_FSK_SEGMENT_ID
static const struct sstvenc_encoder_pulse * sstvenc_encoder_next_channel_pulse(struct sstvenc_encoder *const enc, uint8_t ch)
static void sstvenc_encoder_begin_seq(struct sstvenc_encoder *const enc, const struct sstvenc_encoder_pulse *seq, sstvenc_encoder_callback *on_done)
static const uint8_t sstvenc_encoder_fsk_preamble[]
struct sstvenc_encoder::sstvenc_encoder_phase_data::sstvenc_encoder_phase_vis_data vis
const struct sstvenc_encoder_pulse * sstvenc_encoder_next_pulse(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_gap12(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_backporch(struct sstvenc_encoder *const enc)
static void sstvenc_encoder_begin_image(struct sstvenc_encoder *const enc)
union sstvenc_encoder::sstvenc_encoder_phase_data vars
#define SSTVENC_FREQ_VIS_BIT1
#define SSTVENC_FREQ_VIS_BIT0
uint16_t sstvenc_level_freq(uint8_t level)
#define SSTVENC_FREQ_FSKID_BIT1
#define SSTVENC_FREQ_VIS_START
#define SSTVENC_FREQ_SYNC
#define SSTVENC_FREQ_FSKID_BIT0
const struct sstvenc_encoder_pulse * gap01
const struct sstvenc_encoder_pulse * backporch
const struct sstvenc_encoder_pulse * finalseq
const struct sstvenc_encoder_pulse * gap23
const struct sstvenc_encoder_pulse * gap12
uint16_t colour_space_order
const struct sstvenc_encoder_pulse * frontporch
const struct sstvenc_encoder_pulse * initseq
uint32_t scanline_period_ns[4]
#define SSTVENC_PERIOD_FSKID_BIT
#define SSTVENC_PERIOD_VIS_SYNC
#define SSTVENC_PERIOD_VIS_BIT
#define SSTVENC_PERIOD_VIS_START
uint32_t sstvenc_get_pixel_posn(const struct sstvenc_mode *const mode, uint16_t x, uint16_t y)