log-e-audioc/daisy/scope/osclsk.hpp

120 lines
2.2 KiB
C++

#ifndef _OSCILLOSK_HPP
#define _OSCILLOSK_HPP
#include "daisy.h"
#include "tft.hpp"
using namespace daisy;
#define OSCLSK_SCREEN_XSZ ILI9341_TFTHEIGHT
#define OSCLSK_SCREEN_YSZ ILI9341_TFTWIDTH
#define OSCLSK_RATE_DIV 16
#define OSCLSK_LKB_AMOUNT 10
#define OSCLSK_BLOCK_LEN OSCLSK_SCREEN_XSZ
#define OSCLSK_TRIG_LOOKBACK 0x100u
#define OSCLSK_TFT_CMD_BUF_NSPLIT 4
#define OSCLSK_CMDS_LEN 8 * OSCLSK_SCREEN_XSZ
struct osclsk_scope {
enum class osc_cc {
FOREGROUND,
BACKGROUND
};
enum class osc_state {
INIT,
TRIGGER,
SAMPLE,
SAMPLE_DONE,
RENDER,
RENDER_DONE,
READY
};
enum class osc_trig_mode {
RISING_EDGE,
FALLING_EDGE,
ABS_THRESHOLD,
INSTANT
};
enum class osc_trig_state {
INIT,
READY,
NO_TRIG,
TRIG,
TRIGGERED
};
volatile osc_state st;
float block_y_max[OSCLSK_BLOCK_LEN];
float block_y_min[OSCLSK_BLOCK_LEN];
size_t block_fill;
int block_fill_nsamp;
float trig_lkb_y_max[OSCLSK_TRIG_LOOKBACK];
float trig_lkb_y_min[OSCLSK_TRIG_LOOKBACK];
size_t trig_lkb_idx;
int trig_lkb_idx_nsamp;
size_t trig_lkb_num;
size_t trig_lkb_amount;
float trig_margin;
size_t trig_num;
size_t trig_num_req;
osc_trig_state trig_state;
osc_trig_mode trig_mode;
uint16_t rate_div;
tft_color fg, bg;
tft_driver_ili9341 tft;
uint16_t screen_px_y_max[OSCLSK_SCREEN_XSZ];
uint16_t screen_px_y_min[OSCLSK_SCREEN_XSZ];
size_t render_idx;
osclsk_scope(void) : st(osc_state::INIT),
block_fill(0), block_fill_nsamp(0),
trig_lkb_idx(0), trig_lkb_idx_nsamp(0),
trig_lkb_amount(OSCLSK_LKB_AMOUNT),
trig_margin(.01f), trig_num(0),
trig_num_req(2),
trig_state(osc_trig_state::INIT),
trig_mode(osc_trig_mode::INSTANT),
render_idx(0) {};
int init(uint8_t *dma_buf, size_t dma_sz);
int init_block(void);
int init_screen(void);
osc_state state(void);
void set_color(osc_cc which, const tft_color *to_what);
void sample(const float *sig, size_t num);
void sample_trigger(const float *sig, size_t num);
int wait_ready(int ms);
int prep(void);
int trig(void);
bool is_triggering(float sample);
void trig_lkb_wr_block(void);
int render_block(void);
static void render_finish_tft_cb(void *ctx);
};
#endif /* _OSCILLOSK_HPP */