src/display.h

Sat, 07 Nov 2020 19:23:21 +0100

author
David Douard <david.douard@sdf3.org>
date
Sat, 07 Nov 2020 19:23:21 +0100
changeset 47
11c57010e4f9
parent 46
a4a007b3c42e
child 51
d8042bff0e00
permissions
-rw-r--r--

Attempt to improve the detection of packet collisions (not fixed yet)

#ifndef DISPLAY_H
#define DISPLAY_H

#include "Terminal6x8.h"
#include "Mono19x27.h"
#include "Mono15x22.h"
#include "Arial12x12.h"
#include "SSD1322.h"
#include "hp34comm.h"

//typedef enum {
#define FMT_ASCII  0x01
#define FMT_HEX    0x02
#define FMT_BITS   0x04
#define FMT_FLAGS  0x08
#define FMT_IGNORE 0x80
	//} dsp_format_t;


typedef struct _DSP
{
	uint8_t cmd;
	uint8_t color;
	uint8_t bgcolor;
	uint8_t x0;
	uint8_t y0;
	uint8_t fmt; // 0x01=>ascii, 0x02=>hex, 0x04=>bits, 0x08=>flags, 0x80=>ignore
	uint8_t maxsize;
	uint8_t width;
	const unsigned char* font;
	char buffer[MAX_BUFF+1];
} DSP;



static DSP table[] =
{       // cmd,  fg, bg,  x0, y0,       fmt,  maxsize, width, font
		{ 0x00, 0xF, 0x0,  0,  0, FMT_ASCII, MAX_BUFF, 245, Mono19x27}, // main display
		{ 0x0C, 0xF, 0x0,196, 34, FMT_ASCII, 3,        45,  Mono15x22}, // channels display
		{ 0x0A, 0xF, 0x0,  0, 57, FMT_FLAGS, 4,        0, Terminal6x8}, // flags + bits
};

// 9x10
const unsigned char icon_alarm[] __attribute__((aligned (2))) =
{
		0x1c, 0x0,
		0x3e, 0x0,
		0x7f, 0x0,
		0x7f, 0x0,
		0x7f, 0x0,
		0x7f, 0x0,
		0x7f, 0x0,
		0x7f, 0x0,
		0xff, 0x80,
		0x10, 0x0
};

const unsigned char icon_curve[] __attribute__((aligned (2))) =
{
		0x80, 0x0,
		0x80, 0x0,
		0x80, 0x80,
		0x81, 0x0,
		0x9e, 0x0,
		0xa0, 0x0,
		0xc0, 0x0,
		0x80, 0x0,
		0x80, 0x0,
		0xff, 0x80
};

typedef struct _FLAG
{
	uint8_t flag;
	uint8_t x;
	uint8_t y;
	bool reverse;
	const char* msg;
	const unsigned char* icon;
} FLAG;

typedef struct _FRAME
{
	uint16_t flag;
	uint8_t x0;
	uint8_t y0;
	uint8_t x1;
	uint8_t y1;
} FRAME;

static const FLAG flags[] =
{
    // flag, x0, y0, reverse, msg, icon
    // right-side icons area
	// flag is the bit index in the 4 bytes viewed as a 32bits value
    { 0x00, 246, 0,  false, NULL, icon_alarm}, // F1.0  01 00 00 00
    { 0x01, 246, 11, false, NULL, icon_curve}, // F1.1  02 00 00 00
                                               // F1.2  04 00 00 00 - Channel frame
    { 0x03, 197, 27, false, "CHANNEL"},        // F1.3  08 00 00 00
                                               // F1.7  80 00 00 00 - Alarm frame
    { 0x1c, 0,  28+8,  false, "MON"},          // F4.4  00 00 00 10
    { 0x1b, 0,  28+16, false, "VIEW"},         // F4.3  00 00 00 08
    { 0x1d, 0,  28,    true, "SCAN"},          // F4.5  00 00 00 20
    { 0x1e, 0,  28+25, true, "CONFIG"},        // F4.6  00 00 00 40

    { 0x1a, 40, 52,    false, "*"},            // F4.2  00 00 00 04
    { 0x19, 50, 52,    false, "ADRS"},         // F4.1  00 00 00 02
    { 0x18, 80, 52,    false, "RMT"},          // F4.0  00 00 00 01
    { 0x17, 104, 52,   true, "ERROR"},         // F3.7  00 00 80 00

    { 0x16, 140, 52,   false, "EXT"},          // F3.6  00 00 40 00
    { 0x15, 164, 52,   false, "ONCE"},         // F3.5  00 00 20 00

    { 0x13, 104, 28+16, false, "MEM"},         // F3.3  00 00 08 00


    // col 5
    { 0x0c, 244, 22,  false, "4W"},            // F2.4  00 10 00 00
    { 0x0d, 244, 30,  false, "OC"},            // F2.5  00 20 00 00
    { 0x12, 129, 28+16, false, "LAST"},        // F3.2  00 00 04 00
    { 0x11, 129, 28+16, false, "MIN"},         // F3.1  00 00 02 00
    { 0x10, 129, 28+16, false, "MAX"},         // F3.0  00 00 01 00
    { 0x0f, 129, 28+16, false, "AVG"},         // F2.7  00 80 00 00

    { 0x05, 154+0,  17+10, false, "Alarm"},    // F1.5  20 00 00 00
    { 0x08, 154+0,  17+20, false, "H"},        // F1.6  40 00 00 00
    { 0x07, 154+6,  17+20, false, "1"},        // F2.3  00 08 00 00
    { 0x06, 154+12, 17+20, false, "2"},        // F2.0  00 01 00 00
    { 0x04, 154+18, 17+20, false, "3"},        // F2.2  00 04 00 00
    { 0x09, 154+24, 17+20, false, "4"},        // F2.1  00 02 00 00
    { 0x0a, 154+30, 17+20, false, "L"},        // F1.4  00 10 00 00

	{ 0x80, 224, 54, true, "SHIFT"},   // not an actual command, managed by the front panel
};

static const FRAME zones[] =
{ // flag, x0, y0, x1, y1
    { 0x001, 0,   0, 245, 27}, // main display area
    { 0x002, 246, 0, 255, 27}, // right notif area
    { 0x004, 208, 35, 254, 62}, // channels display area
    { 0x008, 160, 28, 202, 54}, // alarms area
    { 0x010, 0,   28, 32,  54}, // flags col1
    { 0x020, 33,  28, 70,  54}, // flags col2
    { 0x040, 71,  28, 103, 54}, // flags col3
    { 0x080, 104, 28, 128, 54}, // flags col4
    { 0x100, 129, 28, 159, 54}, // flags col5

//    { 0x8000, 0, 55, 255, 63}, // flags bits display area
};

static const FRAME frames[] =
{
    { 0x02, 194, 30, 243, 53}, // F1.2 - channel frame
    { 0x0b, 151, 30, 192, 46}, // F1.7 - alarm frame
};


class Display: public SSD1322
{
public:
	Display(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC,
					const char* name);

	virtual ~Display();

	void test_dsp();
	void show(uint8_t, const char*, uint8_t);
	void dimm_char(uint8_t);
	void show_splashscreen();
	void show_byescreen();
	void set_flag(uint8_t flag, bool show);
	void show_flag(uint8_t flag) {set_flag(flag, true);};
	void hide_flag(uint8_t flag) {set_flag(flag, false);};
	void shift_on() {set_flag(0x80, true);};
	void shift_off() {set_flag(0x80, false);};


private:
	uint8_t must_refresh;

};

#endif

mercurial