summaryrefslogtreecommitdiff
path: root/src/encoder.c
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2019-01-09 00:08:57 +0200
committerrimio <vasi.vilvoiu@gmail.com>2019-01-09 00:08:57 +0200
commit45753482e99ec37d9cab0d898f7b75d64f658a3c (patch)
tree5ec45bde04095e345cad6306c0091b90f4b03364 /src/encoder.c
parent85acad49b42bf3734249dae13429a26395a68a03 (diff)
VIS code
Diffstat (limited to 'src/encoder.c')
-rw-r--r--src/encoder.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/encoder.c b/src/encoder.c
index ecee41f..57b6ad5 100644
--- a/src/encoder.c
+++ b/src/encoder.c
@@ -20,9 +20,22 @@
*/
typedef enum {
SSTV_ENCODER_STATE_START,
+
SSTV_ENCODER_STATE_LEADER_TONE_1,
SSTV_ENCODER_STATE_BREAK,
SSTV_ENCODER_STATE_LEADER_TONE_2,
+
+ SSTV_ENCODER_STATE_VIS_START_BIT = 99,
+ SSTV_ENCODER_STATE_VIS_BIT0 = 100,
+ SSTV_ENCODER_STATE_VIS_BIT1 = 101,
+ SSTV_ENCODER_STATE_VIS_BIT2 = 102,
+ SSTV_ENCODER_STATE_VIS_BIT3 = 103,
+ SSTV_ENCODER_STATE_VIS_BIT4 = 104,
+ SSTV_ENCODER_STATE_VIS_BIT5 = 105,
+ SSTV_ENCODER_STATE_VIS_BIT6 = 106,
+ SSTV_ENCODER_STATE_VIS_BIT7 = 107,
+ SSTV_ENCODER_STATE_VIS_STOP_BIT,
+
SSTV_ENCODER_STATE_END
} sstv_encoder_state_t;
@@ -184,6 +197,35 @@ sstv_encode_state_change(sstv_encoder_context_t *context)
return SSTV_OK;
}
+ /* VIS start bit */
+ if (context->state == SSTV_ENCODER_STATE_LEADER_TONE_2) {
+ context->state = SSTV_ENCODER_STATE_VIS_START_BIT;
+ context->fsk.phase_delta = DPHASE_FROM_FREQ(1200, context->sample_rate);
+ context->fsk.remaining_samples = REMAINING_SAMPLES_US(30000, context->sample_rate);
+ return SSTV_OK;
+ }
+
+ /* VIS bits */
+ if ((context->state >= SSTV_ENCODER_STATE_VIS_START_BIT)
+ && (context->state < SSTV_ENCODER_STATE_VIS_BIT7))
+ {
+ uint8_t visp = sstv_get_visp_code(context->mode);
+ uint8_t bit = visp >> (context->state - SSTV_ENCODER_STATE_VIS_START_BIT) & 0x1;
+
+ context->state ++;
+ context->fsk.phase_delta = DPHASE_FROM_FREQ((bit ? 1100 : 1300), context->sample_rate);
+ context->fsk.remaining_samples = REMAINING_SAMPLES_US(30000, context->sample_rate);
+ return SSTV_OK;
+ }
+
+ /* VIS stop bit */
+ if (context->state == SSTV_ENCODER_STATE_VIS_BIT7) {
+ context->state = SSTV_ENCODER_STATE_VIS_STOP_BIT;
+ context->fsk.phase_delta = DPHASE_FROM_FREQ(1200, context->sample_rate);
+ context->fsk.remaining_samples = REMAINING_SAMPLES_US(30000, context->sample_rate);
+ return SSTV_OK;
+ }
+
/* debug */
context->state = SSTV_ENCODER_STATE_END;
return SSTV_OK;
@@ -244,6 +286,10 @@ sstv_encode(void *ctx, sstv_signal_t *signal)
case SSTV_SAMPLE_INT8:
((int8_t *)signal->buffer)[signal->count] = SSTV_SIN_INT10_INT8[context->fsk.phase >> 6];
break;
+
+ case SSTV_SAMPLE_UINT8:
+ ((uint8_t *)signal->buffer)[signal->count] = SSTV_SIN_INT10_UINT8[context->fsk.phase >> 6];
+ break;
case SSTV_SAMPLE_INT16:
((int16_t *)signal->buffer)[signal->count] = SSTV_SIN_INT10_INT16[context->fsk.phase >> 6];