libsstvenc
Asynchronous Analogue SSTV encoder
Loading...
Searching...
No Matches
Transmission Sequencer
Collaboration diagram for Transmission Sequencer:

Topics

 Transmission sequencer states
 
 Sequencer step types.
 
 Sequencer registers.
 
 Tone slopes
 

Data Structures

struct  sstvenc_sequencer
 
union  sstvenc_sequencer::sstvenc_sequencer_vars
 
struct  sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence
 
struct  sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone
 
struct  sstvenc_sequencer_step
 
union  sstvenc_sequencer_step::sstvenc_sequence_step_args
 
struct  sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit
 
struct  sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg
 
struct  sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration
 
struct  sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw
 
struct  sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image
 

Typedefs

typedef void sstvenc_sequencer_event_cb(struct sstvenc_sequencer *const enc)
 

Functions

void sstvenc_sequencer_step_set_timescale (struct sstvenc_sequencer_step *const step, uint8_t time_unit, _Bool convert)
 
void sstvenc_sequencer_step_set_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_inc_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_dec_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_mul_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_div_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_idec_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_idiv_reg (struct sstvenc_sequencer_step *const step, uint8_t reg, double value)
 
void sstvenc_sequencer_step_silence (struct sstvenc_sequencer_step *const step, double duration)
 
void sstvenc_sequencer_step_tone (struct sstvenc_sequencer_step *const step, double duration, uint8_t slopes)
 
void sstvenc_sequencer_step_cw (struct sstvenc_sequencer_step *const step, const char *text)
 
void sstvenc_sequencer_step_image (struct sstvenc_sequencer_step *const step, const struct sstvenc_mode *const mode, const uint8_t *framebuffer, const char *fsk_id)
 
void sstvenc_sequencer_step_end (struct sstvenc_sequencer_step *const step)
 
void sstvenc_sequencer_init (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *steps, sstvenc_sequencer_event_cb *event_cb, const void *event_cb_ctx, uint32_t sample_rate)
 
void sstvenc_sequencer_reset (struct sstvenc_sequencer *const seq)
 
void sstvenc_sequencer_advance (struct sstvenc_sequencer *const seq)
 
void sstvenc_sequencer_compute (struct sstvenc_sequencer *const seq)
 
size_t sstvenc_sequencer_fill_buffer (struct sstvenc_sequencer *const seq, double *buffer, size_t buffer_sz)
 
static void sstvenc_sequencer_step_update_reg (struct sstvenc_sequencer_step *const step, uint8_t type, uint8_t reg, double value)
 
static void sstvenc_sequencer_step_duration (struct sstvenc_sequencer_step *const step, uint8_t type, double duration)
 
static void sstvenc_sequencer_next_step (struct sstvenc_sequencer *const seq, _Bool notify)
 
static void sstvenc_sequencer_next_state (struct sstvenc_sequencer *const seq, uint8_t state, _Bool notify)
 
