summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrimio <vasi.vilvoiu@gmail.com>2019-01-09 00:30:12 +0200
committerrimio <vasi.vilvoiu@gmail.com>2019-01-09 00:30:12 +0200
commitdcc04103eca47554f6bd673b21e07afd5b8fbcfe (patch)
treef7df057af82d3ddcdfe9622db704e95d0acc9374
parent45753482e99ec37d9cab0d898f7b75d64f658a3c (diff)
Add extra state values
-rw-r--r--src/encoder.c34
-rw-r--r--src/tools/sstv-encode.cpp2
2 files changed, 19 insertions, 17 deletions
diff --git a/src/encoder.c b/src/encoder.c
index 57b6ad5..29abbe9 100644
--- a/src/encoder.c
+++ b/src/encoder.c
@@ -25,15 +25,8 @@ typedef enum {
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_START_BIT,
+ SSTV_ENCODER_STATE_VIS_BIT,
SSTV_ENCODER_STATE_VIS_STOP_BIT,
SSTV_ENCODER_STATE_END
@@ -59,6 +52,14 @@ typedef struct {
uint16_t phase_delta;
size_t remaining_samples;
} fsk;
+
+ /* state extra info */
+ union {
+ struct {
+ uint8_t visp;
+ uint8_t curr_bit;
+ } vis;
+ } extra;
} sstv_encoder_context_t;
/*
@@ -202,24 +203,25 @@ sstv_encode_state_change(sstv_encoder_context_t *context)
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);
+ context->extra.vis.visp = sstv_get_visp_code(context->mode);
+ context->extra.vis.curr_bit = 0;
return SSTV_OK;
}
/* VIS bits */
- if ((context->state >= SSTV_ENCODER_STATE_VIS_START_BIT)
- && (context->state < SSTV_ENCODER_STATE_VIS_BIT7))
+ if (context->state == SSTV_ENCODER_STATE_VIS_START_BIT
+ || (context->state == SSTV_ENCODER_STATE_VIS_BIT && context->extra.vis.curr_bit <= 7))
{
- uint8_t visp = sstv_get_visp_code(context->mode);
- uint8_t bit = visp >> (context->state - SSTV_ENCODER_STATE_VIS_START_BIT) & 0x1;
-
- context->state ++;
+ uint8_t bit = (context->extra.vis.visp >> context->extra.vis.curr_bit) & 0x1;
+ context->state = SSTV_ENCODER_STATE_VIS_BIT;
+ context->extra.vis.curr_bit ++;
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) {
+ if (context->state == SSTV_ENCODER_STATE_VIS_BIT) {
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);
diff --git a/src/tools/sstv-encode.cpp b/src/tools/sstv-encode.cpp
index 4ffd6c7..0b79e69 100644
--- a/src/tools/sstv-encode.cpp
+++ b/src/tools/sstv-encode.cpp
@@ -60,7 +60,7 @@ int main(int argc, char **argv)
}
/* create a sample buffer for output */
- uint8_t samp_buffer[128 * 1024];
+ int16_t samp_buffer[128 * 1024];
sstv_signal_t signal;
if (sstv_pack_signal(&signal, SSTV_SAMPLE_INT16, 128 * 1024, samp_buffer) != SSTV_OK) {
LOG(FATAL) << "sstv_pack_signal() failed";