diff options
| author | rimio <vasi.vilvoiu@gmail.com> | 2019-01-09 00:08:57 +0200 |
|---|---|---|
| committer | rimio <vasi.vilvoiu@gmail.com> | 2019-01-09 00:08:57 +0200 |
| commit | 45753482e99ec37d9cab0d898f7b75d64f658a3c (patch) | |
| tree | 5ec45bde04095e345cad6306c0091b90f4b03364 /src/encoder.c | |
| parent | 85acad49b42bf3734249dae13429a26395a68a03 (diff) | |
VIS code
Diffstat (limited to 'src/encoder.c')
| -rw-r--r-- | src/encoder.c | 46 |
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]; |