static void sstvenc_sequencer_exec_set_ts (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_exec_update_reg (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_begin_silence (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_begin_tone (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_begin_cw (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_begin_image (struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
 
static void sstvenc_sequencer_end (struct sstvenc_sequencer *const seq)
 
static void sstvenc_sequencer_exec_step (struct sstvenc_sequencer *const seq)
 

Variables

const struct sstvenc_sequencer_stepsstvenc_sequencer::steps
 
sstvenc_sequencer_event_cbsstvenc_sequencer::event_cb
 
const void * sstvenc_sequencer::event_cb_ctx
 
double sstvenc_sequencer::output
 
uint32_t sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence::remaining
 
struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence sstvenc_sequencer::sstvenc_sequencer_vars::silence
 
struct sstvenc_oscillator sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::osc
 
struct sstvenc_pulseshape sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::ps
 
struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone sstvenc_sequencer::sstvenc_sequencer_vars::tone
 
struct sstvenc_cw_mod sstvenc_sequencer::sstvenc_sequencer_vars::cw
 
struct sstvenc_mod sstvenc_sequencer::sstvenc_sequencer_vars::sstv
 
union sstvenc_sequencer::sstvenc_sequencer_vars sstvenc_sequencer::vars
 
double sstvenc_sequencer::regs [SSTVENC_SEQ_NUM_REGS]
 
uint32_t sstvenc_sequencer::sample_rate
 
uint16_t sstvenc_sequencer::step
 
uint8_t sstvenc_sequencer::time_unit
 
uint8_t sstvenc_sequencer::state
 
uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::time_unit
 
_Bool sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::convert
 
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit sstvenc_sequencer_step::sstvenc_sequence_step_args::ts
 
double sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::value
 
uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::reg
 
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg sstvenc_sequencer_step::sstvenc_sequence_step_args::reg
 
double sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::duration
 
uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::slopes
 
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration sstvenc_sequencer_step::sstvenc_sequence_step_args::duration
 
const char * sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw::text
 
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw sstvenc_sequencer_step::sstvenc_sequence_step_args::cw
 
const struct sstvenc_modesstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::mode
 
const uint8_t * sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::framebuffer
 
const char * sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::fsk_id
 
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image sstvenc_sequencer_step::sstvenc_sequence_step_args::image
 
union sstvenc_sequencer_step::sstvenc_sequence_step_args sstvenc_sequencer_step::args
 
uint8_t sstvenc_sequencer_step::type
 

Detailed Description

This module aids in combining a SSTV (or in fact, multiple if desired) with arbitrary tone generation and the CW modulator to enable adding of CW IDs to meet regulatory requirements and to enable triggering of VOX circuits or SSTV repeaters.


Data Structure Documentation

◆ sstvenc_sequencer

struct sstvenc_sequencer

SSTV transmission sequencer data structure. This stores a record of the sequence being transmitted and the current step.

Definition at line 333 of file sequence.h.

Collaboration diagram for sstvenc_sequencer:
Data Fields
sstvenc_sequencer_event_cb * event_cb

Event call-back, called on each state transition

const void * event_cb_ctx

Optional event callback context

double output

Output sample

double regs[SSTVENC_SEQ_NUM_REGS]

SSTV sequencer register parameters. The indices are

uint32_t sample_rate

Sample rate in hertz.

uint8_t state

Sequencer state machine state, see Transmission sequencer states

uint16_t step

The current step being executed. This is an index into sstvenc_sequencer::steps.

const struct sstvenc_sequencer_step * steps

The list of sequence steps to be carried out.

uint8_t time_unit

Time scale unit of measure

union sstvenc_sequencer_vars vars

◆ sstvenc_sequencer::sstvenc_sequencer_vars

union sstvenc_sequencer::sstvenc_sequencer_vars

Sequencer state machine variables

Definition at line 347 of file sequence.h.

Collaboration diagram for sstvenc_sequencer::sstvenc_sequencer_vars:
Data Fields
struct sstvenc_cw_mod cw

State machine for CW transmission states.

struct sstvenc_sequencer_vars_silence silence
struct sstvenc_mod sstv

State machine for SSTV transmission states.

struct sstvenc_sequencer_vars_tone tone

◆ sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence

struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence

State machine logic for the "silence" states.

Definition at line 351 of file sequence.h.

Collaboration diagram for sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence:
Data Fields
uint32_t remaining

Number of samples remaining of silence

◆ sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone

struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone

State machine for tone states.

Definition at line 359 of file sequence.h.

Collaboration diagram for sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone:
Data Fields
struct sstvenc_oscillator osc

Oscillator state machine

struct sstvenc_pulseshape ps

Pulse Shaper state machine

◆ sstvenc_sequencer_step

struct sstvenc_sequencer_step

A sequencer step is a single instruction. Some instructions alter the current state of the state machine, others just adjust parameters.

Definition at line 404 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step:
Data Fields
union sstvenc_sequence_step_args args
uint8_t type

The type of sequencer step. See Sequencer step types.

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args

union sstvenc_sequencer_step::sstvenc_sequence_step_args

Definition at line 405 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args:
Data Fields
struct sstvenc_sequence_step_cw cw
struct sstvenc_sequence_step_duration duration
struct sstvenc_sequence_step_image image
struct sstvenc_sequence_step_set_reg reg
struct sstvenc_sequence_step_set_ts_unit ts

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit

struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit

Setting of the time-scale unit. sstvenc_sequencer_step::type is set to SSTVENC_SEQ_STEP_TYPE_SET_TS_UNIT.

Definition at line 410 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit:
Data Fields
_Bool convert

Convert fields to the new unit?

uint8_t time_unit

The new time-scale unit

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg

struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg
Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg:
Data Fields
uint8_t reg

The register being updated

double value

The new register value / operand value

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration

struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration

Emit silence or a tone for the specified time period. sstvenc_sequencer_step::type is set to one of:

Definition at line 443 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration:
Data Fields
double duration

The number of time units (set by sstvenc_sequencer_regs#time_unit) that we should be emitting silence or a tone for. Set to INFINITY for an infinite time period.

uint8_t slopes

Slopes enabled. Whether or not we enable the rising or falling slopes on the pulse. Not used for silences.

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw

struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw

Send a CW message. sstvenc_sequencer_step::type is set to SSTVENC_SEQ_STEP_TYPE_EMIT_CW.

Definition at line 463 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw:
Data Fields
const char * text

The CW string to emit

◆ sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image

struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image

Send a SSTV image. sstvenc_sequencer_step::type is set to SSTVENC_SEQ_STEP_TYPE_EMIT_IMAGE.

Definition at line 472 of file sequence.h.

Collaboration diagram for sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image:
Data Fields
const uint8_t * framebuffer

The image framebuffer

const char * fsk_id

The FSK ID

const struct sstvenc_mode * mode

The SSTV image mode to use for transmission

Typedef Documentation

◆ sstvenc_sequencer_event_cb

typedef void sstvenc_sequencer_event_cb(struct sstvenc_sequencer *const enc)

Callback routine for sequencer events. This is called at the start of each sequencer step, and finally at the end. The callback should not block the state machine for lengthy periods as this will cause delays in the transmission.

Definition at line 327 of file sequence.h.

Function Documentation

◆ sstvenc_sequencer_advance()

void sstvenc_sequencer_advance ( struct sstvenc_sequencer *const seq)

Advance the state of the state machine when generating infinite tones or silence. This does nothing unless the state machine is in one of the following states:

Definition at line 373 of file sequence.c.

373 {
374 switch (seq->state) {
379 break;
382 break;
383 default:
384 return;
385 }
386}
void sstvenc_ps_advance(struct sstvenc_pulseshape *const ps)
Definition pulseshape.c:56
#define SSTVENC_SEQ_STATE_END_SILENCE
Definition sequence.h:79
#define SSTVENC_SEQ_STATE_GEN_INF_SILENCE
Definition sequence.h:67
#define SSTVENC_SEQ_STATE_GEN_INF_TONE
Definition sequence.h:104
union sstvenc_sequencer::sstvenc_sequencer_vars vars
static void sstvenc_sequencer_next_state(struct sstvenc_sequencer *const seq, uint8_t state, _Bool notify)
Definition sequence.c:152
struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone tone
static void sstvenc_sequencer_next_step(struct sstvenc_sequencer *const seq, _Bool notify)
Definition sequence.c:139

References sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::ps, sstvenc_ps_advance(), SSTVENC_SEQ_STATE_END_SILENCE, SSTVENC_SEQ_STATE_GEN_INF_SILENCE, SSTVENC_SEQ_STATE_GEN_INF_TONE, sstvenc_sequencer_next_state(), sstvenc_sequencer_next_step(), sstvenc_sequencer::state, sstvenc_sequencer::sstvenc_sequencer_vars::tone, and sstvenc_sequencer::vars.

Here is the call graph for this function:

◆ sstvenc_sequencer_begin_cw()

static void sstvenc_sequencer_begin_cw ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Definition at line 289 of file sequence.c.

290 {
292
293 sstvenc_cw_init(&(seq->vars.cw), step->args.cw.text,
298 seq->sample_rate, seq->time_unit);
299
301}
void sstvenc_cw_init(struct sstvenc_cw_mod *const cw, const char *text, double amplitude, double frequency, double dit_period, double slope_period, uint32_t sample_rate, uint8_t time_unit)
Definition cw.c:312
#define SSTVENC_SEQ_REG_DIT_PERIOD
Definition sequence.h:290
#define SSTVENC_SEQ_REG_FREQUENCY
Definition sequence.h:270
#define SSTVENC_SEQ_REG_AMPLITUDE
Definition sequence.h:265
#define SSTVENC_SEQ_REG_PULSE_RISE
Definition sequence.h:280
#define SSTVENC_SEQ_STATE_BEGIN_CW
Definition sequence.h:122
#define SSTVENC_SEQ_STATE_GEN_CW
Definition sequence.h:129
uint32_t sample_rate
Definition sequence.h:385
uint8_t time_unit
Definition sequence.h:394
union sstvenc_sequencer_step::sstvenc_sequence_step_args args
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw cw
double regs[SSTVENC_SEQ_NUM_REGS]
Definition sequence.h:380

References sstvenc_sequencer_step::args, sstvenc_sequencer::sstvenc_sequencer_vars::cw, sstvenc_sequencer_step::sstvenc_sequence_step_args::cw, sstvenc_sequencer::regs, sstvenc_sequencer::sample_rate, sstvenc_cw_init(), SSTVENC_SEQ_REG_AMPLITUDE, SSTVENC_SEQ_REG_DIT_PERIOD, SSTVENC_SEQ_REG_FREQUENCY, SSTVENC_SEQ_REG_PULSE_RISE, SSTVENC_SEQ_STATE_BEGIN_CW, SSTVENC_SEQ_STATE_GEN_CW, sstvenc_sequencer_next_state(), sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw::text, sstvenc_sequencer::time_unit, and sstvenc_sequencer::vars.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_begin_image()

static void sstvenc_sequencer_begin_image ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Definition at line 303 of file sequence.c.

305 {
307 true);
308
310 step->args.image.fsk_id,
311 step->args.image.framebuffer,
314 seq->sample_rate, seq->time_unit);
316
318}
#define SSTVENC_SEQ_STATE_GEN_IMAGE
Definition sequence.h:154
#define SSTVENC_SEQ_STATE_BEGIN_IMAGE
Definition sequence.h:147
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image image
struct sstvenc_pulseshape ps
Definition sstvmod.h:44
void sstvenc_modulator_init(struct sstvenc_mod *const mod, const struct sstvenc_mode *mode, const char *fsk_id, const uint8_t *framebuffer, double rise_time, double fall_time, uint32_t sample_rate, uint8_t time_unit)
Definition sstvmod.c:14

References sstvenc_pulseshape::amplitude, sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::framebuffer, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::fsk_id, sstvenc_sequencer_step::sstvenc_sequence_step_args::image, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::mode, sstvenc_mod::ps, sstvenc_sequencer::regs, sstvenc_sequencer::sample_rate, sstvenc_sequencer::sstvenc_sequencer_vars::sstv, sstvenc_modulator_init(), SSTVENC_SEQ_REG_AMPLITUDE, SSTVENC_SEQ_REG_DIT_PERIOD, SSTVENC_SEQ_REG_PULSE_RISE, SSTVENC_SEQ_STATE_BEGIN_IMAGE, SSTVENC_SEQ_STATE_GEN_IMAGE, sstvenc_sequencer_next_state(), sstvenc_sequencer::time_unit, and sstvenc_sequencer::vars.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_begin_silence()

static void sstvenc_sequencer_begin_silence ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Initialise the state machine for a run of silence.

Definition at line 231 of file sequence.c.

233 {
235 true);
236
237 if (step->args.duration.duration == INFINITY) {
240 } else {
242 step->args.duration.duration, seq->sample_rate,
243 seq->time_unit);
246 }
247}
#define SSTVENC_SEQ_STATE_GEN_SILENCE
Definition sequence.h:60
#define SSTVENC_SEQ_STATE_BEGIN_SILENCE
Definition sequence.h:53
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration duration
struct sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence silence
uint32_t sstvenc_ts_unit_to_samples(double time, uint32_t sample_rate, uint8_t unit)
Definition timescale.c:46

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::duration, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::duration, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence::remaining, sstvenc_sequencer::sample_rate, sstvenc_sequencer::sstvenc_sequencer_vars::silence, SSTVENC_SEQ_STATE_BEGIN_SILENCE, SSTVENC_SEQ_STATE_GEN_INF_SILENCE, SSTVENC_SEQ_STATE_GEN_SILENCE, sstvenc_sequencer_next_state(), sstvenc_ts_unit_to_samples(), sstvenc_sequencer::time_unit, and sstvenc_sequencer::vars.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_begin_tone()

static void sstvenc_sequencer_begin_tone ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Definition at line 249 of file sequence.c.

251 {
252 _Bool init_osc = seq->state != SSTVENC_SEQ_STATE_END_TONE;
254 true);
255
260 : 0.0,
261 step->args.duration.duration,
264 : 0.0,
265 seq->sample_rate, seq->time_unit);
266
267 if (init_osc) {
268 sstvenc_osc_init(&(seq->vars.tone.osc), 0.0,
271 seq->sample_rate);
272 } else {
274 &(seq->vars.tone.osc),
277 }
278
279 if (step->args.duration.duration == INFINITY) {
282 } else {
284 true);
285 }
286}
void sstvenc_osc_init(struct sstvenc_oscillator *const osc, double amplitude, double frequency, double offset, uint32_t sample_rate)
Definition oscillator.c:42
void sstvenc_osc_set_frequency(struct sstvenc_oscillator *const osc, double frequency)
Definition oscillator.c:33
void sstvenc_ps_init(struct sstvenc_pulseshape *const ps, double amplitude, double rise_time, double hold_time, double fall_time, uint32_t sample_rate, uint8_t time_unit)
Definition pulseshape.c:28
#define SSTVENC_SEQ_REG_PULSE_FALL
Definition sequence.h:285
#define SSTVENC_SEQ_REG_PHASE
Definition sequence.h:275
#define SSTVENC_SEQ_STATE_END_TONE
Definition sequence.h:115
#define SSTVENC_SEQ_STATE_GEN_TONE
Definition sequence.h:95
#define SSTVENC_SEQ_SLOPE_RISING
Definition sequence.h:310
#define SSTVENC_SEQ_SLOPE_FALLING
Definition sequence.h:311

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::duration, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::duration, sstvenc_oscillator::offset, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::osc, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::ps, sstvenc_sequencer::regs, sstvenc_sequencer::sample_rate, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::slopes, sstvenc_osc_init(), sstvenc_osc_set_frequency(), sstvenc_ps_init(), SSTVENC_SEQ_REG_AMPLITUDE, SSTVENC_SEQ_REG_FREQUENCY, SSTVENC_SEQ_REG_PHASE, SSTVENC_SEQ_REG_PULSE_FALL, SSTVENC_SEQ_REG_PULSE_RISE, SSTVENC_SEQ_SLOPE_FALLING, SSTVENC_SEQ_SLOPE_RISING, SSTVENC_SEQ_STATE_BEGIN_SILENCE, SSTVENC_SEQ_STATE_END_TONE, SSTVENC_SEQ_STATE_GEN_INF_TONE, SSTVENC_SEQ_STATE_GEN_TONE, sstvenc_sequencer_next_state(), sstvenc_sequencer::state, sstvenc_sequencer::time_unit, sstvenc_sequencer::sstvenc_sequencer_vars::tone, and sstvenc_sequencer::vars.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_compute()

void sstvenc_sequencer_compute ( struct sstvenc_sequencer *const seq)

Compute the next sample to be emitted by the sequencer. The result will be stored in sstvenc_sequencer::output.

This should be called until sstvenc_sequencer::state reaches the value SSTVENC_SEQ_STATE_DONE.

Definition at line 388 of file sequence.c.

388 {
389retry:
390 switch (seq->state) {
397 goto retry;
398 break;
402 seq->output = 0.0;
403 if (seq->vars.silence.remaining > 0) {
404 seq->vars.silence.remaining--;
405 } else {
408 goto retry;
409 }
410 break;
415 seq->vars.tone.osc.amplitude = seq->vars.tone.ps.output;
417 seq->output = seq->vars.tone.osc.output;
418
419 if (seq->vars.tone.ps.phase >= SSTVENC_PS_PHASE_DONE) {
421 seq, SSTVENC_SEQ_STATE_END_TONE, true);
422 goto retry;
423 }
424 break;
427 sstvenc_cw_compute(&(seq->vars.cw));
428 seq->output = seq->vars.cw.output;
429
432 seq, SSTVENC_SEQ_STATE_END_CW, true);
433 goto retry;
434 }
435 break;
439 seq->output = seq->vars.sstv.osc.output;
440
441 if (seq->vars.sstv.ps.phase >= SSTVENC_PS_PHASE_DONE) {
443 seq, SSTVENC_SEQ_STATE_END_IMAGE, true);
444 goto retry;
445 }
446 break;
448 default:
449 break;
450 }
451}
#define SSTVENC_CW_MOD_STATE_DONE
Definition cw.h:91
double output
Definition cw.h:114
uint8_t state
Definition cw.h:142
void sstvenc_cw_compute(struct sstvenc_cw_mod *const cw)
Definition cw.c:507
void sstvenc_osc_compute(struct sstvenc_oscillator *const osc)
Definition oscillator.c:52
#define SSTVENC_PS_PHASE_DONE
Definition pulseshape.h:75
void sstvenc_ps_compute(struct sstvenc_pulseshape *const ps)
Definition pulseshape.c:63
#define SSTVENC_SEQ_STATE_END_CW
Definition sequence.h:140
#define SSTVENC_SEQ_STATE_INIT
Definition sequence.h:45
#define SSTVENC_SEQ_STATE_END_IMAGE
Definition sequence.h:165
#define SSTVENC_SEQ_STATE_DONE
Definition sequence.h:170
#define SSTVENC_SEQ_STATE_BEGIN_TONE
Definition sequence.h:87
static void sstvenc_sequencer_exec_step(struct sstvenc_sequencer *const seq)
Definition sequence.c:327
struct sstvenc_oscillator osc
Definition sstvmod.h:42
void sstvenc_modulator_compute(struct sstvenc_mod *const mod)
Definition sstvmod.c:125

References sstvenc_oscillator::amplitude, sstvenc_sequencer::sstvenc_sequencer_vars::cw, sstvenc_mod::osc, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::osc, sstvenc_cw_mod::output, sstvenc_oscillator::output, sstvenc_pulseshape::output, sstvenc_sequencer::output, sstvenc_pulseshape::phase, sstvenc_mod::ps, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::ps, sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence::remaining, sstvenc_sequencer::sstvenc_sequencer_vars::silence, sstvenc_sequencer::sstvenc_sequencer_vars::sstv, sstvenc_cw_compute(), SSTVENC_CW_MOD_STATE_DONE, sstvenc_modulator_compute(), sstvenc_osc_compute(), sstvenc_ps_compute(), SSTVENC_PS_PHASE_DONE, SSTVENC_SEQ_STATE_BEGIN_CW, SSTVENC_SEQ_STATE_BEGIN_IMAGE, SSTVENC_SEQ_STATE_BEGIN_SILENCE, SSTVENC_SEQ_STATE_BEGIN_TONE, SSTVENC_SEQ_STATE_DONE, SSTVENC_SEQ_STATE_END_CW, SSTVENC_SEQ_STATE_END_IMAGE, SSTVENC_SEQ_STATE_END_SILENCE, SSTVENC_SEQ_STATE_END_TONE, SSTVENC_SEQ_STATE_GEN_CW, SSTVENC_SEQ_STATE_GEN_IMAGE, SSTVENC_SEQ_STATE_GEN_INF_SILENCE, SSTVENC_SEQ_STATE_GEN_INF_TONE, SSTVENC_SEQ_STATE_GEN_SILENCE, SSTVENC_SEQ_STATE_GEN_TONE, SSTVENC_SEQ_STATE_INIT, sstvenc_sequencer_exec_step(), sstvenc_sequencer_next_state(), sstvenc_cw_mod::state, sstvenc_sequencer::state, sstvenc_sequencer::sstvenc_sequencer_vars::tone, and sstvenc_sequencer::vars.

Referenced by sstvenc_sequencer_fill_buffer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_end()

static void sstvenc_sequencer_end ( struct sstvenc_sequencer *const seq)
static

Definition at line 320 of file sequence.c.

References SSTVENC_SEQ_STATE_DONE, and sstvenc_sequencer_next_state().

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_exec_set_ts()

static void sstvenc_sequencer_exec_set_ts ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Execute a SET_TS instruction.

Definition at line 166 of file sequence.c.

168 {
169 /* Perform conversions if asked */
170 if (step->args.ts.convert) {
171 const uint64_t old_scale
173 const uint64_t new_scale
175 double scale = (double)new_scale / (double)old_scale;
176
177 for (uint8_t reg = 0; reg < SSTVENC_SEQ_NUM_REGS; reg++) {
178 seq->regs[reg] *= scale;
179 }
180 }
181
182 /* Apply new unit setting */
183 seq->time_unit = step->args.ts.time_unit;
184
185 /* Step is complete */
187}
#define SSTVENC_SEQ_NUM_REGS
Definition sequence.h:295
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit ts
uint64_t sstvenc_ts_unit_scale(uint8_t unit)
Definition timescale.c:22

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::convert, sstvenc_sequencer::regs, SSTVENC_SEQ_NUM_REGS, sstvenc_sequencer_next_step(), sstvenc_ts_unit_scale(), sstvenc_sequencer::time_unit, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::time_unit, and sstvenc_sequencer_step::sstvenc_sequence_step_args::ts.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_exec_step()

static void sstvenc_sequencer_exec_step ( struct sstvenc_sequencer *const seq)
static

Execute the step pointed to by sstvenc_sequencer::step.

Definition at line 327 of file sequence.c.

327 {
328 const struct sstvenc_sequencer_step* step = &(seq->steps[seq->step]);
329 switch (step->type) {
332 break;
341 break;
344 break;
347 break;
350 break;
353 break;
355 default:
357 break;
358 }
359}
#define SSTVENC_SEQ_STEP_TYPE_DIV_REGISTER
Definition sequence.h:220
#define SSTVENC_SEQ_STEP_TYPE_EMIT_IMAGE
Definition sequence.h:251
#define SSTVENC_SEQ_STEP_TYPE_SET_REGISTER
Definition sequence.h:200
#define SSTVENC_SEQ_STEP_TYPE_DEC_REGISTER
Definition sequence.h:210
#define SSTVENC_SEQ_STEP_TYPE_END
Definition sequence.h:190
#define SSTVENC_SEQ_STEP_TYPE_IDEC_REGISTER
Definition sequence.h:226
#define SSTVENC_SEQ_STEP_TYPE_SET_TS_UNIT
Definition sequence.h:195
#define SSTVENC_SEQ_STEP_TYPE_INC_REGISTER
Definition sequence.h:205
#define SSTVENC_SEQ_STEP_TYPE_MUL_REGISTER
Definition sequence.h:215
#define SSTVENC_SEQ_STEP_TYPE_IDIV_REGISTER
Definition sequence.h:231
#define SSTVENC_SEQ_STEP_TYPE_EMIT_SILENCE
Definition sequence.h:236
#define SSTVENC_SEQ_STEP_TYPE_EMIT_TONE
Definition sequence.h:241
#define SSTVENC_SEQ_STEP_TYPE_EMIT_CW
Definition sequence.h:246
static void sstvenc_sequencer_begin_image(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:303
static void sstvenc_sequencer_begin_cw(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:289
static void sstvenc_sequencer_end(struct sstvenc_sequencer *const seq)
Definition sequence.c:320
const struct sstvenc_sequencer_step * steps
Definition sequence.h:335
static void sstvenc_sequencer_exec_set_ts(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:166
static void sstvenc_sequencer_exec_update_reg(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:192
static void sstvenc_sequencer_begin_silence(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:231
static void sstvenc_sequencer_begin_tone(struct sstvenc_sequencer *const seq, const struct sstvenc_sequencer_step *const step)
Definition sequence.c:249

References SSTVENC_SEQ_STEP_TYPE_DEC_REGISTER, SSTVENC_SEQ_STEP_TYPE_DIV_REGISTER, SSTVENC_SEQ_STEP_TYPE_EMIT_CW, SSTVENC_SEQ_STEP_TYPE_EMIT_IMAGE, SSTVENC_SEQ_STEP_TYPE_EMIT_SILENCE, SSTVENC_SEQ_STEP_TYPE_EMIT_TONE, SSTVENC_SEQ_STEP_TYPE_END, SSTVENC_SEQ_STEP_TYPE_IDEC_REGISTER, SSTVENC_SEQ_STEP_TYPE_IDIV_REGISTER, SSTVENC_SEQ_STEP_TYPE_INC_REGISTER, SSTVENC_SEQ_STEP_TYPE_MUL_REGISTER, SSTVENC_SEQ_STEP_TYPE_SET_REGISTER, SSTVENC_SEQ_STEP_TYPE_SET_TS_UNIT, sstvenc_sequencer_begin_cw(), sstvenc_sequencer_begin_image(), sstvenc_sequencer_begin_silence(), sstvenc_sequencer_begin_tone(), sstvenc_sequencer_end(), sstvenc_sequencer_exec_set_ts(), sstvenc_sequencer_exec_update_reg(), sstvenc_sequencer::step, sstvenc_sequencer::steps, and sstvenc_sequencer_step::type.

Referenced by sstvenc_sequencer_compute().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_exec_update_reg()

static void sstvenc_sequencer_exec_update_reg ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step *const step )
static

Execute a register manipulation instruction.

Definition at line 192 of file sequence.c.

194 {
195 if (step->args.reg.reg < SSTVENC_SEQ_NUM_REGS) {
196 /* Get a pointer to the register for convenience */
197 double* const value = &(seq->regs[step->args.reg.reg]);
198
199 switch (step->type) {
201 *value = step->args.reg.value;
202 break;
204 *value += step->args.reg.value;
205 break;
207 *value -= step->args.reg.value;
208 break;
210 *value *= step->args.reg.value;
211 break;
213 *value /= step->args.reg.value;
214 break;
216 *value = step->args.reg.value - *value;
217 break;
219 *value = step->args.reg.value / *value;
220 break;
221 }
222 }
223
224 /* Step is complete */
226}
struct sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg reg

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::reg, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::reg, sstvenc_sequencer::regs, SSTVENC_SEQ_NUM_REGS, SSTVENC_SEQ_STEP_TYPE_DEC_REGISTER, SSTVENC_SEQ_STEP_TYPE_DIV_REGISTER, SSTVENC_SEQ_STEP_TYPE_IDEC_REGISTER, SSTVENC_SEQ_STEP_TYPE_IDIV_REGISTER, SSTVENC_SEQ_STEP_TYPE_INC_REGISTER, SSTVENC_SEQ_STEP_TYPE_MUL_REGISTER, SSTVENC_SEQ_STEP_TYPE_SET_REGISTER, sstvenc_sequencer_next_step(), sstvenc_sequencer_step::type, and sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::value.

Referenced by sstvenc_sequencer_exec_step().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sstvenc_sequencer_fill_buffer()

size_t sstvenc_sequencer_fill_buffer ( struct sstvenc_sequencer *const seq,
double * buffer,
size_t buffer_sz )

Fill the given buffer with audio samples from the sequencer. Stop if we run out of buffer space or if the sequencer state machine finishes. Return the number of samples generated.

Parameters
[in,out]seqSequencer state machine to pull samples from.
[out]bufferAudio buffer to write samples to.
[in]buffer_szSize of the audio buffer in samples.
Returns
Number of samples written to buffer

Definition at line 453 of file sequence.c.

454 {
455 size_t written_sz = 0;
456
457 while ((buffer_sz > 0) && (seq->state < SSTVENC_SEQ_STATE_DONE)) {
459
460 buffer[0] = seq->output;
461 buffer++;
462 buffer_sz--;
463
464 written_sz++;
465 }
466
467 return written_sz;
468}
void sstvenc_sequencer_compute(struct sstvenc_sequencer *const seq)
Definition sequence.c:388

References sstvenc_sequencer::output, SSTVENC_SEQ_STATE_DONE, sstvenc_sequencer_compute(), and sstvenc_sequencer::state.

Here is the call graph for this function:

◆ sstvenc_sequencer_init()

void sstvenc_sequencer_init ( struct sstvenc_sequencer *const seq,
const struct sstvenc_sequencer_step * steps,
sstvenc_sequencer_event_cb * event_cb,
const void * event_cb_ctx,
uint32_t sample_rate )

Initialise the sequencer with the given sequencer steps.

Parameters
[in,out]seqSequencer to initialise
[in]stepsSequencer steps, the last step MUST have sstvenc_sequence_step#type set to SSTVENC_SEQ_STEP_TYPE_END.
[in]event_cbOptional event callback, set to NULL for no callback.
[in]event_cb_ctxOptional event callback context.
[in]sample_rateSample rate in hertz.

Definition at line 125 of file sequence.c.

128 {
129 seq->steps = steps;
130 seq->event_cb = event_cb;
131 seq->event_cb_ctx = event_cb_ctx;
133}
sstvenc_sequencer_event_cb * event_cb
Definition sequence.h:338
const void * event_cb_ctx
Definition sequence.h:341
void sstvenc_sequencer_reset(struct sstvenc_sequencer *const seq)
Definition sequence.c:361

References sstvenc_sequencer::event_cb, sstvenc_sequencer::event_cb_ctx, sstvenc_sequencer_reset(), and sstvenc_sequencer::steps.

Here is the call graph for this function:

◆ sstvenc_sequencer_next_state()

static void sstvenc_sequencer_next_state ( struct sstvenc_sequencer *const seq,
uint8_t state,
_Bool notify )
static

Enter a new state in the state machine. Optionally call the callback routine if it is defined.

Definition at line 152 of file sequence.c.

153 {
154 if (seq->state != state) {
155 seq->state = state;
156
157 if (notify && seq->event_cb) {
158 seq->event_cb(seq);
159 }
160 }
161}

References sstvenc_sequencer::event_cb, and sstvenc_sequencer::state.

Referenced by sstvenc_sequencer_advance(), sstvenc_sequencer_begin_cw(), sstvenc_sequencer_begin_image(), sstvenc_sequencer_begin_silence(), sstvenc_sequencer_begin_tone(), sstvenc_sequencer_compute(), and sstvenc_sequencer_end().

Here is the caller graph for this function:

◆ sstvenc_sequencer_next_step()

static void sstvenc_sequencer_next_step ( struct sstvenc_sequencer *const seq,
_Bool notify )
static

Advance to the next step in the sequence. Optionally call the callback routine if it is defined.

Definition at line 139 of file sequence.c.

140 {
141 seq->step++;
142
143 if (notify && seq->event_cb) {
144 seq->event_cb(seq);
145 }
146}

References sstvenc_sequencer::event_cb, and sstvenc_sequencer::step.

Referenced by sstvenc_sequencer_advance(), sstvenc_sequencer_exec_set_ts(), and sstvenc_sequencer_exec_update_reg().

Here is the caller graph for this function:

◆ sstvenc_sequencer_reset()

void sstvenc_sequencer_reset ( struct sstvenc_sequencer *const seq)

◆ sstvenc_sequencer_step_cw()

void sstvenc_sequencer_step_cw ( struct sstvenc_sequencer_step *const step,
const char * text )

Configure a step that emits CW text.

Parameters
[out]stepSequencer step
[in]textThe CW text to emit.

Definition at line 105 of file sequence.c.

106 {
108 step->args.cw.text = text;
109}

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::cw, SSTVENC_SEQ_STEP_TYPE_EMIT_CW, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw::text, and sstvenc_sequencer_step::type.

◆ sstvenc_sequencer_step_dec_reg()

void sstvenc_sequencer_step_dec_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to old_value - value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to subtract from the register

Definition at line 49 of file sequence.c.

50 {
52 step, SSTVENC_SEQ_STEP_TYPE_DEC_REGISTER, reg, value);
53}
static void sstvenc_sequencer_step_update_reg(struct sstvenc_sequencer_step *const step, uint8_t type, uint8_t reg, double value)
Definition sequence.c:30

References SSTVENC_SEQ_STEP_TYPE_DEC_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_div_reg()

void sstvenc_sequencer_step_div_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to old_value / value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to divide the register value by

Definition at line 61 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_DIV_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_duration()

static void sstvenc_sequencer_step_duration ( struct sstvenc_sequencer_step *const step,
uint8_t type,
double duration )
static

Configure a sequencer step that sets up an operation for a given duration.

Parameters
[out]stepSequencer step
[in]durationOperation duration

Definition at line 86 of file sequence.c.

87 {
88 step->type = type;
89 step->args.duration.duration = duration;
90}

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::duration, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::duration, and sstvenc_sequencer_step::type.

Referenced by sstvenc_sequencer_step_silence(), and sstvenc_sequencer_step_tone().

Here is the caller graph for this function:

◆ sstvenc_sequencer_step_end()

void sstvenc_sequencer_step_end ( struct sstvenc_sequencer_step *const step)

Configure the final step in the sequence.

Parameters
[out]stepSequencer step

Definition at line 121 of file sequence.c.

121 {
123}

References SSTVENC_SEQ_STEP_TYPE_END, and sstvenc_sequencer_step::type.

◆ sstvenc_sequencer_step_idec_reg()

void sstvenc_sequencer_step_idec_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to value - old_value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to add to the register value

Definition at line 67 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_IDEC_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_idiv_reg()

void sstvenc_sequencer_step_idiv_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to value / old_value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to subtract from the register

Definition at line 73 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_IDIV_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_image()

void sstvenc_sequencer_step_image ( struct sstvenc_sequencer_step *const step,
const struct sstvenc_mode *const mode,
const uint8_t * framebuffer,
const char * fsk_id )

Configure a step that emits a SSTV image.

Parameters
[out]stepSequencer step
[in]modeThe SSTV mode to use.
[in]framebufferThe framebuffer containing the SSTV image. The image must be in the correct colourspace format and dimensions for the SSTV mode selected.

Definition at line 111 of file sequence.c.

114 {
116 step->args.image.mode = mode;
117 step->args.image.framebuffer = framebuffer;
118 step->args.image.fsk_id = fsk_id;
119}

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::framebuffer, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::fsk_id, sstvenc_sequencer_step::sstvenc_sequence_step_args::image, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::mode, SSTVENC_SEQ_STEP_TYPE_EMIT_IMAGE, and sstvenc_sequencer_step::type.

◆ sstvenc_sequencer_step_inc_reg()

void sstvenc_sequencer_step_inc_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to old_value + value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to add to the register value

Definition at line 43 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_INC_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_mul_reg()

void sstvenc_sequencer_step_mul_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets the register to old_value * value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueAmount to multiply the register value by

Definition at line 55 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_MUL_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_set_reg()

void sstvenc_sequencer_step_set_reg ( struct sstvenc_sequencer_step *const step,
uint8_t reg,
double value )

Configure a step that sets a register to a new value.

Parameters
[out]stepSequencer step
[in]regRegister to adjust (see Sequencer registers.)
[in]valueNew register value

Definition at line 37 of file sequence.c.

References SSTVENC_SEQ_STEP_TYPE_SET_REGISTER, and sstvenc_sequencer_step_update_reg().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_set_timescale()

void sstvenc_sequencer_step_set_timescale ( struct sstvenc_sequencer_step *const step,
uint8_t time_unit,
_Bool convert )

Configure a step that sets the timescale unit.

Parameters
[out]stepSequencer step
[in]time_unitTimescale unit
[in]convertConvert existing registers?

Definition at line 13 of file sequence.c.

15 {
17 step->args.ts.time_unit = time_unit;
18 step->args.ts.convert = convert;
19}

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::convert, SSTVENC_SEQ_STEP_TYPE_SET_TS_UNIT, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::time_unit, sstvenc_sequencer_step::sstvenc_sequence_step_args::ts, and sstvenc_sequencer_step::type.

◆ sstvenc_sequencer_step_silence()

void sstvenc_sequencer_step_silence ( struct sstvenc_sequencer_step *const step,
double duration )

Configure a step that emits silence.

Parameters
[out]stepSequencer step
[in]durationThe length of time to emit silence. Use INFINITY for indefinite time periods.

Definition at line 92 of file sequence.c.

93 {
96}
static void sstvenc_sequencer_step_duration(struct sstvenc_sequencer_step *const step, uint8_t type, double duration)
Definition sequence.c:86

References SSTVENC_SEQ_STEP_TYPE_EMIT_SILENCE, and sstvenc_sequencer_step_duration().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_tone()

void sstvenc_sequencer_step_tone ( struct sstvenc_sequencer_step *const step,
double duration,
uint8_t slopes )

Configure a step that emits a tone. The frequency and phase information is set by whatever frequency is configured in the frequency register.

Parameters
[out]stepSequencer step
[in]durationThe length of time to emit a tone. Use INFINITY for indefinite time
[in]slopesWhich slopes to enable (see Tone slopes) periods.

Definition at line 98 of file sequence.c.

99 {
101 duration);
102 step->args.duration.slopes = slopes;
103}

References sstvenc_sequencer_step::args, sstvenc_sequencer_step::sstvenc_sequence_step_args::duration, sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::slopes, SSTVENC_SEQ_STEP_TYPE_EMIT_TONE, and sstvenc_sequencer_step_duration().

Here is the call graph for this function:

◆ sstvenc_sequencer_step_update_reg()

static void sstvenc_sequencer_step_update_reg ( struct sstvenc_sequencer_step *const step,
uint8_t type,
uint8_t reg,
double value )
static

Variable Documentation

◆ args

◆ convert

_Bool sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::convert

Convert fields to the new unit?

Definition at line 414 of file sequence.h.

Referenced by sstvenc_sequencer_exec_set_ts(), and sstvenc_sequencer_step_set_timescale().

◆ cw [1/2]

struct sstvenc_cw_mod sstvenc_sequencer::sstvenc_sequencer_vars::cw

State machine for CW transmission states.

Definition at line 369 of file sequence.h.

Referenced by sstvenc_sequencer_begin_cw(), and sstvenc_sequencer_compute().

◆ cw [2/2]

◆ duration [1/2]

◆ duration [2/2]

double sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::duration

The number of time units (set by sstvenc_sequencer_regs#time_unit) that we should be emitting silence or a tone for. Set to INFINITY for an infinite time period.

Definition at line 450 of file sequence.h.

Referenced by sstvenc_sequencer_begin_silence(), sstvenc_sequencer_begin_tone(), and sstvenc_sequencer_step_duration().

◆ event_cb

sstvenc_sequencer_event_cb* sstvenc_sequencer::event_cb

Event call-back, called on each state transition

Definition at line 338 of file sequence.h.

Referenced by sstvenc_sequencer_init(), sstvenc_sequencer_next_state(), and sstvenc_sequencer_next_step().

◆ event_cb_ctx

const void* sstvenc_sequencer::event_cb_ctx

Optional event callback context

Definition at line 341 of file sequence.h.

Referenced by sstvenc_sequencer_init().

◆ framebuffer

const uint8_t* sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::framebuffer

The image framebuffer

Definition at line 476 of file sequence.h.

Referenced by sstvenc_sequencer_begin_image(), and sstvenc_sequencer_step_image().

◆ fsk_id

const char* sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::fsk_id

The FSK ID

Definition at line 478 of file sequence.h.

Referenced by sstvenc_sequencer_begin_image(), and sstvenc_sequencer_step_image().

◆ image

◆ mode

const struct sstvenc_mode* sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_image::mode

The SSTV image mode to use for transmission

Definition at line 474 of file sequence.h.

Referenced by sstvenc_sequencer_begin_image(), and sstvenc_sequencer_step_image().

◆ osc

struct sstvenc_oscillator sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::osc

Oscillator state machine

Definition at line 361 of file sequence.h.

Referenced by sstvenc_sequencer_begin_tone(), and sstvenc_sequencer_compute().

◆ output

double sstvenc_sequencer::output

Output sample

Definition at line 344 of file sequence.h.

Referenced by sstvenc_sequencer_compute(), and sstvenc_sequencer_fill_buffer().

◆ ps

struct sstvenc_pulseshape sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_tone::ps

Pulse Shaper state machine

Definition at line 363 of file sequence.h.

Referenced by sstvenc_sequencer_advance(), sstvenc_sequencer_begin_tone(), and sstvenc_sequencer_compute().

◆ reg [1/2]

◆ reg [2/2]

uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::reg

The register being updated

Definition at line 433 of file sequence.h.

Referenced by sstvenc_sequencer_exec_update_reg(), and sstvenc_sequencer_step_update_reg().

◆ regs

double sstvenc_sequencer::regs[SSTVENC_SEQ_NUM_REGS]

◆ remaining

uint32_t sstvenc_sequencer::sstvenc_sequencer_vars::sstvenc_sequencer_vars_silence::remaining

Number of samples remaining of silence

Definition at line 353 of file sequence.h.

Referenced by sstvenc_sequencer_begin_silence(), and sstvenc_sequencer_compute().

◆ sample_rate

uint32_t sstvenc_sequencer::sample_rate

◆ silence

◆ slopes

uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_duration::slopes

Slopes enabled. Whether or not we enable the rising or falling slopes on the pulse. Not used for silences.

Definition at line 456 of file sequence.h.

Referenced by sstvenc_sequencer_begin_tone(), and sstvenc_sequencer_step_tone().

◆ sstv

struct sstvenc_mod sstvenc_sequencer::sstvenc_sequencer_vars::sstv

State machine for SSTV transmission states.

Definition at line 374 of file sequence.h.

Referenced by sstvenc_sequencer_begin_image(), and sstvenc_sequencer_compute().

◆ state

◆ step

uint16_t sstvenc_sequencer::step

The current step being executed. This is an index into sstvenc_sequencer::steps.

Definition at line 391 of file sequence.h.

Referenced by sstvenc_sequencer_exec_step(), sstvenc_sequencer_next_step(), and sstvenc_sequencer_reset().

◆ steps

const struct sstvenc_sequencer_step* sstvenc_sequencer::steps

The list of sequence steps to be carried out.

Definition at line 335 of file sequence.h.

Referenced by sstvenc_sequencer_exec_step(), and sstvenc_sequencer_init().

◆ text

const char* sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_cw::text

The CW string to emit

Definition at line 465 of file sequence.h.

Referenced by sstvenc_sequencer_begin_cw(), and sstvenc_sequencer_step_cw().

◆ time_unit [1/2]

◆ time_unit [2/2]

uint8_t sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_ts_unit::time_unit

The new time-scale unit

Definition at line 412 of file sequence.h.

Referenced by sstvenc_sequencer_exec_set_ts(), and sstvenc_sequencer_step_set_timescale().

◆ tone

◆ ts

◆ type

◆ value

double sstvenc_sequencer_step::sstvenc_sequence_step_args::sstvenc_sequence_step_set_reg::value

The new register value / operand value

Definition at line 431 of file sequence.h.

Referenced by sstvenc_sequencer_exec_update_reg(), and sstvenc_sequencer_step_update_reg().

◆ vars