From c848019f54803907e8eda71e7576811e949081a2 Mon Sep 17 00:00:00 2001 From: Dennis Real Date: Sun, 22 Sep 2019 18:09:53 +0200 Subject: [PATCH 01/42] Compressed 5x7 font to 8 bit and removed unneeded characters to get some space in flash. --- Font5x7.c | 3784 +++++++++++++++++++++++------------------------------ README.md | 1 + ili9341.c | 37 +- nanovna.h | 18 +- plot.c | 48 +- 5 files changed, 1743 insertions(+), 2145 deletions(-) diff --git a/Font5x7.c b/Font5x7.c index 151a87f7..482444b9 100644 --- a/Font5x7.c +++ b/Font5x7.c @@ -9,9 +9,8 @@ #include /* Font character bitmap data. */ -const uint16_t x5x7_bits [] = +const uint8_t x5x7_bits [] = { - /* Character (0x00): bbw=5, bbh=7, bbx=0, bby=-1, width=5 +----------------+ @@ -23,2407 +22,1932 @@ const uint16_t x5x7_bits [] = |**** | | | +----------------+ */ - 0xf000, - 0xf000, - 0xf000, - 0xf000, - 0xf000, - 0xf000, - 0x0000, - - /* Character (0x01): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * | - | *** | - |***** | - | *** | - | * | - | | - +----------------+ */ - 0x0000, - 0x2000, - 0x7000, - 0xf800, - 0x7000, - 0x2000, - 0x0000, - - /* Character (0x02): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * * | - |* * | - | * * | - |* * | - | * * | - |* * | - | | - +----------------+ */ - 0x5000, - 0xa000, - 0x5000, - 0xa000, - 0x5000, - 0xa000, - 0x0000, - - /* Character (0x03): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |*** | - |* * | - |* * | - | *** | - | * | - | * | - +----------------+ */ - 0xa000, - 0xe000, - 0xa000, - 0xa000, - 0x7000, - 0x2000, - 0x2000, - - /* Character (0x04): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |** | - |* | - |** | - |* ** | - | * | - | ** | - | * | - +----------------+ */ - 0xc000, - 0x8000, - 0xc000, - 0xb000, - 0x2000, - 0x3000, - 0x2000, - - /* Character (0x05): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |** | - |* | - |** | - | ** | - | * * | - | ** | - | * * | - +----------------+ */ - 0xc000, - 0x8000, - 0xc000, - 0x6000, - 0x5000, - 0x6000, - 0x5000, - - /* Character (0x06): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* | - |** | - | ** | - | * | - | ** | - | * | - +----------------+ */ - 0x8000, - 0x8000, - 0xc000, - 0x3000, - 0x2000, - 0x3000, - 0x2000, - - /* Character (0x07): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * * | - | * | - | | - | | - | | - | | - +----------------+ */ - 0x2000, - 0x5000, - 0x2000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x08): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | *** | - | * | - | | - | *** | - | | - | | - +----------------+ */ - 0x2000, - 0x7000, - 0x2000, - 0x0000, - 0x7000, - 0x0000, - 0x0000, - - /* Character (0x09): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |** * | - |* ** | - |* * | - | * | - | * | - | ** | - +----------------+ */ - 0x9000, - 0xd000, - 0xb000, - 0x9000, - 0x2000, - 0x2000, - 0x3000, - - /* Character (0x0a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |* * | - | * | - | *** | - | * | - | * | - +----------------+ */ - 0xa000, - 0xa000, - 0xa000, - 0x4000, - 0x7000, - 0x2000, - 0x2000, - - /* Character (0x0b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - |*** | - | | - | | - | | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0xe000, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x0c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - |*** | - | * | - | * | - | * | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0xe000, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x0d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | *** | - | * | - | * | - | * | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x3800, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x0e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | *** | - | | - | | - | | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0x3800, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x0f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - |***** | - | * | - | * | - | * | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0xf800, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x10): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - |***** | - | | - | | - | | - | | - | | - +----------------+ */ - 0x0000, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x11): - bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |***** | - | | - | | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x12): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - |***** | - | | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x13): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - |***** | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0xf800, - 0x0000, - 0x0000, - - /* Character (0x14): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - | | - |***** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0xf800, - 0x0000, - - /* Character (0x15): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | *** | - | * | - | * | - | * | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0x3800, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x16): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - |*** | - | * | - | * | - | * | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0xe000, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x17): - bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - |***** | - | | - | | - | | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0xf800, - 0x0000, - 0x0000, - 0x0000, - - /* Character (0x18): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - |***** | - | * | - | * | - | * | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0xf800, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x19): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - | * | - | * | - | * | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0x2000, - - /* Character (0x1a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - |**** | - | * | - | * | - | | - | | - +----------------+ */ - 0x2000, - 0x4000, - 0xF800, - 0x4000, - 0x2000, - 0x0000, - 0x0000, - - /* Character (0x1b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - |***** | - | * | - | * | - | | - | | - +----------------+ */ - 0x2000, - 0x1000, - 0xF800, - 0x1000, - 0x2000, - 0x0000, - 0x0000, - - /* Character (0x1c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |***** | - | * * | - | * * | - |* ** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xf800, - 0x5000, - 0x5000, - 0x9800, - 0x0000, - - /* Character (0x1d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |* * | - |* * | - |*** | - |* | - +----------------+ */ - 0x0000, - 0x0000, - 0x9000, - 0x9000, - 0x9000, - 0xe000, - 0x8000, - - /* Character (0x1e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | *** | - |* * | - |* * | - | * * | - |** ** | - | | - +----------------+ */ - 0x0000, - 0x7000, - 0x8800, - 0x8800, - 0x5000, - 0xb800, - 0x0000, - - /* Character (0x1f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* * | - | ** | - | | - | | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, - 0x0000, - 0x0000, + 0xf0, + 0xf0, + 0xf0, + 0xf0, + 0xf0, + 0xf0, + 0x00, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | * | + | * | + |**** | + | * | + | * | + | | + | | + +--------+ */ + 0x20, + 0x40, + 0xF8, + 0x40, + 0x20, + 0x00, + 0x00, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | * | + | * | + |***** | + | * | + | * | + | | + | | + +--------+ */ + 0x20, + 0x10, + 0xF8, + 0x10, + 0x20, + 0x00, + 0x00, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | | + | | + |***** | + | * * | + | * * | + |* ** | + | | + +--------+ */ + 0x00, + 0x00, + 0xf8, + 0x50, + 0x50, + 0x98, + 0x00, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | | + | | + |* * | + |* * | + |* * | + |*** | + |* | + +--------+ */ + 0x00, + 0x00, + 0x90, + 0x90, + 0x90, + 0xe0, + 0x80, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | | + | *** | + |* * | + |* * | + | * * | + |** ** | + | | + +--------+ */ + 0x00, + 0x70, + 0x88, + 0x88, + 0x50, + 0xb8, + 0x00, + + /* Character (): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | ** | + |* * | + |* * | + | ** | + | | + | | + | | + +--------+ */ + 0x60, + 0x90, + 0x90, + 0x60, + 0x00, + 0x00, + 0x00, /* Character (0x20): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - | | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | | + | | + | | + | | + | | + | | + | | + +--------+ */ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, /* Character (0x21): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - | | - | * | - | | - +----------------+ */ - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0x0000, - 0x2000, - 0x0000, + +--------+ + | * | + | * | + | * | + | * | + | | + | * | + | | + +--------+ */ + 0x20, + 0x20, + 0x20, + 0x20, + 0x00, + 0x20, + 0x00, /* Character (0x22): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * * | - | * * | - | * * | - | | - | | - | | - | | - +----------------+ */ - 0x5000, - 0x5000, - 0x5000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | * * | + | * * | + | * * | + | | + | | + | | + | | + +--------+ */ + 0x50, + 0x50, + 0x50, + 0x00, + 0x00, + 0x00, + 0x00, /* Character (0x23): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * * | - |***** | - | * * | - |***** | - | * * | - | | - +----------------+ */ - 0x0000, - 0x5000, - 0xf800, - 0x5000, - 0xf800, - 0x5000, - 0x0000, + +--------+ + | | + | * * | + |***** | + | * * | + |***** | + | * * | + | | + +--------+ */ + 0x00, + 0x50, + 0xf8, + 0x50, + 0xf8, + 0x50, + 0x00, /* Character (0x24): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | *** | - |* * | - | *** | - | * * | - | *** | - | | - +----------------+ */ - 0x0000, - 0x7000, - 0xa000, - 0x7000, - 0x2800, - 0x7000, - 0x0000, + +--------+ + | | + | *** | + |* * | + | *** | + | * * | + | *** | + | | + +--------+ */ + 0x00, + 0x70, + 0xa0, + 0x70, + 0x28, + 0x70, + 0x00, /* Character (0x25): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* * | - | * | - | * | - |* * | - | * | - | | - +----------------+ */ - 0x8000, - 0x9000, - 0x2000, - 0x4000, - 0x9000, - 0x1000, - 0x0000, + +--------+ + |* | + |* * | + | * | + | * | + |* * | + | * | + | | + +--------+ */ + 0x80, + 0x90, + 0x20, + 0x40, + 0x90, + 0x10, + 0x00, /* Character (0x26): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * | - |* * | - | * | - |* * | - | * * | - | | - +----------------+ */ - 0x0000, - 0x4000, - 0xa000, - 0x4000, - 0xa000, - 0x5000, - 0x0000, + +--------+ + | | + | * | + |* * | + | * | + |* * | + | * * | + | | + +--------+ */ + 0x00, + 0x40, + 0xa0, + 0x40, + 0xa0, + 0x50, + 0x00, /* Character (0x27): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - | * | - |* | - | | - | | - | | - | | - +----------------+ */ - 0x6000, - 0x4000, - 0x8000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | ** | + | * | + |* | + | | + | | + | | + | | + +--------+ */ + 0x60, + 0x40, + 0x80, + 0x00, + 0x00, + 0x00, + 0x00, /* Character (0x28): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +----------------+ */ - 0x2000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x2000, - 0x0000, + +--------+ + | * | + | * | + | * | + | * | + | * | + | * | + | | + +--------+ */ + 0x20, + 0x40, + 0x40, + 0x40, + 0x40, + 0x20, + 0x00, /* Character (0x29): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +----------------+ */ - 0x4000, - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0x4000, - 0x0000, + +--------+ + | * | + | * | + | * | + | * | + | * | + | * | + | | + +--------+ */ + 0x40, + 0x20, + 0x20, + 0x20, + 0x20, + 0x40, + 0x00, /* Character (0x2a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - |* * | - | * | - |*** | - | * | - |* * | - | | - +----------------+ */ - 0x0000, - 0xa000, - 0x4000, - 0xe000, - 0x4000, - 0xa000, - 0x0000, + +--------+ + | | + |* * | + | * | + |*** | + | * | + |* * | + | | + +--------+ */ + 0x00, + 0xa0, + 0x40, + 0xe0, + 0x40, + 0xa0, + 0x00, /* Character (0x2b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * | - | * | - |***** | - | * | - | * | - | | - +----------------+ */ - 0x0000, - 0x2000, - 0x2000, - 0xf800, - 0x2000, - 0x2000, - 0x0000, + +--------+ + | | + | * | + | * | + |***** | + | * | + | * | + | | + +--------+ */ + 0x00, + 0x20, + 0x20, + 0xf8, + 0x20, + 0x20, + 0x00, /* Character (0x2c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - | ** | - | * | - |* | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x6000, - 0x4000, - 0x8000, + +--------+ + | | + | | + | | + | | + | ** | + | * | + |* | + +--------+ */ + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x40, + 0x80, /* Character (0x2d): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - |**** | - | | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0xf000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | | + | | + | | + |**** | + | | + | | + | | + +--------+ */ + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, + 0x00, + 0x00, /* Character (0x2e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - | ** | - | ** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x6000, - 0x6000, - 0x0000, + +--------+ + | | + | | + | | + | | + | ** | + | ** | + | | + +--------+ */ + 0x00, + 0x00, + 0x00, + 0x00, + 0x60, + 0x60, + 0x00, /* Character (0x2f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * | - | * | - | * | - |* | - | | - | | - +----------------+ */ - 0x0000, - 0x1000, - 0x2000, - 0x4000, - 0x8000, - 0x0000, - 0x0000, + +--------+ + | | + | * | + | * | + | * | + |* | + | | + | | + +--------+ */ + 0x00, + 0x10, + 0x20, + 0x40, + 0x80, + 0x00, + 0x00, /* Character (0x30): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* ** | - |** * | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0xb000, - 0xd000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + |* ** | + |** * | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0xb0, + 0xd0, + 0x90, + 0x60, + 0x00, /* Character (0x31): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - |** | - | * | - | * | - | * | - |*** | - | | - +----------------+ */ - 0x4000, - 0xc000, - 0x4000, - 0x4000, - 0x4000, - 0xe000, - 0x0000, + +--------+ + | * | + |** | + | * | + | * | + | * | + |*** | + | | + +--------+ */ + 0x40, + 0xc0, + 0x40, + 0x40, + 0x40, + 0xe0, + 0x00, /* Character (0x32): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - | * | - | * | - | * | - |**** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x1000, - 0x2000, - 0x4000, - 0xf000, - 0x0000, + +--------+ + | ** | + |* * | + | * | + | * | + | * | + |**** | + | | + +--------+ */ + 0x60, + 0x90, + 0x10, + 0x20, + 0x40, + 0xf0, + 0x00, /* Character (0x33): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - | * | - | ** | - | * | - |* * | - | ** | - | | - +----------------+ */ - 0xf000, - 0x1000, - 0x6000, - 0x1000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + |**** | + | * | + | ** | + | * | + |* * | + | ** | + | | + +--------+ */ + 0xf0, + 0x10, + 0x60, + 0x10, + 0x90, + 0x60, + 0x00, /* Character (0x34): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | ** | - |* * | - |**** | - | * | - | * | - | | - +----------------+ */ - 0x2000, - 0x6000, - 0xa000, - 0xf000, - 0x2000, - 0x2000, - 0x0000, + +--------+ + | * | + | ** | + |* * | + |**** | + | * | + | * | + | | + +--------+ */ + 0x20, + 0x60, + 0xa0, + 0xf0, + 0x20, + 0x20, + 0x00, /* Character (0x35): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - |* | - |*** | - | * | - |* * | - | ** | - | | - +----------------+ */ - 0xf000, - 0x8000, - 0xe000, - 0x1000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + |**** | + |* | + |*** | + | * | + |* * | + | ** | + | | + +--------+ */ + 0xf0, + 0x80, + 0xe0, + 0x10, + 0x90, + 0x60, + 0x00, /* Character (0x36): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* | - |*** | - |* * | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x8000, - 0xe000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* | + |*** | + |* * | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x80, + 0xe0, + 0x90, + 0x90, + 0x60, + 0x00, /* Character (0x37): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - | * | - | * | - | * | - | * | - | * | - | | - +----------------+ */ - 0xf000, - 0x1000, - 0x2000, - 0x2000, - 0x4000, - 0x4000, - 0x0000, + +--------+ + |**** | + | * | + | * | + | * | + | * | + | * | + | | + +--------+ */ + 0xf0, + 0x10, + 0x20, + 0x20, + 0x40, + 0x40, + 0x00, /* Character (0x38): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - | ** | - |* * | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x6000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + | ** | + |* * | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0x60, + 0x90, + 0x90, + 0x60, + 0x00, /* Character (0x39): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* * | - | *** | - | * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x9000, - 0x7000, - 0x1000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + |* * | + | *** | + | * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0x90, + 0x70, + 0x10, + 0x60, + 0x00, /* Character (0x3a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | ** | - | ** | - | | - | ** | - | ** | - | | - +----------------+ */ - 0x0000, - 0x6000, - 0x6000, - 0x0000, - 0x6000, - 0x6000, - 0x0000, + +--------+ + | | + | ** | + | ** | + | | + | ** | + | ** | + | | + +--------+ */ + 0x00, + 0x60, + 0x60, + 0x00, + 0x60, + 0x60, + 0x00, /* Character (0x3b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | ** | - | ** | - | | - | ** | - | * | - |* | - +----------------+ */ - 0x0000, - 0x6000, - 0x6000, - 0x0000, - 0x6000, - 0x4000, - 0x8000, + +--------+ + | | + | ** | + | ** | + | | + | ** | + | * | + |* | + +--------+ */ + 0x00, + 0x60, + 0x60, + 0x00, + 0x60, + 0x40, + 0x80, /* Character (0x3c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | * | - | * | - |* | - | * | - | * | - | | - +----------------+ */ - 0x0000, - 0x2000, - 0x4000, - 0x8000, - 0x4000, - 0x2000, - 0x0000, + +--------+ + | | + | * | + | * | + |* | + | * | + | * | + | | + +--------+ */ + 0x00, + 0x20, + 0x40, + 0x80, + 0x40, + 0x20, + 0x00, /* Character (0x3d): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |**** | - | | - |**** | - | | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xf000, - 0x0000, - 0xf000, - 0x0000, - 0x0000, + +--------+ + | | + | | + |**** | + | | + |**** | + | | + | | + +--------+ */ + 0x00, + 0x00, + 0xf0, + 0x00, + 0xf0, + 0x00, + 0x00, /* Character (0x3e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - |* | - | * | - | * | - | * | - |* | - | | - +----------------+ */ - 0x0000, - 0x8000, - 0x4000, - 0x2000, - 0x4000, - 0x8000, - 0x0000, + +--------+ + | | + |* | + | * | + | * | + | * | + |* | + | | + +--------+ */ + 0x00, + 0x80, + 0x40, + 0x20, + 0x40, + 0x80, + 0x00, /* Character (0x3f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - |* * | - | * | - | * | - | | - | * | - | | - +----------------+ */ - 0x4000, - 0xa000, - 0x2000, - 0x4000, - 0x0000, - 0x4000, - 0x0000, + +--------+ + | * | + |* * | + | * | + | * | + | | + | * | + | | + +--------+ */ + 0x40, + 0xa0, + 0x20, + 0x40, + 0x00, + 0x40, + 0x00, /* Character (0x40): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* ** | - |* ** | - |* | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0xb000, - 0xb000, - 0x8000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + |* ** | + |* ** | + |* | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0xb0, + 0xb0, + 0x80, + 0x60, + 0x00, /* Character (0x41): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* * | - |**** | - |* * | - |* * | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x9000, - 0xf000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + | ** | + |* * | + |* * | + |**** | + |* * | + |* * | + | | + +--------+ */ + 0x60, + 0x90, + 0x90, + 0xf0, + 0x90, + 0x90, + 0x00, /* Character (0x42): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - |* * | - |*** | - |* * | - |* * | - |*** | - | | - +----------------+ */ - 0xe000, - 0x9000, - 0xe000, - 0x9000, - 0x9000, - 0xe000, - 0x0000, + +--------+ + |*** | + |* * | + |*** | + |* * | + |* * | + |*** | + | | + +--------+ */ + 0xe0, + 0x90, + 0xe0, + 0x90, + 0x90, + 0xe0, + 0x00, /* Character (0x43): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* | - |* | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x8000, - 0x8000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + |* | + |* | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0x80, + 0x80, + 0x90, + 0x60, + 0x00, /* Character (0x44): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - |* * | - |* * | - |* * | - |* * | - |*** | - | | - +----------------+ */ - 0xe000, - 0x9000, - 0x9000, - 0x9000, - 0x9000, - 0xe000, - 0x0000, + +--------+ + |*** | + |* * | + |* * | + |* * | + |* * | + |*** | + | | + +--------+ */ + 0xe0, + 0x90, + 0x90, + 0x90, + 0x90, + 0xe0, + 0x00, /* Character (0x45): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - |* | - |*** | - |* | - |* | - |**** | - | | - +----------------+ */ - 0xf000, - 0x8000, - 0xe000, - 0x8000, - 0x8000, - 0xf000, - 0x0000, + +--------+ + |**** | + |* | + |*** | + |* | + |* | + |**** | + | | + +--------+ */ + 0xf0, + 0x80, + 0xe0, + 0x80, + 0x80, + 0xf0, + 0x00, /* Character (0x46): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - |* | - |*** | - |* | - |* | - |* | - | | - +----------------+ */ - 0xf000, - 0x8000, - 0xe000, - 0x8000, - 0x8000, - 0x8000, - 0x0000, + +--------+ + |**** | + |* | + |*** | + |* | + |* | + |* | + | | + +--------+ */ + 0xf0, + 0x80, + 0xe0, + 0x80, + 0x80, + 0x80, + 0x00, /* Character (0x47): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* | - |* ** | - |* * | - | *** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x8000, - 0xb000, - 0x9000, - 0x7000, - 0x0000, + +--------+ + | ** | + |* * | + |* | + |* ** | + |* * | + | *** | + | | + +--------+ */ + 0x60, + 0x90, + 0x80, + 0xb0, + 0x90, + 0x70, + 0x00, /* Character (0x48): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |**** | - |* * | - |* * | - |* * | - | | - +----------------+ */ - 0x9000, - 0x9000, - 0xf000, - 0x9000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + |* * | + |* * | + |**** | + |* * | + |* * | + |* * | + | | + +--------+ */ + 0x90, + 0x90, + 0xf0, + 0x90, + 0x90, + 0x90, + 0x00, /* Character (0x49): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - | * | - | * | - | * | - | * | - |*** | - | | - +----------------+ */ - 0xe000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0xe000, - 0x0000, + +--------+ + |*** | + | * | + | * | + | * | + | * | + |*** | + | | + +--------+ */ + 0xe0, + 0x40, + 0x40, + 0x40, + 0x40, + 0xe0, + 0x00, /* Character (0x4a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - |* * | - | ** | - | | - +----------------+ */ - 0x1000, - 0x1000, - 0x1000, - 0x1000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | * | + | * | + | * | + | * | + |* * | + | ** | + | | + +--------+ */ + 0x10, + 0x10, + 0x10, + 0x10, + 0x90, + 0x60, + 0x00, /* Character (0x4b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |** | - |** | - |* * | - |* * | - | | - +----------------+ */ - 0x9000, - 0xa000, - 0xc000, - 0xc000, - 0xa000, - 0x9000, - 0x0000, + +--------+ + |* * | + |* * | + |** | + |** | + |* * | + |* * | + | | + +--------+ */ + 0x90, + 0xa0, + 0xc0, + 0xc0, + 0xa0, + 0x90, + 0x00, /* Character (0x4c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* | - |* | - |* | - |* | - |**** | - | | - +----------------+ */ - 0x8000, - 0x8000, - 0x8000, - 0x8000, - 0x8000, - 0xf000, - 0x0000, + +--------+ + |* | + |* | + |* | + |* | + |* | + |**** | + | | + +--------+ */ + 0x80, + 0x80, + 0x80, + 0x80, + 0x80, + 0xf0, + 0x00, /* Character (0x4d): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |**** | - |**** | - |* * | - |* * | - |* * | - | | - +----------------+ */ - 0x9000, - 0xf000, - 0xf000, - 0x9000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + |* * | + |**** | + |**** | + |* * | + |* * | + |* * | + | | + +--------+ */ + 0x90, + 0xf0, + 0xf0, + 0x90, + 0x90, + 0x90, + 0x00, /* Character (0x4e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |** * | - |** * | - |* ** | - |* ** | - |* * | - | | - +----------------+ */ - 0x9000, - 0xd000, - 0xd000, - 0xb000, - 0xb000, - 0x9000, - 0x0000, + +--------+ + |* * | + |** * | + |** * | + |* ** | + |* ** | + |* * | + | | + +--------+ */ + 0x90, + 0xd0, + 0xd0, + 0xb0, + 0xb0, + 0x90, + 0x00, /* Character (0x4f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* * | - |* * | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x9000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + |* * | + |* * | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60, + 0x00, /* Character (0x50): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - |* * | - |* * | - |*** | - |* | - |* | - | | - +----------------+ */ - 0xe000, - 0x9000, - 0x9000, - 0xe000, - 0x8000, - 0x8000, - 0x0000, + +--------+ + |*** | + |* * | + |* * | + |*** | + |* | + |* | + | | + +--------+ */ + 0xe0, + 0x90, + 0x90, + 0xe0, + 0x80, + 0x80, + 0x00, /* Character (0x51): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - |* * | - |* * | - |** * | - | ** | - | * | - +----------------+ */ - 0x6000, - 0x9000, - 0x9000, - 0x9000, - 0xd000, - 0x6000, - 0x1000, + +--------+ + | ** | + |* * | + |* * | + |* * | + |** * | + | ** | + | * | + +--------+ */ + 0x60, + 0x90, + 0x90, + 0x90, + 0xd0, + 0x60, + 0x10, /* Character (0x52): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - |* * | - |* * | - |*** | - |* * | - |* * | - | | - +----------------+ */ - 0xe000, - 0x9000, - 0x9000, - 0xe000, - 0xa000, - 0x9000, - 0x0000, + +--------+ + |*** | + |* * | + |* * | + |*** | + |* * | + |* * | + | | + +--------+ */ + 0xe0, + 0x90, + 0x90, + 0xe0, + 0xa0, + 0x90, + 0x00, /* Character (0x53): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | ** | - |* * | - | * | - | * | - |* * | - | ** | - | | - +----------------+ */ - 0x6000, - 0x9000, - 0x4000, - 0x2000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | ** | + |* * | + | * | + | * | + |* * | + | ** | + | | + +--------+ */ + 0x60, + 0x90, + 0x40, + 0x20, + 0x90, + 0x60, + 0x00, /* Character (0x54): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - | * | - | * | - | * | - | * | - | * | - | | - +----------------+ */ - 0xe000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x0000, + +--------+ + |*** | + | * | + | * | + | * | + | * | + | * | + | | + +--------+ */ + 0xe0, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x00, /* Character (0x55): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |* * | - |* * | - |* * | - | ** | - | | - +----------------+ */ - 0x9000, - 0x9000, - 0x9000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + |* * | + |* * | + |* * | + |* * | + |* * | + | ** | + | | + +--------+ */ + 0x90, + 0x90, + 0x90, + 0x90, + 0x90, + 0x60, + 0x00, /* Character (0x56): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |* * | - |* * | - | ** | - | ** | - | | - +----------------+ */ - 0x9000, - 0x9000, - 0x9000, - 0x9000, - 0x6000, - 0x6000, - 0x0000, + +--------+ + |* * | + |* * | + |* * | + |* * | + | ** | + | ** | + | | + +--------+ */ + 0x90, + 0x90, + 0x90, + 0x90, + 0x60, + 0x60, + 0x00, /* Character (0x57): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |* * | - |**** | - |**** | - |* * | - | | - +----------------+ */ - 0x9000, - 0x9000, - 0x9000, - 0xf000, - 0xf000, - 0x9000, - 0x0000, + +--------+ + |* * | + |* * | + |* * | + |**** | + |**** | + |* * | + | | + +--------+ */ + 0x90, + 0x90, + 0x90, + 0xf0, + 0xf0, + 0x90, + 0x00, /* Character (0x58): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - | ** | - | ** | - |* * | - |* * | - | | - +----------------+ */ - 0x9000, - 0x9000, - 0x6000, - 0x6000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + |* * | + |* * | + | ** | + | ** | + |* * | + |* * | + | | + +--------+ */ + 0x90, + 0x90, + 0x60, + 0x60, + 0x90, + 0x90, + 0x00, /* Character (0x59): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* * | - |* * | - |* * | - | * | - | * | - | * | - | | - +----------------+ */ - 0xa000, - 0xa000, - 0xa000, - 0x4000, - 0x4000, - 0x4000, - 0x0000, + +--------+ + |* * | + |* * | + |* * | + | * | + | * | + | * | + | | + +--------+ */ + 0xa0, + 0xa0, + 0xa0, + 0x40, + 0x40, + 0x40, + 0x00, /* Character (0x5a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - | * | - | * | - | * | - |* | - |**** | - | | - +----------------+ */ - 0xf000, - 0x1000, - 0x2000, - 0x4000, - 0x8000, - 0xf000, - 0x0000, + +--------+ + |**** | + | * | + | * | + | * | + |* | + |**** | + | | + +--------+ */ + 0xf0, + 0x10, + 0x20, + 0x40, + 0x80, + 0xf0, + 0x00, /* Character (0x5b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - |* | - |* | - |* | - |* | - |*** | - | | - +----------------+ */ - 0xe000, - 0x8000, - 0x8000, - 0x8000, - 0x8000, - 0xe000, - 0x0000, + +--------+ + |*** | + |* | + |* | + |* | + |* | + |*** | + | | + +--------+ */ + 0xe0, + 0x80, + 0x80, + 0x80, + 0x80, + 0xe0, + 0x00, /* Character (0x5c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - |* | - | * | - | * | - | * | - | | - | | - +----------------+ */ - 0x0000, - 0x8000, - 0x4000, - 0x2000, - 0x1000, - 0x0000, - 0x0000, + +--------+ + | | + |* | + | * | + | * | + | * | + | | + | | + +--------+ */ + 0x00, + 0x80, + 0x40, + 0x20, + 0x10, + 0x00, + 0x00, /* Character (0x5d): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |*** | - | * | - | * | - | * | - | * | - |*** | - | | - +----------------+ */ - 0xe000, - 0x2000, - 0x2000, - 0x2000, - 0x2000, - 0xe000, - 0x0000, + +--------+ + |*** | + | * | + | * | + | * | + | * | + |*** | + | | + +--------+ */ + 0xe0, + 0x20, + 0x20, + 0x20, + 0x20, + 0xe0, + 0x00, /* Character (0x5e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - |* * | - | | - | | - | | - | | - | | - +----------------+ */ - 0x4000, - 0xa000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | * | + |* * | + | | + | | + | | + | | + | | + +--------+ */ + 0x40, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, /* Character (0x5f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | | - | | - | | - |**** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0xf000, - 0x0000, + +--------+ + | | + | | + | | + | | + | | + |**** | + | | + +--------+ */ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xf0, + 0x00, /* Character (0x60): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |** | - | * | - | * | - | | - | | - | | - | | - +----------------+ */ - 0xc000, - 0x4000, - 0x2000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + |** | + | * | + | * | + | | + | | + | | + | | + +--------+ */ + 0xc0, + 0x40, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, /* Character (0x61): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | *** | - |* * | - |* ** | - | * * | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x7000, - 0x9000, - 0xb000, - 0x5000, - 0x0000, + +--------+ + | | + | | + | *** | + |* * | + |* ** | + | * * | + | | + +--------+ */ + 0x00, + 0x00, + 0x70, + 0x90, + 0xb0, + 0x50, + 0x00, /* Character (0x62): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* | - |*** | - |* * | - |* * | - |*** | - | | - +----------------+ */ - 0x8000, - 0x8000, - 0xe000, - 0x9000, - 0x9000, - 0xe000, - 0x0000, + +--------+ + |* | + |* | + |*** | + |* * | + |* * | + |*** | + | | + +--------+ */ + 0x80, + 0x80, + 0xe0, + 0x90, + 0x90, + 0xe0, + 0x00, /* Character (0x63): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | ** | - |* | - |* | - | ** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x6000, - 0x8000, - 0x8000, - 0x6000, - 0x0000, + +--------+ + | | + | | + | ** | + |* | + |* | + | ** | + | | + +--------+ */ + 0x00, + 0x00, + 0x60, + 0x80, + 0x80, + 0x60, + 0x00, /* Character (0x64): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | *** | - |* * | - |* * | - | *** | - | | - +----------------+ */ - 0x1000, - 0x1000, - 0x7000, - 0x9000, - 0x9000, - 0x7000, - 0x0000, + +--------+ + | * | + | * | + | *** | + |* * | + |* * | + | *** | + | | + +--------+ */ + 0x10, + 0x10, + 0x70, + 0x90, + 0x90, + 0x70, + 0x00, /* Character (0x65): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | ** | - |* ** | - |** | - | ** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x6000, - 0xb000, - 0xc000, - 0x6000, - 0x0000, + +--------+ + | | + | | + | ** | + |* ** | + |** | + | ** | + | | + +--------+ */ + 0x00, + 0x00, + 0x60, + 0xb0, + 0xc0, + 0x60, + 0x00, /* Character (0x66): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * * | - | * | - |*** | - | * | - | * | - | | - +----------------+ */ - 0x2000, - 0x5000, - 0x4000, - 0xe000, - 0x4000, - 0x4000, - 0x0000, + +--------+ + | * | + | * * | + | * | + |*** | + | * | + | * | + | | + +--------+ */ + 0x20, + 0x50, + 0x40, + 0xe0, + 0x40, + 0x40, + 0x00, /* Character (0x67): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | *** | - |* * | - | ** | - |* | - | *** | - +----------------+ */ - 0x0000, - 0x0000, - 0x7000, - 0x9000, - 0x6000, - 0x8000, - 0x7000, + +--------+ + | | + | | + | *** | + |* * | + | ** | + |* | + | *** | + +--------+ */ + 0x00, + 0x00, + 0x70, + 0x90, + 0x60, + 0x80, + 0x70, /* Character (0x68): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* | - |*** | - |* * | - |* * | - |* * | - | | - +----------------+ */ - 0x8000, - 0x8000, - 0xe000, - 0x9000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + |* | + |* | + |*** | + |* * | + |* * | + |* * | + | | + +--------+ */ + 0x80, + 0x80, + 0xe0, + 0x90, + 0x90, + 0x90, + 0x00, /* Character (0x69): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | | - |** | - | * | - | * | - |*** | - | | - +----------------+ */ - 0x4000, - 0x0000, - 0xc000, - 0x4000, - 0x4000, - 0xe000, - 0x0000, + +--------+ + | * | + | | + |** | + | * | + | * | + |*** | + | | + +--------+ */ + 0x40, + 0x00, + 0xc0, + 0x40, + 0x40, + 0xe0, + 0x00, /* Character (0x6a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | | - | * | - | * | - | * | - |* * | - | * | - +----------------+ */ - 0x2000, - 0x0000, - 0x2000, - 0x2000, - 0x2000, - 0xa000, - 0x4000, + +--------+ + | * | + | | + | * | + | * | + | * | + |* * | + | * | + +--------+ */ + 0x20, + 0x00, + 0x20, + 0x20, + 0x20, + 0xa0, + 0x40, /* Character (0x6b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - |* | - |* * | - |** | - |* * | - |* * | - | | - +----------------+ */ - 0x8000, - 0x8000, - 0xa000, - 0xc000, - 0xa000, - 0x9000, - 0x0000, + +--------+ + |* | + |* | + |* * | + |** | + |* * | + |* * | + | | + +--------+ */ + 0x80, + 0x80, + 0xa0, + 0xc0, + 0xa0, + 0x90, + 0x00, /* Character (0x6c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |** | - | * | - | * | - | * | - | * | - |*** | - | | - +----------------+ */ - 0xc000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0xe000, - 0x0000, + +--------+ + |** | + | * | + | * | + | * | + | * | + |*** | + | | + +--------+ */ + 0xc0, + 0x40, + 0x40, + 0x40, + 0x40, + 0xe0, + 0x00, /* Character (0x6d): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |**** | - |* * | - |* * | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xa000, - 0xf000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + | | + | | + |* * | + |**** | + |* * | + |* * | + | | + +--------+ */ + 0x00, + 0x00, + 0xa0, + 0xf0, + 0x90, + 0x90, + 0x00, /* Character (0x6e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |*** | - |* * | - |* * | - |* * | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xe000, - 0x9000, - 0x9000, - 0x9000, - 0x0000, + +--------+ + | | + | | + |*** | + |* * | + |* * | + |* * | + | | + +--------+ */ + 0x00, + 0x00, + 0xe0, + 0x90, + 0x90, + 0x90, + 0x00, /* Character (0x6f): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | ** | - |* * | - |* * | - | ** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x6000, - 0x9000, - 0x9000, - 0x6000, - 0x0000, + +--------+ + | | + | | + | ** | + |* * | + |* * | + | ** | + | | + +--------+ */ + 0x00, + 0x00, + 0x60, + 0x90, + 0x90, + 0x60, + 0x00, /* Character (0x70): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |*** | - |* * | - |* * | - |*** | - |* | - +----------------+ */ - 0x0000, - 0x0000, - 0xe000, - 0x9000, - 0x9000, - 0xe000, - 0x8000, + +--------+ + | | + | | + |*** | + |* * | + |* * | + |*** | + |* | + +--------+ */ + 0x00, + 0x00, + 0xe0, + 0x90, + 0x90, + 0xe0, + 0x80, /* Character (0x71): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | *** | - |* * | - |* * | - | *** | - | * | - +----------------+ */ - 0x0000, - 0x0000, - 0x7000, - 0x9000, - 0x9000, - 0x7000, - 0x1000, + +--------+ + | | + | | + | *** | + |* * | + |* * | + | *** | + | * | + +--------+ */ + 0x00, + 0x00, + 0x70, + 0x90, + 0x90, + 0x70, + 0x10, /* Character (0x72): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |*** | - |* * | - |* | - |* | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xe000, - 0x9000, - 0x8000, - 0x8000, - 0x0000, + +--------+ + | | + | | + |*** | + |* * | + |* | + |* | + | | + +--------+ */ + 0x00, + 0x00, + 0xe0, + 0x90, + 0x80, + 0x80, + 0x00, /* Character (0x73): bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - | *** | - |** | - | ** | - |*** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x7000, - 0xc000, - 0x3000, - 0xe000, - 0x0000, + +--------+ + | | + | | + | *** | + |** | + | ** | + |*** | + | | + +--------+ */ + 0x00, + 0x00, + 0x70, + 0xc0, + 0x30, + 0xe0, + 0x00, /* Character (0x74): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - |*** | - | * | - | * | - | ** | - | | - +----------------+ */ - 0x4000, - 0x4000, - 0xe000, - 0x4000, - 0x4000, - 0x3000, - 0x0000, + +--------+ + | * | + | * | + |*** | + | * | + | * | + | ** | + | | + +--------+ */ + 0x40, + 0x40, + 0xe0, + 0x40, + 0x40, + 0x30, + 0x00, /* Character (0x75): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |* * | - |* * | - | *** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x9000, - 0x9000, - 0x9000, - 0x7000, - 0x0000, + +--------+ + | | + | | + |* * | + |* * | + |* * | + | *** | + | | + +--------+ */ + 0x00, + 0x00, + 0x90, + 0x90, + 0x90, + 0x70, + 0x00, /* Character (0x76): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |* * | - |* * | - | * | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xa000, - 0xa000, - 0xa000, - 0x4000, - 0x0000, + +--------+ + | | + | | + |* * | + |* * | + |* * | + | * | + | | + +--------+ */ + 0x00, + 0x00, + 0xa0, + 0xa0, + 0xa0, + 0x40, + 0x00, /* Character (0x77): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |* * | - |**** | - |**** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x9000, - 0x9000, - 0xf000, - 0xf000, - 0x0000, + +--------+ + | | + | | + |* * | + |* * | + |**** | + |**** | + | | + +--------+ */ + 0x00, + 0x00, + 0x90, + 0x90, + 0xf0, + 0xf0, + 0x00, /* Character (0x78): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - | ** | - | ** | - |* * | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0x9000, - 0x6000, - 0x6000, - 0x9000, - 0x0000, + +--------+ + | | + | | + |* * | + | ** | + | ** | + |* * | + | | + +--------+ */ + 0x00, + 0x00, + 0x90, + 0x60, + 0x60, + 0x90, + 0x00, /* Character (0x79): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |* * | - |* * | - | * * | - | * | - | * | - +----------------+ */ - 0x0000, - 0x0000, - 0x9000, - 0x9000, - 0x5000, - 0x2000, - 0x4000, + +--------+ + | | + | | + |* * | + |* * | + | * * | + | * | + | * | + +--------+ */ + 0x00, + 0x00, + 0x90, + 0x90, + 0x50, + 0x20, + 0x40, /* Character (0x7a): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | | - | | - |**** | - | * | - | * | - |**** | - | | - +----------------+ */ - 0x0000, - 0x0000, - 0xf000, - 0x2000, - 0x4000, - 0xf000, - 0x0000, + +--------+ + | | + | | + |**** | + | * | + | * | + |**** | + | | + +--------+ */ + 0x00, + 0x00, + 0xf0, + 0x20, + 0x40, + 0xf0, + 0x00, /* Character (0x7b): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - |** | - | * | - | * | - | * | - | | - +----------------+ */ - 0x2000, - 0x4000, - 0xc000, - 0x4000, - 0x4000, - 0x2000, - 0x0000, + +--------+ + | * | + | * | + |** | + | * | + | * | + | * | + | | + +--------+ */ + 0x20, + 0x40, + 0xc0, + 0x40, + 0x40, + 0x20, + 0x00, /* Character (0x7c): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +----------------+ */ - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x4000, - 0x0000, + +--------+ + | * | + | * | + | * | + | * | + | * | + | * | + | | + +--------+ */ + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x40, + 0x00, /* Character (0x7d): bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |* | - | * | - | ** | - | * | - | * | - |* | - | | - +----------------+ */ - 0x8000, - 0x4000, - 0x6000, - 0x4000, - 0x4000, - 0x8000, - 0x0000, + +--------+ + |* | + | * | + | ** | + | * | + | * | + |* | + | | + +--------+ */ + 0x80, + 0x40, + 0x60, + 0x40, + 0x40, + 0x80, + 0x00, /* Character (0x7e): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - | * * | - |* * | - | | - | | - | | - | | - | | - +----------------+ */ - 0x5000, - 0xa000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, - 0x0000, + +--------+ + | * * | + |* * | + | | + | | + | | + | | + | | + +--------+ */ + 0x50, + 0xa0, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, }; #if 0 @@ -2561,5 +2085,27 @@ static UNS_8 x5x7_width [] = #endif /* Font information structure */ -//const FONT_T font_x5x7 = {7, 0x00, 0x7E, x5x7_bits, x5x7_width}; +//const FONT_T font_x5x7 = {7, 0x, 0x7E, x5x7_bits, x5x7_width}; + + + +uint8_t x5x7_map_char_table(uint8_t ch) +{ + if ( ch > 0x7e ) + { + /* limit to largest character */ + ch = 0x7e - 32 + 7; + } + else if ( ch >= 32 ) + { + /* normal character */ + ch = ch - 32 + 7; + } + else + { + /* special character */ + } + + return ch; +} diff --git a/README.md b/README.md index 26e43edb..85ca0905 100644 --- a/README.md +++ b/README.md @@ -101,3 +101,4 @@ Hardware design material is disclosed to prevent bad quality clone. Please let m * [@hugen79](https://github.com/hugen79) * [@cho45](https://github.com/cho45) +* DL9CAT diff --git a/ili9341.c b/ili9341.c index e42d6dea..4f9edb77 100644 --- a/ili9341.c +++ b/ili9341.c @@ -334,22 +334,31 @@ ili9341_read_memory_continue(int len, uint16_t* out) ili9341_read_memory_raw(0x3E, len, out); } + + void ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) { uint16_t *buf = spi_buffer; - uint16_t bits; + uint8_t bits; int c, r; - for(c = 0; c < 7; c++) { + + ch = x5x7_map_char_table(ch); + + for(c = 0; c < 7; c++) + { bits = x5x7_bits[(ch * 7) + c]; - for (r = 0; r < 5; r++) { - *buf++ = (0x8000 & bits) ? fg : bg; + for (r = 0; r < 5; r++) + { + *buf++ = (0x80 & bits) ? fg : bg; bits <<= 1; } } ili9341_bulk(x, y, 5, 7); } + + void ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg) { @@ -360,17 +369,25 @@ ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg) } } + + void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) { uint16_t *buf = spi_buffer; - uint16_t bits; + uint8_t bits; int c, r; - for(c = 0; c < 7*size; c++) { + + ch = x5x7_map_char_table(ch); + + for(c = 0; c < 7*size; c++) + { bits = x5x7_bits[(ch * 7) + (c / size)]; - for (r = 0; r < 5*size; r++) { - *buf++ = (0x8000 & bits) ? fg : bg; - if (r % size == (size-1)) { + for (r = 0; r < 5*size; r++) + { + *buf++ = (0x80 & bits) ? fg : bg; + if (r % size == (size-1)) + { bits <<= 1; } } @@ -378,6 +395,8 @@ ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_ ili9341_bulk(x, y, 5*size, 7*size); } + + void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) { diff --git a/nanovna.h b/nanovna.h index e60924db..d5d4a5ed 100644 --- a/nanovna.h +++ b/nanovna.h @@ -147,15 +147,19 @@ extern int area_height; // font -extern const uint16_t x5x7_bits []; +extern const uint8_t x5x7_bits []; extern const uint32_t numfont20x24[][24]; -#define S_PI "\034" -#define S_MICRO "\035" -#define S_OHM "\036" -#define S_DEGREE "\037" -#define S_LARROW "\032" -#define S_RARROW "\033" +#define S_PI "\003" +#define S_MICRO "\004" +#define S_OHM "\005" +#define S_DEGREE "\006" +#define S_LARROW "\001" +#define S_RARROW "\002" + +extern uint8_t x5x7_map_char_table(uint8_t ch); + + // trace diff --git a/plot.c b/plot.c index 83ed0fba..e8f65fed 100644 --- a/plot.c +++ b/plot.c @@ -1003,19 +1003,27 @@ cell_draw_refpos(int m, int n, int w, int h) } } + + void draw_marker(int w, int h, int x, int y, int c, int ch) { int i, j; - for (j = 10; j >= 0; j--) { + + ch = x5x7_map_char_table(ch); + + for (j = 10; j >= 0; j--) + { int j0 = j / 2; - for (i = -j0; i <= j0; i++) { + for (i = -j0; i <= j0; i++) + { int x0 = x + i; int y0 = y - j; int cc = c; - if (j <= 9 && j > 2 && i >= -1 && i <= 3) { - uint16_t bits = x5x7_bits[(ch * 7) + (9-j)]; - if (bits & (0x8000>>(i+1))) + if ( j <= 9 && j > 2 && i >= -1 && i <= 3 ) + { + uint8_t bits = x5x7_bits[(ch * 7) + (9-j)]; + if ( bits & (0x80>>(i+1)) ) cc = 0; } if (y0 >= 0 && y0 < h && x0 >= 0 && x0 < w) @@ -1024,6 +1032,8 @@ draw_marker(int w, int h, int x, int y, int c, int ch) } } + + void marker_position(int m, int t, int *x, int *y) { @@ -1300,27 +1310,40 @@ request_to_draw_cells_behind_numeric_input(void) } + void cell_drawchar_5x7(int w, int h, uint8_t ch, int x, int y, uint16_t fg, int invert) { - uint16_t bits; + uint8_t bits; int c, r; + if (y <= -7 || y >= h || x <= -5 || x >= w) return; - for(c = 0; c < 7; c++) { + + ch = x5x7_map_char_table(ch); + + for(c = 0; c < 7; c++) + { if ((y + c) < 0 || (y + c) >= h) continue; + bits = x5x7_bits[(ch * 7) + c]; + if (invert) bits = ~bits; - for (r = 0; r < 5; r++) { - if ((x+r) >= 0 && (x+r) < w && (0x8000 & bits)) + + for (r = 0; r < 5; r++) + { + if ( (x+r) >= 0 && (x+r) < w && (0x80 & bits) ) spi_buffer[(y+c)*w + (x+r)] = fg; + bits <<= 1; } } } + + void cell_drawstring_5x7(int w, int h, char *str, int x, int y, uint16_t fg) { @@ -1331,16 +1354,21 @@ cell_drawstring_5x7(int w, int h, char *str, int x, int y, uint16_t fg) } } + + void cell_drawstring_invert_5x7(int w, int h, char *str, int x, int y, uint16_t fg, int invert) { - while (*str) { + while (*str) + { cell_drawchar_5x7(w, h, *str, x, y, fg, invert); x += 5; str++; } } + + static void cell_draw_marker_info(int m, int n, int w, int h) { From c7e7fdb6d48901cca2a02ceb62ebd8b462574b59 Mon Sep 17 00:00:00 2001 From: Dennis Real Date: Mon, 23 Sep 2019 18:18:13 +0200 Subject: [PATCH 02/42] Increased font size in menus --- Font5x7.c | 315 ++++++++++++++++++++++++++++++------------------------ Font8x8.c | 242 +++++++++++++++++++++++++++++++++++++++++ Makefile | 2 +- ili9341.c | 275 ++++++++++++++++++++++++++++------------------- main.c | 48 ++++----- nanovna.h | 24 +++-- plot.c | 137 +++++++++++++++++++++--- ui.c | 78 ++++++++------ 8 files changed, 798 insertions(+), 323 deletions(-) create mode 100644 Font8x8.c diff --git a/Font5x7.c b/Font5x7.c index 482444b9..c46256a9 100644 --- a/Font5x7.c +++ b/Font5x7.c @@ -13,15 +13,15 @@ const uint8_t x5x7_bits [] = { /* Character (0x00): bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +----------------+ - |**** | - |**** | - |**** | - |**** | - |**** | - |**** | - | | - +----------------+ */ + +--------+ + |**** | + |**** | + |**** | + |**** | + |**** | + |**** | + | | + +--------+ */ 0xf0, 0xf0, 0xf0, @@ -30,6 +30,45 @@ const uint8_t x5x7_bits [] = 0xf0, 0x00, + + /* Character (0x01): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | | + | * | + | *** | + |***** | + | *** | + | * | + | | + +--------+ */ + 0x00, + 0x20, + 0x70, + 0xf8, + 0x70, + 0x20, + 0x00, + + /* Character (0x02): + bbw=5, bbh=7, bbx=0, bby=-1, width=5 + +--------+ + | * * | + |* * | + | * * | + |* * | + | * * | + |* * | + | | + +--------+ */ + 0x50, + 0xa0, + 0x50, + 0xa0, + 0x50, + 0xa0, + 0x00, + /* Character (): bbw=5, bbh=7, bbx=0, bby=-1, width=5 +--------+ @@ -1954,133 +1993,133 @@ const uint8_t x5x7_bits [] = /* Character width data. */ static UNS_8 x5x7_width [] = { - 5, /* (0x00) */ - 5, /* (0x01) */ - 5, /* (0x02) */ - 5, /* (0x03) */ - 5, /* (0x04) */ - 5, /* (0x05) */ - 5, /* (0x06) */ - 5, /* (0x07) */ - 5, /* (0x08) */ - 5, /* (0x09) */ - 5, /* (0x0a) */ - 5, /* (0x0b) */ - 5, /* (0x0c) */ - 5, /* (0x0d) */ - 5, /* (0x0e) */ - 5, /* (0x0f) */ - 5, /* (0x10) */ - 5, /* (0x11) */ - 5, /* (0x12) */ - 5, /* (0x13) */ - 5, /* (0x14) */ - 5, /* (0x15) */ - 5, /* (0x16) */ - 5, /* (0x17) */ - 5, /* (0x18) */ - 5, /* (0x19) */ - 5, /* (0x1a) */ - 5, /* (0x1b) */ - 5, /* (0x1c) */ - 5, /* (0x1d) */ - 5, /* (0x1e) */ - 5, /* (0x1f) */ - 5, /* (0x20) */ - 5, /* (0x21) */ - 5, /* (0x22) */ - 5, /* (0x23) */ - 5, /* (0x24) */ - 5, /* (0x25) */ - 5, /* (0x26) */ - 5, /* (0x27) */ - 5, /* (0x28) */ - 5, /* (0x29) */ - 5, /* (0x2a) */ - 5, /* (0x2b) */ - 5, /* (0x2c) */ - 5, /* (0x2d) */ - 5, /* (0x2e) */ - 5, /* (0x2f) */ - 5, /* (0x30) */ - 5, /* (0x31) */ - 5, /* (0x32) */ - 5, /* (0x33) */ - 5, /* (0x34) */ - 5, /* (0x35) */ - 5, /* (0x36) */ - 5, /* (0x37) */ - 5, /* (0x38) */ - 5, /* (0x39) */ - 5, /* (0x3a) */ - 5, /* (0x3b) */ - 5, /* (0x3c) */ - 5, /* (0x3d) */ - 5, /* (0x3e) */ - 5, /* (0x3f) */ - 5, /* (0x40) */ - 5, /* (0x41) */ - 5, /* (0x42) */ - 5, /* (0x43) */ - 5, /* (0x44) */ - 5, /* (0x45) */ - 5, /* (0x46) */ - 5, /* (0x47) */ - 5, /* (0x48) */ - 5, /* (0x49) */ - 5, /* (0x4a) */ - 5, /* (0x4b) */ - 5, /* (0x4c) */ - 5, /* (0x4d) */ - 5, /* (0x4e) */ - 5, /* (0x4f) */ - 5, /* (0x50) */ - 5, /* (0x51) */ - 5, /* (0x52) */ - 5, /* (0x53) */ - 5, /* (0x54) */ - 5, /* (0x55) */ - 5, /* (0x56) */ - 5, /* (0x57) */ - 5, /* (0x58) */ - 5, /* (0x59) */ - 5, /* (0x5a) */ - 5, /* (0x5b) */ - 5, /* (0x5c) */ - 5, /* (0x5d) */ - 5, /* (0x5e) */ - 5, /* (0x5f) */ - 5, /* (0x60) */ - 5, /* (0x61) */ - 5, /* (0x62) */ - 5, /* (0x63) */ - 5, /* (0x64) */ - 5, /* (0x65) */ - 5, /* (0x66) */ - 5, /* (0x67) */ - 5, /* (0x68) */ - 5, /* (0x69) */ - 5, /* (0x6a) */ - 5, /* (0x6b) */ - 5, /* (0x6c) */ - 5, /* (0x6d) */ - 5, /* (0x6e) */ - 5, /* (0x6f) */ - 5, /* (0x70) */ - 5, /* (0x71) */ - 5, /* (0x72) */ - 5, /* (0x73) */ - 5, /* (0x74) */ - 5, /* (0x75) */ - 5, /* (0x76) */ - 5, /* (0x77) */ - 5, /* (0x78) */ - 5, /* (0x79) */ - 5, /* (0x7a) */ - 5, /* (0x7b) */ - 5, /* (0x7c) */ - 5, /* (0x7d) */ - 5, /* (0x7e) */ + 5, /* (0x00) */ + 5, /* (0x01) */ + 5, /* (0x02) */ + 5, /* (0x03) */ + 5, /* (0x04) */ + 5, /* (0x05) */ + 5, /* (0x06) */ + 5, /* (0x07) */ + 5, /* (0x08) */ + 5, /* (0x09) */ + 5, /* (0x0a) */ + 5, /* (0x0b) */ + 5, /* (0x0c) */ + 5, /* (0x0d) */ + 5, /* (0x0e) */ + 5, /* (0x0f) */ + 5, /* (0x10) */ + 5, /* (0x11) */ + 5, /* (0x12) */ + 5, /* (0x13) */ + 5, /* (0x14) */ + 5, /* (0x15) */ + 5, /* (0x16) */ + 5, /* (0x17) */ + 5, /* (0x18) */ + 5, /* (0x19) */ + 5, /* (0x1a) */ + 5, /* (0x1b) */ + 5, /* (0x1c) */ + 5, /* (0x1d) */ + 5, /* (0x1e) */ + 5, /* (0x1f) */ + 5, /* (0x20) */ + 5, /* (0x21) */ + 5, /* (0x22) */ + 5, /* (0x23) */ + 5, /* (0x24) */ + 5, /* (0x25) */ + 5, /* (0x26) */ + 5, /* (0x27) */ + 5, /* (0x28) */ + 5, /* (0x29) */ + 5, /* (0x2a) */ + 5, /* (0x2b) */ + 5, /* (0x2c) */ + 5, /* (0x2d) */ + 5, /* (0x2e) */ + 5, /* (0x2f) */ + 5, /* (0x30) */ + 5, /* (0x31) */ + 5, /* (0x32) */ + 5, /* (0x33) */ + 5, /* (0x34) */ + 5, /* (0x35) */ + 5, /* (0x36) */ + 5, /* (0x37) */ + 5, /* (0x38) */ + 5, /* (0x39) */ + 5, /* (0x3a) */ + 5, /* (0x3b) */ + 5, /* (0x3c) */ + 5, /* (0x3d) */ + 5, /* (0x3e) */ + 5, /* (0x3f) */ + 5, /* (0x40) */ + 5, /* (0x41) */ + 5, /* (0x42) */ + 5, /* (0x43) */ + 5, /* (0x44) */ + 5, /* (0x45) */ + 5, /* (0x46) */ + 5, /* (0x47) */ + 5, /* (0x48) */ + 5, /* (0x49) */ + 5, /* (0x4a) */ + 5, /* (0x4b) */ + 5, /* (0x4c) */ + 5, /* (0x4d) */ + 5, /* (0x4e) */ + 5, /* (0x4f) */ + 5, /* (0x50) */ + 5, /* (0x51) */ + 5, /* (0x52) */ + 5, /* (0x53) */ + 5, /* (0x54) */ + 5, /* (0x55) */ + 5, /* (0x56) */ + 5, /* (0x57) */ + 5, /* (0x58) */ + 5, /* (0x59) */ + 5, /* (0x5a) */ + 5, /* (0x5b) */ + 5, /* (0x5c) */ + 5, /* (0x5d) */ + 5, /* (0x5e) */ + 5, /* (0x5f) */ + 5, /* (0x60) */ + 5, /* (0x61) */ + 5, /* (0x62) */ + 5, /* (0x63) */ + 5, /* (0x64) */ + 5, /* (0x65) */ + 5, /* (0x66) */ + 5, /* (0x67) */ + 5, /* (0x68) */ + 5, /* (0x69) */ + 5, /* (0x6a) */ + 5, /* (0x6b) */ + 5, /* (0x6c) */ + 5, /* (0x6d) */ + 5, /* (0x6e) */ + 5, /* (0x6f) */ + 5, /* (0x70) */ + 5, /* (0x71) */ + 5, /* (0x72) */ + 5, /* (0x73) */ + 5, /* (0x74) */ + 5, /* (0x75) */ + 5, /* (0x76) */ + 5, /* (0x77) */ + 5, /* (0x78) */ + 5, /* (0x79) */ + 5, /* (0x7a) */ + 5, /* (0x7b) */ + 5, /* (0x7c) */ + 5, /* (0x7d) */ + 5, /* (0x7e) */ }; #endif @@ -2094,12 +2133,12 @@ uint8_t x5x7_map_char_table(uint8_t ch) if ( ch > 0x7e ) { /* limit to largest character */ - ch = 0x7e - 32 + 7; + ch = 0x7e - 32 + 9; } else if ( ch >= 32 ) { /* normal character */ - ch = ch - 32 + 7; + ch = ch - 32 + 9; } else { diff --git a/Font8x8.c b/Font8x8.c new file mode 100644 index 00000000..ed23ee48 --- /dev/null +++ b/Font8x8.c @@ -0,0 +1,242 @@ +#include + +const uint8_t x8x8_bits[][8]={ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /* nul */ + {0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00}, /* diamond */ + {0x00,0x50,0xa0,0x50,0xa0,0x50,0xa0,0x00}, /* multiline marker */ + {0x00,0x20,0x40,0xF8,0xF8,0x40,0x20,0x00}, /* left arrow */ + {0x00,0x20,0x10,0xF8,0xF8,0x10,0x20,0x00}, /* right arrow */ + {0x00,0x00,0xFE,0x6C,0x6C,0x6C,0x6C,0x00}, /* pi */ + {0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0x06}, /* micro */ + {0x7C,0xC6,0xC6,0xC6,0x6C,0x6C,0xEE,0x00}, /* omega */ + {0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00}, /* degree */ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /* 0x20 ' ' */ + {0x60,0xF0,0xF0,0x60,0x60,0x00,0x60,0x00}, /* 0x21 '!' */ + {0xD8,0xD8,0xD8,0x00,0x00,0x00,0x00,0x00}, /* 0x22 '"' */ + {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, /* 0x23 '#' */ + {0x30,0x7C,0xC0,0x78,0x0C,0xF8,0x30,0x00}, /* 0x24 '$' */ + {0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00}, /* 0x25 '%' */ + {0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00}, /* 0x26 '&' */ + {0x60,0x60,0xC0,0x00,0x00,0x00,0x00,0x00}, /* 0x27 ''' */ + {0x30,0x60,0xC0,0xC0,0xC0,0x60,0x30,0x00}, /* 0x28 '(' */ + {0xC0,0x60,0x30,0x30,0x30,0x60,0xC0,0x00}, /* 0x29 ')' */ + {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, /* 0x2A '*' */ + {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, /* 0x2B '+' */ + {0x00,0x00,0x00,0x00,0x00,0xE0,0x60,0xC0}, /* 0x2C ',' */ + {0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00}, /* 0x2D '-' */ + {0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}, /* 0x2E '.' */ + {0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00}, /* 0x2F '/' */ + {0x78,0xCC,0xDC,0xFC,0xEC,0xCC,0x78,0x00}, /* 0x30 '0' */ + {0x30,0xF0,0x30,0x30,0x30,0x30,0xFC,0x00}, /* 0x31 '1' */ + {0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00}, /* 0x32 '2' */ + {0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00}, /* 0x33 '3' */ + {0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x00}, /* 0x34 '4' */ + {0xFC,0xC0,0xF8,0x0C,0x0C,0xCC,0x78,0x00}, /* 0x35 '5' */ + {0x38,0x60,0xC0,0xF8,0xCC,0xCC,0x78,0x00}, /* 0x36 '6' */ + {0xFC,0xCC,0x0C,0x18,0x30,0x60,0x60,0x00}, /* 0x37 '7' */ + {0x78,0xCC,0xCC,0x78,0xCC,0xCC,0x78,0x00}, /* 0x38 '8' */ + {0x78,0xCC,0xCC,0x7C,0x0C,0x18,0x70,0x00}, /* 0x39 '9' */ + {0x00,0x00,0xC0,0xC0,0x00,0xC0,0xC0,0x00}, /* 0x3A ':' */ + {0x00,0x00,0x60,0x60,0x00,0xE0,0x60,0xC0}, /* 0x3B ';' */ + {0x18,0x30,0x60,0xC0,0x60,0x30,0x18,0x00}, /* 0x3C '<' */ + {0x00,0x00,0xFC,0x00,0xFC,0x00,0x00,0x00}, /* 0x3D '=' */ + {0xC0,0x60,0x30,0x18,0x30,0x60,0xC0,0x00}, /* 0x3E '>' */ + {0x78,0xCC,0x0C,0x18,0x30,0x00,0x30,0x00}, /* 0x3F '?' */ + {0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00}, /* 0x40 '@' */ + {0x30,0x78,0xCC,0xCC,0xFC,0xCC,0xCC,0x00}, /* 0x41 'A' */ + {0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00}, /* 0x42 'B' */ + {0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00}, /* 0x43 'C' */ + {0xFC,0x6C,0x66,0x66,0x66,0x6C,0xFC,0x00}, /* 0x44 'D' */ + {0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00}, /* 0x45 'E' */ + {0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00}, /* 0x46 'F' */ + {0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00}, /* 0x47 'G' */ + {0xCC,0xCC,0xCC,0xFC,0xCC,0xCC,0xCC,0x00}, /* 0x48 'H' */ + {0xF0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00}, /* 0x49 'I' */ + {0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00}, /* 0x4A 'J' */ + {0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00}, /* 0x4B 'K' */ + {0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00}, /* 0x4C 'L' */ + {0xC6,0xEE,0xFE,0xD6,0xC6,0xC6,0xC6,0x00}, /* 0x4D 'M' */ + {0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00}, /* 0x4E 'N' */ + {0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00}, /* 0x4F 'O' */ + {0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00}, /* 0x50 'P' */ + {0x78,0xCC,0xCC,0xCC,0xDC,0x78,0x1C,0x00}, /* 0x51 'Q' */ + {0xFC,0x66,0x66,0x7C,0x78,0x6C,0xE6,0x00}, /* 0x52 'R' */ + {0x78,0xCC,0xE0,0x38,0x1C,0xCC,0x78,0x00}, /* 0x53 'S' */ + {0xFC,0xB4,0x30,0x30,0x30,0x30,0x78,0x00}, /* 0x54 'T' */ + {0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0xFC,0x00}, /* 0x55 'U' */ + {0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x30,0x00}, /* 0x56 'V' */ + {0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00}, /* 0x57 'W' */ + {0xC6,0xC6,0x6C,0x38,0x6C,0xC6,0xC6,0x00}, /* 0x58 'X' */ + {0xCC,0xCC,0xCC,0x78,0x30,0x30,0x78,0x00}, /* 0x59 'Y' */ + {0xFE,0xCC,0x98,0x30,0x62,0xC6,0xFE,0x00}, /* 0x5A 'Z' */ + {0xF0,0xC0,0xC0,0xC0,0xC0,0xC0,0xF0,0x00}, /* 0x5B '[' */ + {0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00}, /* 0x5C '\' */ + {0xF0,0x30,0x30,0x30,0x30,0x30,0xF0,0x00}, /* 0x5D ']' */ + {0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00}, /* 0x5E '^' */ + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, /* 0x5F '_' */ + {0xC0,0xC0,0x60,0x00,0x00,0x00,0x00,0x00}, /* 0x60 '`' */ + {0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00}, /* 0x61 'a' */ + {0xE0,0x60,0x7C,0x66,0x66,0x66,0xBC,0x00}, /* 0x62 'b' */ + {0x00,0x00,0x78,0xCC,0xC0,0xCC,0x78,0x00}, /* 0x63 'c' */ + {0x1C,0x0C,0x0C,0x7C,0xCC,0xCC,0x76,0x00}, /* 0x64 'd' */ + {0x00,0x00,0x78,0xCC,0xFC,0xC0,0x78,0x00}, /* 0x65 'e' */ + {0x38,0x6C,0x60,0xF0,0x60,0x60,0xF0,0x00}, /* 0x66 'f' */ + {0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8}, /* 0x67 'g' */ + {0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00}, /* 0x68 'h' */ + {0x60,0x00,0xE0,0x60,0x60,0x60,0xF0,0x00}, /* 0x69 'i' */ + {0x18,0x00,0x78,0x18,0x18,0x18,0xD8,0x70}, /* 0x6A 'j' */ + {0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00}, /* 0x6B 'k' */ + {0xE0,0x60,0x60,0x60,0x60,0x60,0xF0,0x00}, /* 0x6C 'l' */ + {0x00,0x00,0xEC,0xFE,0xD6,0xC6,0xC6,0x00}, /* 0x6D 'm' */ + {0x00,0x00,0xF8,0xCC,0xCC,0xCC,0xCC,0x00}, /* 0x6E 'n' */ + {0x00,0x00,0x78,0xCC,0xCC,0xCC,0x78,0x00}, /* 0x6F 'o' */ + {0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0}, /* 0x70 'p' */ + {0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E}, /* 0x71 'q' */ + {0x00,0x00,0xD8,0x6C,0x6C,0x60,0xF0,0x00}, /* 0x72 'r' */ + {0x00,0x00,0x7C,0xC0,0x78,0x0C,0xF8,0x00}, /* 0x73 's' */ + {0x20,0x60,0xF8,0x60,0x60,0x68,0x30,0x00}, /* 0x74 't' */ + {0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00}, /* 0x75 'u' */ + {0x00,0x00,0xCC,0xCC,0xCC,0x78,0x30,0x00}, /* 0x76 'v' */ + {0x00,0x00,0xC6,0xC6,0xD6,0xFE,0x6C,0x00}, /* 0x77 'w' */ + {0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00}, /* 0x78 'x' */ + {0x00,0x00,0xCC,0xCC,0xCC,0x7C,0x0C,0xF8}, /* 0x79 'y' */ + {0x00,0x00,0xFC,0x98,0x30,0x64,0xFC,0x00}, /* 0x7A 'z' */ + {0x1C,0x30,0x30,0xE0,0x30,0x30,0x1C,0x00}, /* 0x7B '{' */ + {0xC0,0xC0,0xC0,0x00,0xC0,0xC0,0xC0,0x00}, /* 0x7C '|' */ + {0xE0,0x30,0x30,0x1C,0x30,0x30,0xE0,0x00}, /* 0x7D '}' */ + {0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00}, /* 0x7E '~' */ + {0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00}, /* 0x7F '' */ +}; + + + +const uint8_t x8x8_len[] = { + 1, /* nul */ + 8, /* diamond */ + 5, /* multiline marker */ + 6, /* arrow left */ + 6, /* arrow right */ + 8, /* pi */ + 8, /* micro */ + 8, /* omega */ + 6, /* degree */ + 4, /* 0x20 ' ' */ + 5, /* 0x21 '!' */ + 6, /* 0x22 '"' */ + 8, /* 0x23 '#' */ + 7, /* 0x24 '$' */ + 8, /* 0x25 '%' */ + 8, /* 0x26 '&' */ + 4, /* 0x27 ''' */ + 5, /* 0x28 '(' */ + 5, /* 0x29 ')' */ + 9, /* 0x2A '*' */ + 7, /* 0x2B '+' */ + 4, /* 0x2C ',' */ + 7, /* 0x2D '-' */ + 3, /* 0x2E '.' */ + 8, /* 0x2F '/' */ + 7, /* 0x30 '0' */ + 7, /* 0x31 '1' */ + 7, /* 0x32 '2' */ + 7, /* 0x33 '3' */ + 8, /* 0x34 '4' */ + 7, /* 0x35 '5' */ + 7, /* 0x36 '6' */ + 7, /* 0x37 '7' */ + 7, /* 0x38 '8' */ + 7, /* 0x39 '9' */ + 3, /* 0x3A ':' */ + 4, /* 0x3B ';' */ + 6, /* 0x3C '<' */ + 7, /* 0x3D '=' */ + 6, /* 0x3E '>' */ + 7, /* 0x3F '?' */ + 8, /* 0x40 '@' */ + 7, /* 0x41 'A' */ + 8, /* 0x42 'B' */ + 8, /* 0x43 'C' */ + 8, /* 0x44 'D' */ + 8, /* 0x45 'E' */ + 8, /* 0x46 'F' */ + 8, /* 0x47 'G' */ + 7, /* 0x48 'H' */ + 5, /* 0x49 'I' */ + 8, /* 0x4A 'J' */ + 8, /* 0x4B 'K' */ + 8, /* 0x4C 'L' */ + 8, /* 0x4D 'M' */ + 8, /* 0x4E 'N' */ + 8, /* 0x4F 'O' */ + 8, /* 0x50 'P' */ + 7, /* 0x51 'Q' */ + 8, /* 0x52 'R' */ + 7, /* 0x53 'S' */ + 7, /* 0x54 'T' */ + 7, /* 0x55 'U' */ + 7, /* 0x56 'V' */ + 8, /* 0x57 'W' */ + 8, /* 0x58 'X' */ + 7, /* 0x59 'Y' */ + 8, /* 0x5A 'Z' */ + 5, /* 0x5B '[' */ + 8, /* 0x5C '\' */ + 5, /* 0x5D ']' */ + 8, /* 0x5E '^' */ + 9, /* 0x5F '_' */ + 4, /* 0x60 '`' */ + 8, /* 0x61 'a' */ + 8, /* 0x62 'b' */ + 7, /* 0x63 'c' */ + 8, /* 0x64 'd' */ + 7, /* 0x65 'e' */ + 7, /* 0x66 'f' */ + 8, /* 0x67 'g' */ + 8, /* 0x68 'h' */ + 5, /* 0x69 'i' */ + 6, /* 0x6A 'j' */ + 8, /* 0x6B 'k' */ + 5, /* 0x6C 'l' */ + 8, /* 0x6D 'm' */ + 7, /* 0x6E 'n' */ + 7, /* 0x6F 'o' */ + 8, /* 0x70 'p' */ + 8, /* 0x71 'q' */ + 7, /* 0x72 'r' */ + 7, /* 0x73 's' */ + 6, /* 0x74 't' */ + 8, /* 0x75 'u' */ + 7, /* 0x76 'v' */ + 8, /* 0x77 'w' */ + 8, /* 0x78 'x' */ + 7, /* 0x79 'y' */ + 7, /* 0x7A 'z' */ + 7, /* 0x7B '{' */ + 3, /* 0x7C '|' */ + 7, /* 0x7D '}' */ + 8, /* 0x7E '~' */ + 8, /* 0x7F '' */ +}; + + + +uint8_t x8x8_map_char_table(uint8_t ch) +{ + if ( ch > 0x7f ) + { + /* limit to largest character */ + ch = 0x7f - 32 + 9; + } + else if ( ch >= 32 ) + { + /* normal character */ + ch = ch - 32 + 9; + } + else + { + /* special character */ + } + + return ch; +} + diff --git a/Makefile b/Makefile index 39a09f30..3603341d 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ CSRC = $(STARTUPSRC) \ $(STREAMSSRC) \ $(SHELLSRC) \ usbcfg.c \ - main.c si5351.c tlv320aic3204.c dsp.c plot.c ui.c ili9341.c numfont20x24.c Font5x7.c flash.c adc.c + main.c si5351.c tlv320aic3204.c dsp.c plot.c ui.c ili9341.c numfont20x24.c Font5x7.c Font8x8.c flash.c adc.c # $(TESTSRC) \ diff --git a/ili9341.c b/ili9341.c index 4f9edb77..7b8b7365 100644 --- a/ili9341.c +++ b/ili9341.c @@ -21,12 +21,12 @@ #include "hal.h" #include "nanovna.h" -#define RESET_ASSERT palClearPad(GPIOA, 15) -#define RESET_NEGATE palSetPad(GPIOA, 15) -#define CS_LOW palClearPad(GPIOB, 6) -#define CS_HIGH palSetPad(GPIOB, 6) -#define DC_CMD palClearPad(GPIOB, 7) -#define DC_DATA palSetPad(GPIOB, 7) +#define RESET_ASSERT palClearPad(GPIOA, 15) +#define RESET_NEGATE palSetPad(GPIOA, 15) +#define CS_LOW palClearPad(GPIOB, 6) +#define CS_HIGH palSetPad(GPIOB, 6) +#define DC_CMD palClearPad(GPIOB, 7) +#define DC_DATA palSetPad(GPIOB, 7) uint16_t spi_buffer[1024]; @@ -124,88 +124,88 @@ spi_init(void) void send_command(uint8_t cmd, int len, const uint8_t *data) { - CS_LOW; - DC_CMD; + CS_LOW; + DC_CMD; ssp_databit8(); - ssp_senddata(cmd); - DC_DATA; - while (len-- > 0) { + ssp_senddata(cmd); + DC_DATA; + while (len-- > 0) { ssp_senddata(*data++); - } - //CS_HIGH; + } + //CS_HIGH; } void send_command16(uint8_t cmd, int data) { - CS_LOW; - DC_CMD; + CS_LOW; + DC_CMD; ssp_databit8(); - ssp_senddata(cmd); - DC_DATA; + ssp_senddata(cmd); + DC_DATA; ssp_databit16(); - ssp_senddata16(data); - CS_HIGH; + ssp_senddata16(data); + CS_HIGH; } const uint8_t ili9341_init_seq[] = { - // cmd, len, data..., - // Power control B - 0xCF, 3, 0x00, 0x83, 0x30, - // Power on sequence control - 0xED, 4, 0x64, 0x03, 0x12, 0x81, - //0xED, 4, 0x55, 0x01, 0x23, 0x01, - // Driver timing control A - 0xE8, 3, 0x85, 0x01, 0x79, - //0xE8, 3, 0x84, 0x11, 0x7a, - // Power control A - 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, - // Pump ratio control - 0xF7, 1, 0x20, - // Driver timing control B - 0xEA, 2, 0x00, 0x00, - // POWER_CONTROL_1 - 0xC0, 1, 0x26, - // POWER_CONTROL_2 - 0xC1, 1, 0x11, - // VCOM_CONTROL_1 - 0xC5, 2, 0x35, 0x3E, - // VCOM_CONTROL_2 - 0xC7, 1, 0xBE, - // MEMORY_ACCESS_CONTROL - //0x36, 1, 0x48, // portlait - 0x36, 1, 0x28, // landscape - // COLMOD_PIXEL_FORMAT_SET : 16 bit pixel - 0x3A, 1, 0x55, - // Frame Rate - 0xB1, 2, 0x00, 0x1B, - // Gamma Function Disable - 0xF2, 1, 0x08, - // gamma set for curve 01/2/04/08 - 0x26, 1, 0x01, - // positive gamma correction - 0xE0, 15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, - // negativ gamma correction - 0xE1, 15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, - - // Column Address Set - 0x2A, 4, 0x00, 0x00, 0x01, 0x3f, // width 320 - // Page Address Set - 0x2B, 4, 0x00, 0x00, 0x00, 0xef, // height 240 - - // entry mode - 0xB7, 1, 0x06, - // display function control - 0xB6, 4, 0x0A, 0x82, 0x27, 0x00, - - // control display - //0x53, 1, 0x0c, - // diaplay brightness - //0x51, 1, 0xff, - - // sleep out - 0x11, 0, - 0 // sentinel + // cmd, len, data..., + // Power control B + 0xCF, 3, 0x00, 0x83, 0x30, + // Power on sequence control + 0xED, 4, 0x64, 0x03, 0x12, 0x81, + //0xED, 4, 0x55, 0x01, 0x23, 0x01, + // Driver timing control A + 0xE8, 3, 0x85, 0x01, 0x79, + //0xE8, 3, 0x84, 0x11, 0x7a, + // Power control A + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + // Pump ratio control + 0xF7, 1, 0x20, + // Driver timing control B + 0xEA, 2, 0x00, 0x00, + // POWER_CONTROL_1 + 0xC0, 1, 0x26, + // POWER_CONTROL_2 + 0xC1, 1, 0x11, + // VCOM_CONTROL_1 + 0xC5, 2, 0x35, 0x3E, + // VCOM_CONTROL_2 + 0xC7, 1, 0xBE, + // MEMORY_ACCESS_CONTROL + //0x36, 1, 0x48, // portlait + 0x36, 1, 0x28, // landscape + // COLMOD_PIXEL_FORMAT_SET : 16 bit pixel + 0x3A, 1, 0x55, + // Frame Rate + 0xB1, 2, 0x00, 0x1B, + // Gamma Function Disable + 0xF2, 1, 0x08, + // gamma set for curve 01/2/04/08 + 0x26, 1, 0x01, + // positive gamma correction + 0xE0, 15, 0x1F, 0x1A, 0x18, 0x0A, 0x0F, 0x06, 0x45, 0x87, 0x32, 0x0A, 0x07, 0x02, 0x07, 0x05, 0x00, + // negativ gamma correction + 0xE1, 15, 0x00, 0x25, 0x27, 0x05, 0x10, 0x09, 0x3A, 0x78, 0x4D, 0x05, 0x18, 0x0D, 0x38, 0x3A, 0x1F, + + // Column Address Set + 0x2A, 4, 0x00, 0x00, 0x01, 0x3f, // width 320 + // Page Address Set + 0x2B, 4, 0x00, 0x00, 0x00, 0xef, // height 240 + + // entry mode + 0xB7, 1, 0x06, + // display function control + 0xB6, 4, 0x0A, 0x82, 0x27, 0x00, + + // control display + //0x53, 1, 0x0c, + // diaplay brightness + //0x51, 1, 0xff, + + // sleep out + 0x11, 0, + 0 // sentinel }; void @@ -235,10 +235,10 @@ ili9341_init(void) void ili9341_pixel(int x, int y, int color) { - uint8_t xx[4] = { x >> 8, x, (x+1) >> 8, (x+1) }; - uint8_t yy[4] = { y >> 8, y, (y+1) >> 8, (y+1) }; - uint8_t cc[2] = { color >> 8, color }; - send_command(0x2A, 4, xx); + uint8_t xx[4] = { x >> 8, x, (x+1) >> 8, (x+1) }; + uint8_t yy[4] = { y >> 8, y, (y+1) >> 8, (y+1) }; + uint8_t cc[2] = { color >> 8, color }; + send_command(0x2A, 4, xx); send_command(0x2B, 4, yy); send_command(0x2C, 2, cc); //send_command16(0x2C, color); @@ -248,10 +248,10 @@ void ili9341_pixel(int x, int y, int color) void ili9341_fill(int x, int y, int w, int h, int color) { - uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; - uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; + uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; + uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; int len = w * h; - send_command(0x2A, 4, xx); + send_command(0x2A, 4, xx); send_command(0x2B, 4, yy); send_command(0x2C, 0, NULL); while (len-- > 0) @@ -261,26 +261,26 @@ void ili9341_fill(int x, int y, int w, int h, int color) #if 0 void ili9341_bulk(int x, int y, int w, int h) { - uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; - uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; - uint16_t *buf = spi_buffer; + uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; + uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; + uint16_t *buf = spi_buffer; int len = w * h; - send_command(0x2A, 4, xx); - send_command(0x2B, 4, yy); - send_command(0x2C, 0, NULL); + send_command(0x2A, 4, xx); + send_command(0x2B, 4, yy); + send_command(0x2C, 0, NULL); while (len-- > 0) ssp_senddata16(*buf++); } #else void ili9341_bulk(int x, int y, int w, int h) { - uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; - uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; + uint8_t xx[4] = { x >> 8, x, (x+w-1) >> 8, (x+w-1) }; + uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; int len = w * h; - send_command(0x2A, 4, xx); - send_command(0x2B, 4, yy); - send_command(0x2C, 0, NULL); + send_command(0x2A, 4, xx); + send_command(0x2B, 4, yy); + send_command(0x2C, 0, NULL); dmaStreamSetMemory0(dmatx, spi_buffer); dmaStreamSetTransactionSize(dmatx, len); @@ -407,6 +407,63 @@ ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, } } + + +unsigned char +ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) +{ + uint16_t *buf = spi_buffer; + uint16_t bits; + int cline, r; + + ch = x8x8_map_char_table(ch); + + for(cline = 0; cline < 8; cline++) + { + bits = x8x8_bits[ch][cline]; + + for (r = 7; r >= 0; r--) + { + *buf++ = (0x80 & bits) ? fg : bg; + bits <<= 1; + } + //*buf++ = bg; + } + ili9341_bulk(x, y, 8, 8); + + return x8x8_len[ch]; +} + + + +void +ili9341_drawstring_8x8(const char *str, int x, int y, uint16_t fg, uint16_t bg) +{ + while (*str) + { + (void)ili9341_drawchar_8x8(*str, x, y, fg, bg); + x += 8; + str++; + } +} + + + +void +ili9341_drawstring_8x8_var(const char *str, int x, int y, uint16_t fg, uint16_t bg) +{ + unsigned char clength = 0; + + while (*str) + { + clength = ili9341_drawchar_8x8(*str, x, y, fg, bg); + x += clength; + str++; + } +} + + + #define SWAP(x,y) do { int z=x; x = y; y = z; } while(0) void @@ -452,20 +509,20 @@ const font_t NF20x24 = { 20, 24, 1, 24, (const uint32_t *)numfont20x24 }; void ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint16_t bg) { - uint16_t *buf = spi_buffer; - uint32_t bits; - const uint32_t *bitmap = &font->bitmap[font->slide * ch]; - int c, r, j; - - for (c = 0; c < font->slide; c++) { - for (j = 0; j < font->scaley; j++) { - bits = bitmap[c]; - for (r = 0; r < font->width; r++) { - *buf++ = (0x80000000UL & bits) ? fg : bg; - bits <<= 1; - } - } - } + uint16_t *buf = spi_buffer; + uint32_t bits; + const uint32_t *bitmap = &font->bitmap[font->slide * ch]; + int c, r, j; + + for (c = 0; c < font->slide; c++) { + for (j = 0; j < font->scaley; j++) { + bits = bitmap[c]; + for (r = 0; r < font->width; r++) { + *buf++ = (0x80000000UL & bits) ? fg : bg; + bits <<= 1; + } + } + } ili9341_bulk(x, y, font->width, font->height); } @@ -503,7 +560,7 @@ ili9341_test(int mode) #endif #if 1 case 3: - for (i = 0; i < 10; i++) + for (i = 0; i < 10; i++) ili9341_drawfont(i, &NF20x24, i*20, 120, colormap[i%6], 0x0000); break; #endif diff --git a/main.c b/main.c index 3653ca02..ad160aea 100644 --- a/main.c +++ b/main.c @@ -109,25 +109,25 @@ toggle_sweep(void) } float bessel0(float x) { - const float eps = 0.0001; + const float eps = 0.0001; - float ret = 0; - float term = 1; - float m = 0; + float ret = 0; + float term = 1; + float m = 0; - while (term > eps * ret) { - ret += term; - ++m; - term *= (x*x) / (4*m*m); - } + while (term > eps * ret) { + ret += term; + ++m; + term *= (x*x) / (4*m*m); + } - return ret; + return ret; } float kaiser_window(float k, float n, float beta) { - if (beta == 0.0) return 1.0; - float r = (2 * k) / (n - 1) - 1; - return bessel0(beta * sqrt(1 - r * r)) / bessel0(beta); + if (beta == 0.0) return 1.0; + float r = (2 * k) / (n - 1) - 1; + return bessel0(beta * sqrt(1 - r * r)) / bessel0(beta); } static @@ -1379,17 +1379,17 @@ const struct { uint16_t refpos; float scale_unit; } trace_info[] = { - { "LOGMAG", 7, 10 }, - { "PHASE", 4, 90 }, - { "DELAY", 4, 1 }, - { "SMITH", 0, 1 }, - { "POLAR", 0, 1 }, - { "LINEAR", 0, 0.125 }, - { "SWR", 0, 1 }, - { "REAL", 4, 0.25 }, - { "IMAG", 4, 0.25 }, - { "R", 0, 100 }, - { "X", 4, 100 } + { "LGMG", 7, 10 }, + { "PHA", 4, 90 }, + { "DEL", 4, 1 }, + { "SMI", 0, 1 }, + { "PLR", 0, 1 }, + { "LIN", 0, 0.125 }, + { "SWR", 0, 1 }, + { "REAL", 4, 0.25 }, + { "IMAG", 4, 0.25 }, + { "R", 0, 100 }, + { "X", 4, 100 } }; const char * const trc_channel_name[] = { diff --git a/nanovna.h b/nanovna.h index d5d4a5ed..fc1473f0 100644 --- a/nanovna.h +++ b/nanovna.h @@ -138,6 +138,8 @@ extern void tlv320aic3204_adc_filter_enable(int enable); #define HEIGHT 233 #define CELLOFFSETX 5 +#define CELLOFFSETX_8x8 8 + #define AREA_WIDTH_NORMAL (WIDTH + CELLOFFSETX*2) extern int area_width; @@ -147,17 +149,22 @@ extern int area_height; // font -extern const uint8_t x5x7_bits []; +extern const uint8_t x5x7_bits[]; +extern const uint8_t x8x8_bits[][8]; +extern const uint8_t x8x8_len[]; extern const uint32_t numfont20x24[][24]; -#define S_PI "\003" -#define S_MICRO "\004" -#define S_OHM "\005" -#define S_DEGREE "\006" -#define S_LARROW "\001" -#define S_RARROW "\002" +#define S_DIAMOND "\001" +#define S_MULTIL "\002" +#define S_PI "\005" +#define S_MICRO "\006" +#define S_OHM "\007" +#define S_DEGREE "\010" +#define S_LARROW "\003" +#define S_RARROW "\004" extern uint8_t x5x7_map_char_table(uint8_t ch); +extern uint8_t x8x8_map_char_table(uint8_t ch); @@ -275,6 +282,9 @@ void ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); +unsigned char ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); +void ili9341_drawstring_8x8(const char *str, int x, int y, uint16_t fg, uint16_t bg); +void ili9341_drawstring_8x8_var(const char *str, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint16_t bg); void ili9341_read_memory(int x, int y, int w, int h, int len, uint16_t* out); void ili9341_read_memory_continue(int len, uint16_t* out); diff --git a/plot.c b/plot.c index e8f65fed..bcade095 100644 --- a/plot.c +++ b/plot.c @@ -1369,29 +1369,133 @@ cell_drawstring_invert_5x7(int w, int h, char *str, int x, int y, uint16_t fg, i +unsigned char +cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, int invert) +{ + uint8_t bits, charlen = 8; + int cline, r; + + if (y <= -8 || y >= h || x <= -8 || x >= w) + return 0; + + ch = x8x8_map_char_table(ch); + + for (cline = 0; cline < 8; cline++) + { + if ((y + cline) < 0 || (y + cline) >= h) + continue; + + bits = x8x8_bits[ch][cline]; + + if (invert) + bits = ~bits; + + if ( var != FALSE ) + { + charlen = x8x8_len[ch]; + } + + for (r = 0; r < charlen; r++) + { + if ( (x+r) >= 0 && (x+r) < w && (0x80 & bits) ) + spi_buffer[(y+cline)*w + (x+r)] = fg; + + bits <<= 1; + } + } + + return x8x8_len[ch]; +} + + + +void +cell_drawstring_8x8(int w, int h, char *str, int x, int y, uint16_t fg) +{ + while (*str) + { + cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, FALSE); + x += 8; + str++; + } +} + + + +void +cell_drawstring_invert_8x8(int w, int h, char *str, int x, int y, uint16_t fg, int invert) +{ + while (*str) + { + cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, invert); + x += 8; + str++; + } +} + + + +void +cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg) +{ + unsigned char clength = 0; + + while (*str) + { + clength = cell_drawchar_8x8(w, h, *str, x, y, fg, TRUE, FALSE); + x += clength; + str++; + } +} + + + +void +cell_drawstring_invert_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, int invert) +{ + unsigned char clength = 0; + + while (*str) + { + clength = cell_drawchar_8x8(w, h, *str, x, y, fg, TRUE, invert); + x += clength; + str++; + } +} + + + static void cell_draw_marker_info(int m, int n, int w, int h) { char buf[24]; int t; + if (n != 0) return; + if (active_marker < 0) return; + int idx = markers[active_marker].index; int j = 0; - for (t = 0; t < TRACES_MAX; t++) { + + for (t = 0; t < TRACES_MAX; t++) + { if (!trace[t].enabled) continue; + int xpos = 1 + (j%2)*146; - int ypos = 1 + (j/2)*7; - xpos -= m * CELLWIDTH -CELLOFFSETX; + int ypos = 1 + (j/2)*8; + xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; - chsnprintf(buf, sizeof buf, "CH%d", trace[t].channel); + chsnprintf(buf, sizeof buf, "CH%d:", trace[t].channel); cell_drawstring_invert_5x7(w, h, buf, xpos, ypos, config.trace_color[t], t == uistat.current_trace); + xpos += 20; trace_get_info(t, buf, sizeof buf); cell_drawstring_5x7(w, h, buf, xpos, ypos, config.trace_color[t]); + xpos += 64; trace_get_value_string(t, buf, sizeof buf, measured[trace[t].channel][idx], frequencies[idx]); cell_drawstring_5x7(w, h, buf, xpos, ypos, config.trace_color[t]); @@ -1400,26 +1504,31 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw marker frequency int xpos = 192; - int ypos = 1 + (j/2)*7; + int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH -CELLOFFSETX; ypos -= n * CELLHEIGHT; chsnprintf(buf, sizeof buf, "%d:", active_marker + 1); cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); xpos += 16; - if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) { - frequency_string(buf, sizeof buf, frequencies[idx]); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); - } else { - chsnprintf(buf, sizeof buf, "%d ns %.1f m", (uint16_t)(time_of_index(idx) * 1e9), distance_of_index(idx)); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + + if ( (domain_mode & DOMAIN_MODE) == DOMAIN_FREQ ) + { + frequency_string(buf, sizeof buf, frequencies[idx]); + cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + } + else + { + chsnprintf(buf, sizeof buf, "%d ns %.1f m", (uint16_t)(time_of_index(idx) * 1e9), distance_of_index(idx)); + cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); } // draw marker delta - if (previous_marker >= 0 && active_marker != previous_marker && markers[previous_marker].enabled) { + if ( previous_marker >= 0 && active_marker != previous_marker && markers[previous_marker].enabled ) + { int idx0 = markers[previous_marker].index; xpos = 192; xpos -= m * CELLWIDTH -CELLOFFSETX; - ypos += 7; + ypos += 8; chsnprintf(buf, sizeof buf, "\001%d:", previous_marker+1); cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); xpos += 16; @@ -1428,6 +1537,8 @@ cell_draw_marker_info(int m, int n, int w, int h) } } + + void frequency_string(char *buf, size_t len, int32_t freq) { diff --git a/ui.c b/ui.c index bc4acd03..3660acbd 100644 --- a/ui.c +++ b/ui.c @@ -404,6 +404,11 @@ show_version(void) ili9341_drawstring_5x7("Architecture: " PORT_ARCHITECTURE_NAME " Core Variant: " PORT_CORE_VARIANT_NAME, x, y += 10, 0xffff, 0x0000); ili9341_drawstring_5x7("Port Info: " PORT_INFO, x, y += 10, 0xffff, 0x0000); ili9341_drawstring_5x7("Platform: " PLATFORM_NAME, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8("Hello world" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Hello world" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("ABCDEFGHIJKL MNOPQRSTUVWXYZ" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("abcdefghijkl mnopqrstuvwxyz" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("0123456790" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); while (true) { if (touch_check() == EVT_TOUCH_PRESSED) @@ -877,10 +882,10 @@ const menuitem_t menu_save[] = { }; const menuitem_t menu_cal[] = { - { MT_SUBMENU, "CALIBRATE", menu_calop }, + { MT_SUBMENU, S_RARROW" CALIBR", menu_calop }, { MT_SUBMENU, "SAVE", menu_save }, { MT_CALLBACK, "RESET", menu_cal2_cb }, - { MT_CALLBACK, "CORRECTION", menu_cal2_cb }, + { MT_CALLBACK, "Correct.", menu_cal2_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -899,8 +904,8 @@ const menuitem_t menu_format2[] = { { MT_CALLBACK, "LINEAR", menu_format2_cb }, { MT_CALLBACK, "REAL", menu_format2_cb }, { MT_CALLBACK, "IMAG", menu_format2_cb }, - { MT_CALLBACK, "RESISTANCE", menu_format2_cb }, - { MT_CALLBACK, "REACTANCE", menu_format2_cb }, + { MT_CALLBACK, "RESIST.", menu_format2_cb }, + { MT_CALLBACK, "REACT.", menu_format2_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -919,17 +924,17 @@ const menuitem_t menu_format[] = { }; const menuitem_t menu_scale[] = { - { MT_CALLBACK, "SCALE/DIV", menu_scale_cb }, - { MT_CALLBACK, "\2REFERENCE\0POSITION", menu_scale_cb }, - { MT_CALLBACK, "\2ELECTRICAL\0DELAY", menu_scale_cb }, + { MT_CALLBACK, "Scle/Div", menu_scale_cb }, + { MT_CALLBACK, "\2Rfrnce\0Position", menu_scale_cb }, + { MT_CALLBACK, "\2Electr.\0Delay", menu_scale_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; const menuitem_t menu_channel[] = { - { MT_CALLBACK, "\2CH0\0REFLECT", menu_channel_cb }, - { MT_CALLBACK, "\2CH1\0THROUGH", menu_channel_cb }, + { MT_CALLBACK, "\2CH 0\0REFLECT", menu_channel_cb }, + { MT_CALLBACK, "\2CH 1\0THROUGH", menu_channel_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -943,12 +948,12 @@ const menuitem_t menu_transform_window[] = { }; const menuitem_t menu_transform[] = { - { MT_CALLBACK, "\2TRANSFORM\0ON", menu_transform_cb }, - { MT_CALLBACK, "\2LOW PASS\0IMPULSE", menu_transform_cb }, - { MT_CALLBACK, "\2LOW PASS\0STEP", menu_transform_cb }, - { MT_CALLBACK, "BANDPASS", menu_transform_cb }, + { MT_CALLBACK, "\2TRANSFO\0ON", menu_transform_cb }, + { MT_CALLBACK, "\2LOWPASS\0IMPULSE", menu_transform_cb }, + { MT_CALLBACK, "\2LOWPASS\0STEP", menu_transform_cb }, + { MT_CALLBACK, "BANDP.", menu_transform_cb }, { MT_SUBMENU, "WINDOW", menu_transform_window }, - { MT_CALLBACK, "\2VELOCITY\0FACTOR", menu_transform_cb }, + { MT_CALLBACK, "\2Velocity\0FACTOR", menu_transform_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -958,7 +963,7 @@ const menuitem_t menu_display[] = { { MT_SUBMENU, "FORMAT", menu_format }, { MT_SUBMENU, "SCALE", menu_scale }, { MT_SUBMENU, "CHANNEL", menu_channel }, - { MT_SUBMENU, "TRANSFORM", menu_transform }, + { MT_SUBMENU, "TRNSFRM", menu_transform }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -995,27 +1000,27 @@ const menuitem_t menu_marker[] = { }; const menuitem_t menu_recall[] = { - { MT_CALLBACK, "RECALL 0", menu_recall_cb }, - { MT_CALLBACK, "RECALL 1", menu_recall_cb }, - { MT_CALLBACK, "RECALL 2", menu_recall_cb }, - { MT_CALLBACK, "RECALL 3", menu_recall_cb }, - { MT_CALLBACK, "RECALL 4", menu_recall_cb }, + { MT_CALLBACK, "RECALL0", menu_recall_cb }, + { MT_CALLBACK, "RECALL1", menu_recall_cb }, + { MT_CALLBACK, "RECALL2", menu_recall_cb }, + { MT_CALLBACK, "RECALL3", menu_recall_cb }, + { MT_CALLBACK, "RECALL4", menu_recall_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; const menuitem_t menu_dfu[] = { - { MT_CALLBACK, "\2RESET AND\0ENTER DFU", menu_dfu_cb }, - { MT_CANCEL, S_LARROW"CANCEL", NULL }, + { MT_CALLBACK, "\2RESET+\0Ent DFU", menu_dfu_cb }, + { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; const menuitem_t menu_config[] = { - { MT_CALLBACK, "TOUCH CAL", menu_config_cb }, - { MT_CALLBACK, "TOUCH TEST", menu_config_cb }, + { MT_CALLBACK, "\2TOUCH\0CAL", menu_config_cb }, + { MT_CALLBACK, "\2TOUCH\0TEST", menu_config_cb }, { MT_CALLBACK, "SAVE", menu_config_cb }, { MT_CALLBACK, "VERSION", menu_config_cb }, - { MT_SUBMENU, S_RARROW"DFU", menu_dfu }, + { MT_SUBMENU, " " S_RARROW " DFU", menu_dfu }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -1341,30 +1346,41 @@ void draw_menu_buttons(const menuitem_t *menu) { int i = 0; - for (i = 0; i < 7; i++) { + for (i = 0; i < 7; i++) + { const char *l1, *l2; if (menu[i].type == MT_NONE) break; if (menu[i].type == MT_BLANK) continue; + int y = 32*i; + uint16_t bg = config.menu_normal_color; uint16_t fg = 0x0000; + // focus only in MENU mode but not in KEYPAD mode if (ui_mode == UI_MENU && i == selection) bg = config.menu_active_color; + ili9341_fill(320-60, y, 60, 30, bg); menu_item_modify_attribute(menu, i, &fg, &bg); - if (menu_is_multiline(menu[i].label, &l1, &l2)) { - ili9341_drawstring_5x7(l1, 320-54, y+8, fg, bg); - ili9341_drawstring_5x7(l2, 320-54, y+15, fg, bg); - } else { - ili9341_drawstring_5x7(menu[i].label, 320-54, y+12, fg, bg); + + if (menu_is_multiline(menu[i].label, &l1, &l2)) + { + ili9341_drawstring_8x8_var(l1, 320-57, y+7, fg, bg); + ili9341_drawstring_8x8_var(l2, 320-57, y+16, fg, bg); + } + else + { + ili9341_drawstring_8x8_var(menu[i].label, 320-57, y+12, fg, bg); } } } + + void menu_select_touch(int i) { From f5a8e8932d7464036397319c86a5942589fd0b2c Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Mon, 23 Sep 2019 22:35:30 +0200 Subject: [PATCH 03/42] increase font size --- ui.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui.c b/ui.c index 3660acbd..16d5e9f5 100644 --- a/ui.c +++ b/ui.c @@ -429,8 +429,8 @@ enter_dfu(void) // leave a last message ili9341_fill(0, 0, 320, 240, 0); - ili9341_drawstring_5x7("DFU: Device Firmware Update Mode", x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("To exit DFU mode, please reset device yourself.", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("DFU: Device Firmware Update Mode", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("To exit DFU mode, please reset device yourself.", x, y += 10, 0xffff, 0x0000); // see __early_init in ./NANOVNA_STM32_F072/board.c *((unsigned long *)BOOT_FROM_SYTEM_MEMORY_MAGIC_ADDRESS) = BOOT_FROM_SYTEM_MEMORY_MAGIC; From 995f5592d441f46cbf65784265e746a6f978cf4b Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Fri, 27 Sep 2019 17:28:26 +0200 Subject: [PATCH 04/42] more parts with bigger font --- nanovna.h | 2 +- plot.c | 201 ++++++++++++++++++++++++++++++++++-------------------- ui.c | 67 ++++++++++-------- 3 files changed, 164 insertions(+), 106 deletions(-) diff --git a/nanovna.h b/nanovna.h index aedb96df..196a5f9c 100644 --- a/nanovna.h +++ b/nanovna.h @@ -140,7 +140,6 @@ extern void tlv320aic3204_adc_filter_enable(int enable); #define HEIGHT 233 #define CELLOFFSETX 5 -#define CELLOFFSETX_8x8 8 #define AREA_WIDTH_NORMAL (WIDTH + CELLOFFSETX*2) @@ -250,6 +249,7 @@ void force_set_markmap(void); void draw_all_cells(void); void draw_cal_status(void); +void draw_frequencies(void); void markmap_all_markers(void); diff --git a/plot.c b/plot.c index 2485f3fb..53190537 100644 --- a/plot.c +++ b/plot.c @@ -744,7 +744,7 @@ clear_markmap(void) memset(markmap[current_mappage], 0, sizeof markmap[current_mappage]); } -void inline +inline void force_set_markmap(void) { memset(markmap[current_mappage], 0xff, sizeof markmap[current_mappage]); @@ -1065,27 +1065,37 @@ search_nearest_index(int x, int y, int t) return min_i; } + + void cell_draw_markers(int m, int n, int w, int h) { int x0 = m * CELLWIDTH; int y0 = n * CELLHEIGHT; int t, i; - for (i = 0; i < 4; i++) { + for (i = 0; i < 4; i++) + { if (!markers[i].enabled) continue; - for (t = 0; t < TRACES_MAX; t++) { + + for (t = 0; t < TRACES_MAX; t++) + { if (!trace[t].enabled) continue; + uint32_t index = trace_index[t][markers[i].index]; int x = CELL_X(index) - x0; int y = CELL_Y(index) - y0; + if (x > -6 && x < w+6 && y >= 0 && y < h+12) draw_marker(w, h, x, y, config.trace_color[t], '1' + i); + } } } + + void markmap_marker(int marker) { @@ -1143,13 +1153,16 @@ draw_cell(int m, int n) if (x0off + w > area_width) w = area_width - x0off; + if (y0 + h > area_height) h = area_height - y0; + if (w <= 0 || h <= 0) return; uint16_t grid_mode = 0; - for (t = 0; t < TRACES_MAX; t++) { + for (t = 0; t < TRACES_MAX; t++) + { if (!trace[t].enabled) continue; @@ -1165,24 +1178,35 @@ draw_cell(int m, int n) PULSE; /* draw grid */ - if (grid_mode & GRID_RECTANGULAR) { - for (x = 0; x < w; x++) { + if (grid_mode & GRID_RECTANGULAR) + { + for (x = 0; x < w; x++) + { uint16_t c = rectangular_grid_x(x+x0off); for (y = 0; y < h; y++) spi_buffer[y * w + x] = c; } - for (y = 0; y < h; y++) { + + for (y = 0; y < h; y++) + { uint16_t c = rectangular_grid_y(y+y0); for (x = 0; x < w; x++) + { if (x+x0off >= 0 && x+x0off <= WIDTH) spi_buffer[y * w + x] |= c; + } } - } else { + } + else + { memset(spi_buffer, 0, sizeof spi_buffer); } if (grid_mode & (GRID_SMITH|GRID_ADMIT|GRID_POLAR)) { - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { + + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { uint16_t c = 0; if (grid_mode & GRID_SMITH) c = smith_grid(x+x0off, y+y0); @@ -1375,8 +1399,8 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v uint8_t bits, charlen = 8; int cline, r; - if (y <= -8 || y >= h || x <= -8 || x >= w) - return 0; +// if (y <= -8 || y >= h || x <= -8 || x >= w) +// return 0; ch = x8x8_map_char_table(ch); @@ -1503,12 +1527,12 @@ cell_draw_marker_info(int m, int n, int w, int h) } // draw marker frequency - int xpos = 192; + int xpos = 165; int ypos = 1 + (j/2)*8; - xpos -= m * CELLWIDTH -CELLOFFSETX; + xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; chsnprintf(buf, sizeof buf, "%d:", active_marker + 1); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff); xpos += 16; if ( (domain_mode & DOMAIN_MODE) == DOMAIN_FREQ ) @@ -1527,14 +1551,15 @@ cell_draw_marker_info(int m, int n, int w, int h) { int idx0 = markers[previous_marker].index; xpos = 192; - xpos -= m * CELLWIDTH -CELLOFFSETX; - ypos += 8; + xpos -= m * CELLWIDTH - CELLOFFSETX; + ypos += 7; chsnprintf(buf, sizeof buf, "\001%d:", previous_marker+1); cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); xpos += 16; frequency_string(buf, sizeof buf, frequencies[idx] - frequencies[idx0]); cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); } + } @@ -1561,94 +1586,120 @@ frequency_string(char *buf, size_t len, int32_t freq) } } + + void draw_frequencies(void) { char buf[24]; - if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) { - if (frequency1 > 0) { - int start = frequency0; - int stop = frequency1; - strcpy(buf, "START "); - frequency_string(buf+6, 24-6, start); - strcat(buf, " "); - ili9341_drawstring_5x7(buf, OFFSETX, 233, 0xffff, 0x0000); - strcpy(buf, "STOP "); - frequency_string(buf+5, 24-5, stop); - strcat(buf, " "); - ili9341_drawstring_5x7(buf, 205, 233, 0xffff, 0x0000); - } else if (frequency1 < 0) { - int fcenter = frequency0; - int fspan = -frequency1; - strcpy(buf, "CENTER "); - frequency_string(buf+7, 24-7, fcenter); - strcat(buf, " "); - ili9341_drawstring_5x7(buf, OFFSETX, 233, 0xffff, 0x0000); - strcpy(buf, "SPAN "); - frequency_string(buf+5, 24-5, fspan); - strcat(buf, " "); - ili9341_drawstring_5x7(buf, 205, 233, 0xffff, 0x0000); - } else { - int fcenter = frequency0; - chsnprintf(buf, 24, "CW %d.%03d %03d MHz ", - (int)(fcenter / 1000000), - (int)((fcenter / 1000) % 1000), - (int)(fcenter % 1000)); - ili9341_drawstring_5x7(buf, OFFSETX, 233, 0xffff, 0x0000); - chsnprintf(buf, 24, " "); - ili9341_drawstring_5x7(buf, 205, 233, 0xffff, 0x0000); - } - } else { - strcpy(buf, "START 0s "); - ili9341_drawstring_5x7(buf, OFFSETX, 233, 0xffff, 0x0000); - + if ((domain_mode & DOMAIN_MODE) == DOMAIN_FREQ) + { + if (frequency1 > 0) + { + int start = frequency0; + int stop = frequency1; + strcpy(buf, "START "); + frequency_string(buf+6, 24-6, start); + strcat(buf, " "); + ili9341_drawstring_8x8_var(buf, OFFSETX, 233, 0xffff, 0x0000); strcpy(buf, "STOP "); - chsnprintf(buf+5, 24-5, "%d ns", (uint16_t)(time_of_index(101) * 1e9)); - strcat(buf, " "); - ili9341_drawstring_5x7(buf, 205, 233, 0xffff, 0x0000); + frequency_string(buf+5, 24-5, stop); + strcat(buf, " "); + ili9341_drawstring_8x8_var(buf, 165, 233, 0xffff, 0x0000); + } + else if (frequency1 < 0) + { + int fcenter = frequency0; + int fspan = -frequency1; + strcpy(buf, "CENTER "); + frequency_string(buf+7, 24-7, fcenter); + strcat(buf, " "); + ili9341_drawstring_8x8_var(buf, OFFSETX, 233, 0xffff, 0x0000); + strcpy(buf, "SPAN "); + frequency_string(buf+5, 24-5, fspan); + strcat(buf, " "); + ili9341_drawstring_8x8_var(buf, 170, 233, 0xffff, 0x0000); + } + else + { + int fcenter = frequency0; + chsnprintf(buf, 24, "CW %d.%03d %03d MHz ", + (int)(fcenter / 1000000), + (int)((fcenter / 1000) % 1000), + (int)(fcenter % 1000)); + ili9341_drawstring_8x8_var(buf, OFFSETX, 233, 0xffff, 0x0000); + chsnprintf(buf, 24, " "); + ili9341_drawstring_8x8_var(buf, 165, 233, 0xffff, 0x0000); + } + } + else + { + strcpy(buf, "START 0s "); + ili9341_drawstring_8x8_var(buf, OFFSETX, 233, 0xffff, 0x0000); + + strcpy(buf, "STOP "); + chsnprintf(buf+5, 24-5, "%d ns", (uint16_t)(time_of_index(101) * 1e9)); + strcat(buf, " "); + ili9341_drawstring_8x8_var(buf, 165, 233, 0xffff, 0x0000); } } + + void draw_cal_status(void) { int x = 0; int y = 100; -#define YSTEP 7 - ili9341_fill(0, y, 10, 6*YSTEP, 0x0000); - if (cal_status & CALSTAT_APPLY) { - char c[3] = "C0"; - c[1] += lastsaveid; +#define YSTEP 12 + ili9341_fill(0, y, 10, 8*YSTEP, 0x0000); + if (cal_status & CALSTAT_APPLY) + { + char ch = 'C'; + char ch2 = '0' + lastsaveid; + if (cal_status & CALSTAT_INTERPOLATED) - c[0] = 'c'; + ch = 'c'; else if (active_props == ¤t_props) - c[1] = '*'; - ili9341_drawstring_5x7(c, x, y, 0xffff, 0x0000); + ch2 = '*'; + + ili9341_drawchar_8x8(ch, x, y, 0xffff, 0x0000); + y += 8; + ili9341_drawchar_8x8(ch2, x+1, y, 0xffff, 0x0000); y += YSTEP; } - if (cal_status & CALSTAT_ED) { - ili9341_drawstring_5x7("D", x, y, 0xffff, 0x0000); + + if (cal_status & CALSTAT_ED) + { + ili9341_drawstring_8x8("D", x, y, 0xffff, 0x0000); y += YSTEP; } - if (cal_status & CALSTAT_ER) { - ili9341_drawstring_5x7("R", x, y, 0xffff, 0x0000); + if (cal_status & CALSTAT_ER) + { + ili9341_drawstring_8x8("R", x, y, 0xffff, 0x0000); y += YSTEP; } - if (cal_status & CALSTAT_ES) { - ili9341_drawstring_5x7("S", x, y, 0xffff, 0x0000); + if (cal_status & CALSTAT_ES) + { + ili9341_drawstring_8x8("S", x, y, 0xffff, 0x0000); y += YSTEP; } - if (cal_status & CALSTAT_ET) { - ili9341_drawstring_5x7("T", x, y, 0xffff, 0x0000); + if (cal_status & CALSTAT_ET) + { + ili9341_drawstring_8x8("T", x, y, 0xffff, 0x0000); y += YSTEP; } - if (cal_status & CALSTAT_EX) { - ili9341_drawstring_5x7("X", x, y, 0xffff, 0x0000); + if (cal_status & CALSTAT_EX) + { + ili9341_drawstring_8x8("X", x, y, 0xffff, 0x0000); y += YSTEP; } + } + + void draw_battery_status(void) { diff --git a/ui.c b/ui.c index 16d5e9f5..765554a6 100644 --- a/ui.c +++ b/ui.c @@ -21,6 +21,7 @@ #include "ch.h" #include "hal.h" #include "nanovna.h" +#include "chprintf.h" #include #include @@ -317,7 +318,7 @@ touch_cal_exec(void) ili9341_fill(0, 0, 320, 240, 0); ili9341_line(0, 0, 0, 32, 0xffff); ili9341_line(0, 0, 32, 0, 0xffff); - ili9341_drawstring_5x7("TOUCH UPPER LEFT", 10, 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("TOUCH UPPER LEFT", 10, 10, 0xffff, 0x0000); do { status = touch_check(); @@ -328,7 +329,7 @@ touch_cal_exec(void) ili9341_fill(0, 0, 320, 240, 0); ili9341_line(320-1, 240-1, 320-1, 240-32, 0xffff); ili9341_line(320-1, 240-1, 320-32, 240-1, 0xffff); - ili9341_drawstring_5x7("TOUCH LOWER RIGHT", 230, 220, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("TOUCH LOWER RIGHT", 200, 220, 0xffff, 0x0000); do { status = touch_check(); @@ -345,6 +346,17 @@ touch_cal_exec(void) touch_start_watchdog(); } + + +void +touch_position(int *x, int *y) +{ + *x = (last_touch_x - config.touch_cal[0]) * 16 / config.touch_cal[2]; + *y = (last_touch_y - config.touch_cal[1]) * 16 / config.touch_cal[3]; +} + + + void touch_draw_test(void) { @@ -355,7 +367,7 @@ touch_draw_test(void) adc_stop(ADC1); ili9341_fill(0, 0, 320, 240, 0); - ili9341_drawstring_5x7("TOUCH TEST: DRAG PANEL", OFFSETX, 233, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("TOUCH TEST: DRAG PANEL", OFFSETX, 232, 0xffff, 0x0000); do { status = touch_check(); @@ -375,13 +387,6 @@ touch_draw_test(void) } -void -touch_position(int *x, int *y) -{ - *x = (last_touch_x - config.touch_cal[0]) * 16 / config.touch_cal[2]; - *y = (last_touch_y - config.touch_cal[1]) * 16 / config.touch_cal[3]; -} - void show_version(void) @@ -394,21 +399,19 @@ show_version(void) ili9341_drawstring_size(BOARD_NAME, x, y, 0xffff, 0x0000, 4); y += 25; - ili9341_drawstring_5x7("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Licensed under GPL. See: https://github.com/ttrftech/NanoVNA", x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Version: " VERSION, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Build Time: " __DATE__ " - " __TIME__, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Licensed under GPL.", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var(" see: https://github.com/ttrftech/NanoVNA", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Version: " VERSION, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Build Time: " __DATE__ " - " __TIME__, x, y += 10, 0xffff, 0x0000); + y += 5; + ili9341_drawstring_8x8_var("Kernel: " CH_KERNEL_VERSION, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Compiler: " PORT_COMPILER_NAME, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Architecture: " PORT_ARCHITECTURE_NAME " Core Variant: " PORT_CORE_VARIANT_NAME, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Port Info: " PORT_INFO, x, y += 10, 0xffff, 0x0000); y += 5; - ili9341_drawstring_5x7("Kernel: " CH_KERNEL_VERSION, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Compiler: " PORT_COMPILER_NAME, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Architecture: " PORT_ARCHITECTURE_NAME " Core Variant: " PORT_CORE_VARIANT_NAME, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Port Info: " PORT_INFO, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_5x7("Platform: " PLATFORM_NAME, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8("Hello world" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var("Hello world" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var("ABCDEFGHIJKL MNOPQRSTUVWXYZ" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var("abcdefghijkl mnopqrstuvwxyz" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var("0123456790" S_PI S_MICRO S_OHM S_DEGREE S_LARROW S_RARROW, x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Platform: ", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var(PLATFORM_NAME, x, y += 10, 0xffff, 0x0000); while (true) { if (touch_check() == EVT_TOUCH_PRESSED) @@ -425,11 +428,15 @@ enter_dfu(void) { adc_stop(ADC1); - int x = 5, y = 5; + int x = 100, y = 20; // leave a last message ili9341_fill(0, 0, 320, 240, 0); - ili9341_drawstring_8x8_var("DFU: Device Firmware Update Mode", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_size("DFU", x+30, y, 0xffff, 0x0000, 4); + x = 5; + y += 50; + + ili9341_drawstring_8x8_var("Device Firmware Update Mode", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("To exit DFU mode, please reset device yourself.", x, y += 10, 0xffff, 0x0000); // see __early_init in ./NANOVNA_STM32_F072/board.c @@ -980,10 +987,10 @@ const menuitem_t menu_stimulus[] = { }; const menuitem_t menu_marker_sel[] = { - { MT_CALLBACK, "MARKER 1", menu_marker_sel_cb }, - { MT_CALLBACK, "MARKER 2", menu_marker_sel_cb }, - { MT_CALLBACK, "MARKER 3", menu_marker_sel_cb }, - { MT_CALLBACK, "MARKER 4", menu_marker_sel_cb }, + { MT_CALLBACK, "MARKER1", menu_marker_sel_cb }, + { MT_CALLBACK, "MARKER2", menu_marker_sel_cb }, + { MT_CALLBACK, "MARKER3", menu_marker_sel_cb }, + { MT_CALLBACK, "MARKER4", menu_marker_sel_cb }, { MT_CALLBACK, "ALL OFF", menu_marker_sel_cb }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel From b3ce142d2abc69962b06b4c409c1145755398602 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Fri, 27 Sep 2019 17:38:04 +0200 Subject: [PATCH 05/42] remove compiler warnings --- main.c | 6 ++++-- nanovna.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index c7de7670..48aedd47 100644 --- a/main.c +++ b/main.c @@ -36,6 +36,8 @@ static void apply_error_term(void); static void apply_error_term_at(int i); +static void apply_edelay_at(int i); + static void cal_interpolate(int s); void sweep(void); @@ -141,7 +143,7 @@ transform_domain(void) // and calculate ifft for time domain float* tmp = (float*)spi_buffer; - uint8_t window_size, offset; + uint8_t window_size = 0, offset = 0; uint8_t is_lowpass = FALSE; switch (domain_mode & TD_FUNC) { case TD_FUNC_BANDPASS: @@ -1137,7 +1139,7 @@ void apply_error_term_at(int i) measured[1][i][1] = s21ai; } -void apply_edelay_at(int i) +static void apply_edelay_at(int i) { float w = 2 * M_PI * electrical_delay * frequencies[i] * 1E-12; float s = sin(w); diff --git a/nanovna.h b/nanovna.h index 4398bed6..f33b6c4d 100644 --- a/nanovna.h +++ b/nanovna.h @@ -375,11 +375,13 @@ void ui_hide(void); extern uint8_t operation_requested; void handle_touch_interrupt(void); +void touch_start_watchdog(void); #define TOUCH_THRESHOLD 2000 void touch_cal_exec(void); void touch_draw_test(void); +void touch_position(int *x, int *y); void enter_dfu(void); /* From e7fd9da0eb15d9e3062b9999c95b6ea7a6cfb5ed Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 28 Sep 2019 08:17:48 +0200 Subject: [PATCH 06/42] minor update --- plot.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plot.c b/plot.c index c6293c42..6592cbed 100644 --- a/plot.c +++ b/plot.c @@ -1408,6 +1408,7 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v uint8_t bits, charlen = 8; int cline, r; +// fixme // if (y <= -8 || y >= h || x <= -8 || x >= w) // return 0; @@ -1674,7 +1675,7 @@ draw_cal_status(void) ili9341_drawchar_8x8(ch, x, y, 0xffff, 0x0000); y += 8; - ili9341_drawchar_8x8(ch2, x+1, y, 0xffff, 0x0000); + ili9341_drawchar_8x8(ch2, x, y, 0xffff, 0x0000); y += YSTEP; } From 21ccc1b76c81f49cd5a98892bba5a4871893c0a9 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 28 Sep 2019 08:24:02 +0200 Subject: [PATCH 07/42] remove compiler warnings --- main.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index f3670933..aa37db87 100644 --- a/main.c +++ b/main.c @@ -40,6 +40,10 @@ static void apply_edelay_at(int i); static void cal_interpolate(int s); +static void set_frequencies(uint32_t start, uint32_t stop, int16_t points); +static void update_frequencies(void); + + bool sweep(bool break_on_operation); static MUTEX_DECL(mutex); @@ -753,8 +757,9 @@ update_marker_index(void) } } -void -set_frequencies(uint32_t start, uint32_t stop, int16_t points) + + +static void set_frequencies(uint32_t start, uint32_t stop, int16_t points) { int i; uint32_t span = (stop - start) / 1000; /* prevents overflow because of maximum of int32_t(2.147e+9) */ @@ -764,6 +769,8 @@ set_frequencies(uint32_t start, uint32_t stop, int16_t points) frequencies[i] = 0; } + + void update_frequencies(void) { From 9bfc0120ce48d0adf51181cc6a37af2b6bc17b56 Mon Sep 17 00:00:00 2001 From: Jharwin Barrozo Date: Thu, 3 Oct 2019 02:57:24 +0800 Subject: [PATCH 08/42] Update ui.c Added USER_CALL for personalization i.e CALLSIGN in version info screen --- ui.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui.c b/ui.c index 8cccb6d1..cb9bdad2 100644 --- a/ui.c +++ b/ui.c @@ -391,8 +391,9 @@ show_version(void) adc_stop(ADC1); ili9341_fill(0, 0, 320, 240, 0); - ili9341_drawstring_size(BOARD_NAME, x, y, 0xffff, 0x0000, 4); - y += 25; + ili9341_drawstring_size(USER_CALL, x, y, 0xf800, 0x0000, 3); + ili9341_drawstring_size(BOARD_NAME, x, y += 25, 0xf800, 0x0000, 5); + y += 35; ili9341_drawstring_5x7("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_5x7("Licensed under GPL. See: https://github.com/ttrftech/NanoVNA", x, y += 10, 0xffff, 0x0000); From 30458287bca1027d14bacbedd0d5d739934e3c23 Mon Sep 17 00:00:00 2001 From: Jharwin Barrozo Date: Thu, 3 Oct 2019 02:59:01 +0800 Subject: [PATCH 09/42] Added USER_CALL for personalization Callsign in version info screen --- ui.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ui.c b/ui.c index cb9bdad2..1bd88c4d 100644 --- a/ui.c +++ b/ui.c @@ -394,7 +394,6 @@ show_version(void) ili9341_drawstring_size(USER_CALL, x, y, 0xf800, 0x0000, 3); ili9341_drawstring_size(BOARD_NAME, x, y += 25, 0xf800, 0x0000, 5); y += 35; - ili9341_drawstring_5x7("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_5x7("Licensed under GPL. See: https://github.com/ttrftech/NanoVNA", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_5x7("Version: " VERSION, x, y += 10, 0xffff, 0x0000); From ac2deb674fb457628c0f8e4241a935b3a1afd949 Mon Sep 17 00:00:00 2001 From: Jharwin Barrozo Date: Thu, 3 Oct 2019 03:00:08 +0800 Subject: [PATCH 10/42] Added DV2JBs as USER_CALL --- NANOVNA_STM32_F072/board.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NANOVNA_STM32_F072/board.h b/NANOVNA_STM32_F072/board.h index 7ab4c29f..6c6226d5 100644 --- a/NANOVNA_STM32_F072/board.h +++ b/NANOVNA_STM32_F072/board.h @@ -26,7 +26,7 @@ */ #define BOARD_NANOVNA_STM32_F072 #define BOARD_NAME "NanoVNA" - +#define USER_CALL "DV2JBs" /* * Board frequencies. */ From acb36092445e975a701274c87ef49d73125f59d4 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Thu, 3 Oct 2019 19:21:01 +0200 Subject: [PATCH 11/42] bigger fonts, beta version --- Font8x8.c | 2 +- main.c | 15 +++-- nanovna.h | 3 +- plot.c | 160 ++++++++++++++++++++++++++++-------------------------- ui.c | 2 +- 5 files changed, 95 insertions(+), 87 deletions(-) diff --git a/Font8x8.c b/Font8x8.c index ed23ee48..33d170d9 100644 --- a/Font8x8.c +++ b/Font8x8.c @@ -26,7 +26,7 @@ const uint8_t x8x8_bits[][8]={ {0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00}, /* 0x2D '-' */ {0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00}, /* 0x2E '.' */ {0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00}, /* 0x2F '/' */ - {0x78,0xCC,0xDC,0xFC,0xEC,0xCC,0x78,0x00}, /* 0x30 '0' */ + {0x78,0xCC,0xCC,0xCC,0xCC,0xCC,0x78,0x00}, /* 0x30 '0' */ {0x30,0xF0,0x30,0x30,0x30,0x30,0xFC,0x00}, /* 0x31 '1' */ {0x78,0xCC,0x0C,0x38,0x60,0xCC,0xFC,0x00}, /* 0x32 '2' */ {0x78,0xCC,0x0C,0x38,0x0C,0xCC,0x78,0x00}, /* 0x33 '3' */ diff --git a/main.c b/main.c index 5b8c8243..74a52e2b 100644 --- a/main.c +++ b/main.c @@ -544,7 +544,6 @@ static void cmd_capture(BaseSequentialStream *chp, int argc, char *argv[]) } len -= PART; } - //*/ chMtxUnlock(&mutex); } @@ -602,9 +601,9 @@ config_t config = { /* grid_color */ 0x1084, /* menu_normal_color */ 0xffff, /* menu_active_color */ 0x7777, - /* trace_colors[4] */ { RGB565(0,255,255), RGB565(255,0,40), RGB565(0,0,255), RGB565(50,255,0) }, - ///* touch_cal[4] */ { 620, 600, 160, 190 }, - /* touch_cal[4] */ { 693, 605, 124, 171 }, + /* trace_color[4] */ { RGB_565(255,255,0), RGB_565(0,40,255), RGB_565(0,255,0), RGB_565(255,200,20) }, + /* trace_colors[4] */ // { RGB565(0,255,255), RGB565(255,0,40), RGB565(0,0,255), RGB565(50,255,0) }, + /* touch_cal[4] */ { 411, 592, 151, 189 }, /* default_loadcal */ 0, /* checksum */ 0 }; @@ -1421,17 +1420,17 @@ const struct { uint16_t refpos; float scale_unit; } trace_info[] = { - { "LGMG", 7, 10 }, + { "LMG", 7, 10 }, { "PHA", 4, 90 }, { "DEL", 4, 1 }, { "SMI", 0, 1 }, - { "PLR", 0, 1 }, + { "POL", 0, 1 }, { "LIN", 0, 0.125 }, { "SWR", 0, 1 }, { "REAL", 4, 0.25 }, { "IMAG", 4, 0.25 }, - { "R", 0, 100 }, - { "X", 4, 100 } + { "RES", 0, 100 }, + { "REA", 4, 100 } }; const char * const trc_channel_name[] = { diff --git a/nanovna.h b/nanovna.h index 7067c332..33900704 100644 --- a/nanovna.h +++ b/nanovna.h @@ -243,7 +243,7 @@ void redraw_frame(void); void request_to_draw_cells_behind_menu(void); void request_to_draw_cells_behind_numeric_input(void); void redraw_marker(int marker, int update_info); -void trace_get_info(int t, char *buf, int len); +uint16_t trace_get_info(int t, char *buf, uint16_t len); void plot_into_index(float measured[2][101][2]); void force_set_markmap(void); void draw_all(bool flush); @@ -269,6 +269,7 @@ extern int16_t vbat; * ili9341.c */ #define RGB565(b,r,g) ( (((b)<<8)&0xfc00) | (((r)<<2)&0x03e0) | (((g)>>3)&0x001f) ) +#define RGB_565(r, g, b) ( (((b)<<8)&0xfc00) | (((r)<<2)&0x03e0) | (((g)>>3)&0x001f) ) typedef struct { uint16_t width; diff --git a/plot.c b/plot.c index edda534d..4db06433 100644 --- a/plot.c +++ b/plot.c @@ -641,15 +641,15 @@ trace_get_value_string(int t, char *buf, int len, float coeff[2], uint32_t frequ if (v == -INFINITY) chsnprintf(buf, len, "-INF dB"); else - chsnprintf(buf, len, "%.2fdB", v); + chsnprintf(buf, len, "%.1fdB", v); break; case TRC_PHASE: v = phase(coeff); - chsnprintf(buf, len, "%.2f" S_DEGREE, v); + chsnprintf(buf, len, "%.1f" S_DEGREE, v); break; case TRC_LINEAR: v = linear(coeff); - chsnprintf(buf, len, "%.2f", v); + chsnprintf(buf, len, "%.1f", v); break; case TRC_SWR: v = swr(coeff); @@ -672,35 +672,43 @@ trace_get_value_string(int t, char *buf, int len, float coeff[2], uint32_t frequ break; //case TRC_ADMIT: case TRC_POLAR: - chsnprintf(buf, len, "%.2f %.2fj", coeff[0], coeff[1]); + chsnprintf(buf, len, "%.1f %.1fj", coeff[0], coeff[1]); break; } } -void -trace_get_info(int t, char *buf, int len) + + +uint16_t +trace_get_info(int t, char *buf, uint16_t len) { const char *type = get_trace_typename(t); - int n; - switch (trace[t].type) { + uint16_t n = 0; + + switch ( trace[t].type ) + { case TRC_LOGMAG: - chsnprintf(buf, len, "%s %ddB/", type, (int)get_trace_scale(t)); + n = chsnprintf(buf, len, "%s %ddB/", type, (int)get_trace_scale(t)); break; case TRC_PHASE: - chsnprintf(buf, len, "%s %d" S_DEGREE "/", type, (int)get_trace_scale(t)); + n = chsnprintf(buf, len, "%s %d" S_DEGREE "/", type, (int)get_trace_scale(t)); break; case TRC_SMITH: //case TRC_ADMIT: case TRC_POLAR: - chsnprintf(buf, len, "%s %.1fFS", type, get_trace_scale(t)); + n = chsnprintf(buf, len, "%s %.1fFS", type, get_trace_scale(t)); break; default: n = chsnprintf(buf, len, "%s ", type); string_value_with_prefix(buf+n, len-n, get_trace_scale(t), '/'); break; } + + return n; } + + static float time_of_index(int idx) { return 1.0 / (float)(frequencies[1] - frequencies[0]) / (float)FFT_SIZE * idx; } @@ -1205,7 +1213,9 @@ draw_cell(int m, int n) { memset(spi_buffer, 0, sizeof spi_buffer); } - if (grid_mode & (GRID_SMITH|GRID_ADMIT|GRID_POLAR)) { + + if (grid_mode & (GRID_SMITH|GRID_ADMIT|GRID_POLAR)) + { for (y = 0; y < h; y++) { @@ -1227,18 +1237,21 @@ draw_cell(int m, int n) #if 1 /* draw rectanglar plot */ - for (t = 0; t < TRACES_MAX; t++) { + for (t = 0; t < TRACES_MAX; t++) + { if (!trace[t].enabled) continue; if (trace[t].type == TRC_SMITH || trace[t].type == TRC_POLAR) continue; - if (search_index_range_x(x0, trace_index[t], &i0, &i1)) { + if (search_index_range_x(x0, trace_index[t], &i0, &i1)) + { if (i0 > 0) i0--; if (i1 < 101-1) i1++; - for (i = i0; i < i1; i++) { + for (i = i0; i < i1; i++) + { int x1 = CELL_X(trace_index[t][i]); int x2 = CELL_X(trace_index[t][i+1]); int y1 = CELL_Y(trace_index[t][i]); @@ -1251,14 +1264,16 @@ draw_cell(int m, int n) #endif #if 1 /* draw polar plot */ - for (t = 0; t < TRACES_MAX; t++) { + for (t = 0; t < TRACES_MAX; t++) + { int c = config.trace_color[t]; if (!trace[t].enabled) continue; if (trace[t].type != TRC_SMITH && trace[t].type != TRC_POLAR) continue; - for (i = 1; i < sweep_points; i++) { + for (i = 1; i < sweep_points; i++) + { //uint32_t index = trace_index[t][i]; //uint32_t pindex = trace_index[t][i-1]; //if (!CELL_P(index, x0, y0) && !CELL_P(pindex, x0, y0)) @@ -1408,18 +1423,30 @@ cell_drawstring_invert_5x7(int w, int h, char *str, int x, int y, uint16_t fg, i -unsigned char -cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, int invert) +uint16_t +cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, uint8_t invert) { - uint8_t bits, charlen = 8; + uint8_t bits; + uint16_t charwidthpx = 8; int cline, r; // fixme // if (y <= -8 || y >= h || x <= -8 || x >= w) // return 0; + ch = x8x8_map_char_table(ch); + if ( var != FALSE ) + { + charwidthpx = x8x8_len[ch]; + } + + +// if (y <= -8 || y >= h || x >= w ) // fixme x <= -(charlen) || x >= w) +// return 0; + + for (cline = 0; cline < 8; cline++) { if ((y + cline) < 0 || (y + cline) >= h) @@ -1430,12 +1457,8 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v if (invert) bits = ~bits; - if ( var != FALSE ) - { - charlen = x8x8_len[ch]; - } - for (r = 0; r < charlen; r++) + for (r = 0; r < charwidthpx; r++) { if ( (x+r) >= 0 && (x+r) < w && (0x80 & bits) ) spi_buffer[(y+cline)*w + (x+r)] = fg; @@ -1444,63 +1467,44 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v } } - return x8x8_len[ch]; + return charwidthpx; } -void -cell_drawstring_8x8(int w, int h, char *str, int x, int y, uint16_t fg) +uint16_t +cell_drawstring_8x8(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert) { - while (*str) - { - cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, FALSE); - x += 8; - str++; - } -} + uint16_t strwidthpx = 0; - - -void -cell_drawstring_invert_8x8(int w, int h, char *str, int x, int y, uint16_t fg, int invert) -{ while (*str) { - cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, invert); + strwidthpx += cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, invert); x += 8; str++; } -} - - -void -cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg) -{ - unsigned char clength = 0; - - while (*str) - { - clength = cell_drawchar_8x8(w, h, *str, x, y, fg, TRUE, FALSE); - x += clength; - str++; - } + return strwidthpx; } -void -cell_drawstring_invert_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, int invert) +uint16_t +cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert) { unsigned char clength = 0; + uint16_t strwidthpx = 0; while (*str) { clength = cell_drawchar_8x8(w, h, *str, x, y, fg, TRUE, invert); x += clength; + strwidthpx += clength; str++; } + + return strwidthpx; + } @@ -1510,6 +1514,7 @@ cell_draw_marker_info(int m, int n, int w, int h) { char buf[24]; int t; + uint16_t slen, strwidthpx = 0; if (n != 0) return; @@ -1525,55 +1530,58 @@ cell_draw_marker_info(int m, int n, int w, int h) if (!trace[t].enabled) continue; - int xpos = 1 + (j%2)*146; + int xpos = 1 + (j%2)*160; int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; - chsnprintf(buf, sizeof buf, "CH%d:", trace[t].channel); - cell_drawstring_invert_5x7(w, h, buf, xpos, ypos, config.trace_color[t], t == uistat.current_trace); - xpos += 20; - trace_get_info(t, buf, sizeof buf); - cell_drawstring_5x7(w, h, buf, xpos, ypos, config.trace_color[t]); + chsnprintf(buf, sizeof buf, "C%d:", trace[t].channel); + strwidthpx = cell_drawstring_8x8_var(w, h, buf, xpos, ypos, config.trace_color[t], t == uistat.current_trace); + + xpos += strwidthpx + 4; - xpos += 64; - trace_get_value_string(t, buf, sizeof buf, measured[trace[t].channel][idx], frequencies[idx]); - cell_drawstring_5x7(w, h, buf, xpos, ypos, config.trace_color[t]); + slen = trace_get_info(t, buf, sizeof buf); + trace_get_value_string(t, buf+slen, (sizeof(buf))-slen, measured[trace[t].channel][idx], frequencies[idx]); + + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, config.trace_color[t], FALSE); j++; } // draw marker frequency - int xpos = 165; + int xpos = 160; int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; + chsnprintf(buf, sizeof buf, "%d:", active_marker + 1); - cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff); - xpos += 16; + strwidthpx = cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += strwidthpx + 4; if ( (domain_mode & DOMAIN_MODE) == DOMAIN_FREQ ) { frequency_string(buf, sizeof buf, frequencies[idx]); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } else { chsnprintf(buf, sizeof buf, "%d ns %.1f m", (uint16_t)(time_of_index(idx) * 1e9), distance_of_index(idx)); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } // draw marker delta if ( previous_marker >= 0 && active_marker != previous_marker && markers[previous_marker].enabled ) { int idx0 = markers[previous_marker].index; - xpos = 192; + xpos = 160; xpos -= m * CELLWIDTH - CELLOFFSETX; - ypos += 7; + ypos += 8; + chsnprintf(buf, sizeof buf, "\001%d:", previous_marker+1); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); - xpos += 16; + strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += strwidthpx + 4; + frequency_string(buf, sizeof buf, frequencies[idx] - frequencies[idx0]); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } } diff --git a/ui.c b/ui.c index 938ed9a7..480d32b5 100644 --- a/ui.c +++ b/ui.c @@ -329,7 +329,7 @@ touch_cal_exec(void) ili9341_fill(0, 0, 320, 240, 0); ili9341_line(320-1, 240-1, 320-1, 240-32, 0xffff); ili9341_line(320-1, 240-1, 320-32, 240-1, 0xffff); - ili9341_drawstring_8x8_var("TOUCH LOWER RIGHT", 200, 220, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("TOUCH LOWER RIGHT", 190, 220, 0xffff, 0x0000); do { status = touch_check(); From 601e82991bca6cf4cc8915104a17134c047999bb Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Thu, 3 Oct 2019 19:42:33 +0200 Subject: [PATCH 12/42] feat: owner name --- NANOVNA_STM32_F072/board.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NANOVNA_STM32_F072/board.h b/NANOVNA_STM32_F072/board.h index 6c6226d5..06b5c604 100644 --- a/NANOVNA_STM32_F072/board.h +++ b/NANOVNA_STM32_F072/board.h @@ -26,7 +26,7 @@ */ #define BOARD_NANOVNA_STM32_F072 #define BOARD_NAME "NanoVNA" -#define USER_CALL "DV2JBs" +#define USER_CALL "My" /* add your name here */ /* * Board frequencies. */ From 6a26cda169ef020d875b3d8ea2ac3a47e929cf4a Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Fri, 4 Oct 2019 17:49:55 +0200 Subject: [PATCH 13/42] fix: swr string --- ili9341.c | 35 ----------------------------------- nanovna.h | 2 -- plot.c | 13 ++++++++----- ui.c | 2 +- 4 files changed, 9 insertions(+), 43 deletions(-) diff --git a/ili9341.c b/ili9341.c index 7b8b7365..b5b68336 100644 --- a/ili9341.c +++ b/ili9341.c @@ -336,41 +336,6 @@ ili9341_read_memory_continue(int len, uint16_t* out) -void -ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) -{ - uint16_t *buf = spi_buffer; - uint8_t bits; - int c, r; - - ch = x5x7_map_char_table(ch); - - for(c = 0; c < 7; c++) - { - bits = x5x7_bits[(ch * 7) + c]; - for (r = 0; r < 5; r++) - { - *buf++ = (0x80 & bits) ? fg : bg; - bits <<= 1; - } - } - ili9341_bulk(x, y, 5, 7); -} - - - -void -ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg) -{ - while (*str) { - ili9341_drawchar_5x7(*str, x, y, fg, bg); - x += 5; - str++; - } -} - - - void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) { diff --git a/nanovna.h b/nanovna.h index 33900704..beef50d8 100644 --- a/nanovna.h +++ b/nanovna.h @@ -287,8 +287,6 @@ void ili9341_init(void); void ili9341_test(int mode); void ili9341_bulk(int x, int y, int w, int h); void ili9341_fill(int x, int y, int w, int h, int color); -void ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); -void ili9341_drawstring_5x7(const char *str, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); unsigned char ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); diff --git a/plot.c b/plot.c index 4db06433..46a5d737 100644 --- a/plot.c +++ b/plot.c @@ -700,7 +700,7 @@ trace_get_info(int t, char *buf, uint16_t len) break; default: n = chsnprintf(buf, len, "%s ", type); - string_value_with_prefix(buf+n, len-n, get_trace_scale(t), '/'); + n += string_value_with_prefix(buf+n, len-n, get_trace_scale(t), '/'); break; } @@ -1516,7 +1516,7 @@ cell_draw_marker_info(int m, int n, int w, int h) int t; uint16_t slen, strwidthpx = 0; - if (n != 0) + if (n > 1) return; if (active_marker < 0) @@ -1542,8 +1542,8 @@ cell_draw_marker_info(int m, int n, int w, int h) slen = trace_get_info(t, buf, sizeof buf); trace_get_value_string(t, buf+slen, (sizeof(buf))-slen, measured[trace[t].channel][idx], frequencies[idx]); - cell_drawstring_8x8_var(w, h, buf, xpos, ypos, config.trace_color[t], FALSE); + j++; } @@ -1576,10 +1576,13 @@ cell_draw_marker_info(int m, int n, int w, int h) xpos -= m * CELLWIDTH - CELLOFFSETX; ypos += 8; - chsnprintf(buf, sizeof buf, "\001%d:", previous_marker+1); + chsnprintf(buf, sizeof buf, "%s%d:", S_DIAMOND, previous_marker+1); strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); xpos += strwidthpx + 4; + + + frequency_string(buf, sizeof buf, frequencies[idx] - frequencies[idx0]); cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } @@ -1603,7 +1606,7 @@ frequency_string(char *buf, size_t len, int32_t freq) (int)(freq / 1000), (int)(freq % 1000)); } else { - chsnprintf(buf, len, "%d.%03d %03d MHz", + chsnprintf(buf, len, "%d.%03d%03d MHz", (int)(freq / 1000000), (int)((freq / 1000) % 1000), (int)(freq % 1000)); diff --git a/ui.c b/ui.c index bbc0d22c..6c3fa4c9 100644 --- a/ui.c +++ b/ui.c @@ -1262,7 +1262,7 @@ void draw_numeric_area_frame(void) { ili9341_fill(0, 208, 320, 32, 0xffff); - ili9341_drawstring_5x7(keypad_mode_label[keypad_mode], 10, 220, 0x0000, 0xffff); + ili9341_drawstring_8x8_var(keypad_mode_label[keypad_mode], 10, 220, 0x0000, 0xffff); ili9341_drawfont(KP_KEYPAD, &NF20x24, 300, 216, 0x0000, 0xffff); } From 80c44862d2adf492fc51c890735cb7062c59544d Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 5 Oct 2019 17:33:41 +0200 Subject: [PATCH 14/42] feat: Removed tiny font to free flash space --- Font5x7.c | 2150 ----------------------------------------------------- Makefile | 2 +- ili9341.c | 27 +- nanovna.h | 4 +- plot.c | 47 +- ui.c | 6 +- 6 files changed, 36 insertions(+), 2200 deletions(-) delete mode 100644 Font5x7.c diff --git a/Font5x7.c b/Font5x7.c deleted file mode 100644 index c46256a9..00000000 --- a/Font5x7.c +++ /dev/null @@ -1,2150 +0,0 @@ -/* Generated by convbdf on Tue Oct 3 00:24:24 MDT 2000. */ -/* Font information: - name: "-Misc-Fixed-Medium-R-Normal--7-70-75-75-C-50-ISO8859-1" - pixel size: 7 - ascent: 6 - descent: 1 -*/ - -#include - -/* Font character bitmap data. */ -const uint8_t x5x7_bits [] = -{ - /* Character (0x00): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - |**** | - |**** | - |**** | - |**** | - |**** | - | | - +--------+ */ - 0xf0, - 0xf0, - 0xf0, - 0xf0, - 0xf0, - 0xf0, - 0x00, - - - /* Character (0x01): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * | - | *** | - |***** | - | *** | - | * | - | | - +--------+ */ - 0x00, - 0x20, - 0x70, - 0xf8, - 0x70, - 0x20, - 0x00, - - /* Character (0x02): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * * | - |* * | - | * * | - |* * | - | * * | - |* * | - | | - +--------+ */ - 0x50, - 0xa0, - 0x50, - 0xa0, - 0x50, - 0xa0, - 0x00, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - |**** | - | * | - | * | - | | - | | - +--------+ */ - 0x20, - 0x40, - 0xF8, - 0x40, - 0x20, - 0x00, - 0x00, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - |***** | - | * | - | * | - | | - | | - +--------+ */ - 0x20, - 0x10, - 0xF8, - 0x10, - 0x20, - 0x00, - 0x00, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |***** | - | * * | - | * * | - |* ** | - | | - +--------+ */ - 0x00, - 0x00, - 0xf8, - 0x50, - 0x50, - 0x98, - 0x00, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |* * | - |* * | - |*** | - |* | - +--------+ */ - 0x00, - 0x00, - 0x90, - 0x90, - 0x90, - 0xe0, - 0x80, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | *** | - |* * | - |* * | - | * * | - |** ** | - | | - +--------+ */ - 0x00, - 0x70, - 0x88, - 0x88, - 0x50, - 0xb8, - 0x00, - - /* Character (): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* * | - | ** | - | | - | | - | | - +--------+ */ - 0x60, - 0x90, - 0x90, - 0x60, - 0x00, - 0x00, - 0x00, - - /* Character (0x20): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | | - | | - | | - | | - | | - +--------+ */ - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - - /* Character (0x21): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | * | - | * | - | | - | * | - | | - +--------+ */ - 0x20, - 0x20, - 0x20, - 0x20, - 0x00, - 0x20, - 0x00, - - /* Character (0x22): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * * | - | * * | - | * * | - | | - | | - | | - | | - +--------+ */ - 0x50, - 0x50, - 0x50, - 0x00, - 0x00, - 0x00, - 0x00, - - /* Character (0x23): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * * | - |***** | - | * * | - |***** | - | * * | - | | - +--------+ */ - 0x00, - 0x50, - 0xf8, - 0x50, - 0xf8, - 0x50, - 0x00, - - /* Character (0x24): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | *** | - |* * | - | *** | - | * * | - | *** | - | | - +--------+ */ - 0x00, - 0x70, - 0xa0, - 0x70, - 0x28, - 0x70, - 0x00, - - /* Character (0x25): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - |* * | - | * | - | * | - |* * | - | * | - | | - +--------+ */ - 0x80, - 0x90, - 0x20, - 0x40, - 0x90, - 0x10, - 0x00, - - /* Character (0x26): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * | - |* * | - | * | - |* * | - | * * | - | | - +--------+ */ - 0x00, - 0x40, - 0xa0, - 0x40, - 0xa0, - 0x50, - 0x00, - - /* Character (0x27): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - | * | - |* | - | | - | | - | | - | | - +--------+ */ - 0x60, - 0x40, - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - - /* Character (0x28): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +--------+ */ - 0x20, - 0x40, - 0x40, - 0x40, - 0x40, - 0x20, - 0x00, - - /* Character (0x29): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +--------+ */ - 0x40, - 0x20, - 0x20, - 0x20, - 0x20, - 0x40, - 0x00, - - /* Character (0x2a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - |* * | - | * | - |*** | - | * | - |* * | - | | - +--------+ */ - 0x00, - 0xa0, - 0x40, - 0xe0, - 0x40, - 0xa0, - 0x00, - - /* Character (0x2b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * | - | * | - |***** | - | * | - | * | - | | - +--------+ */ - 0x00, - 0x20, - 0x20, - 0xf8, - 0x20, - 0x20, - 0x00, - - /* Character (0x2c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | | - | | - | ** | - | * | - |* | - +--------+ */ - 0x00, - 0x00, - 0x00, - 0x00, - 0x60, - 0x40, - 0x80, - - /* Character (0x2d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | | - |**** | - | | - | | - | | - +--------+ */ - 0x00, - 0x00, - 0x00, - 0xf0, - 0x00, - 0x00, - 0x00, - - /* Character (0x2e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | | - | | - | ** | - | ** | - | | - +--------+ */ - 0x00, - 0x00, - 0x00, - 0x00, - 0x60, - 0x60, - 0x00, - - /* Character (0x2f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * | - | * | - | * | - |* | - | | - | | - +--------+ */ - 0x00, - 0x10, - 0x20, - 0x40, - 0x80, - 0x00, - 0x00, - - /* Character (0x30): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* ** | - |** * | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0xb0, - 0xd0, - 0x90, - 0x60, - 0x00, - - /* Character (0x31): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - |** | - | * | - | * | - | * | - |*** | - | | - +--------+ */ - 0x40, - 0xc0, - 0x40, - 0x40, - 0x40, - 0xe0, - 0x00, - - /* Character (0x32): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - | * | - | * | - | * | - |**** | - | | - +--------+ */ - 0x60, - 0x90, - 0x10, - 0x20, - 0x40, - 0xf0, - 0x00, - - /* Character (0x33): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - | * | - | ** | - | * | - |* * | - | ** | - | | - +--------+ */ - 0xf0, - 0x10, - 0x60, - 0x10, - 0x90, - 0x60, - 0x00, - - /* Character (0x34): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | ** | - |* * | - |**** | - | * | - | * | - | | - +--------+ */ - 0x20, - 0x60, - 0xa0, - 0xf0, - 0x20, - 0x20, - 0x00, - - /* Character (0x35): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - |* | - |*** | - | * | - |* * | - | ** | - | | - +--------+ */ - 0xf0, - 0x80, - 0xe0, - 0x10, - 0x90, - 0x60, - 0x00, - - /* Character (0x36): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* | - |*** | - |* * | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x80, - 0xe0, - 0x90, - 0x90, - 0x60, - 0x00, - - /* Character (0x37): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - | * | - | * | - | * | - | * | - | * | - | | - +--------+ */ - 0xf0, - 0x10, - 0x20, - 0x20, - 0x40, - 0x40, - 0x00, - - /* Character (0x38): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - | ** | - |* * | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0x60, - 0x90, - 0x90, - 0x60, - 0x00, - - /* Character (0x39): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* * | - | *** | - | * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0x90, - 0x70, - 0x10, - 0x60, - 0x00, - - /* Character (0x3a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | ** | - | ** | - | | - | ** | - | ** | - | | - +--------+ */ - 0x00, - 0x60, - 0x60, - 0x00, - 0x60, - 0x60, - 0x00, - - /* Character (0x3b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | ** | - | ** | - | | - | ** | - | * | - |* | - +--------+ */ - 0x00, - 0x60, - 0x60, - 0x00, - 0x60, - 0x40, - 0x80, - - /* Character (0x3c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | * | - | * | - |* | - | * | - | * | - | | - +--------+ */ - 0x00, - 0x20, - 0x40, - 0x80, - 0x40, - 0x20, - 0x00, - - /* Character (0x3d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |**** | - | | - |**** | - | | - | | - +--------+ */ - 0x00, - 0x00, - 0xf0, - 0x00, - 0xf0, - 0x00, - 0x00, - - /* Character (0x3e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - |* | - | * | - | * | - | * | - |* | - | | - +--------+ */ - 0x00, - 0x80, - 0x40, - 0x20, - 0x40, - 0x80, - 0x00, - - /* Character (0x3f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - |* * | - | * | - | * | - | | - | * | - | | - +--------+ */ - 0x40, - 0xa0, - 0x20, - 0x40, - 0x00, - 0x40, - 0x00, - - /* Character (0x40): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* ** | - |* ** | - |* | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0xb0, - 0xb0, - 0x80, - 0x60, - 0x00, - - /* Character (0x41): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* * | - |**** | - |* * | - |* * | - | | - +--------+ */ - 0x60, - 0x90, - 0x90, - 0xf0, - 0x90, - 0x90, - 0x00, - - /* Character (0x42): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - |* * | - |*** | - |* * | - |* * | - |*** | - | | - +--------+ */ - 0xe0, - 0x90, - 0xe0, - 0x90, - 0x90, - 0xe0, - 0x00, - - /* Character (0x43): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* | - |* | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0x80, - 0x80, - 0x90, - 0x60, - 0x00, - - /* Character (0x44): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - |* * | - |* * | - |* * | - |* * | - |*** | - | | - +--------+ */ - 0xe0, - 0x90, - 0x90, - 0x90, - 0x90, - 0xe0, - 0x00, - - /* Character (0x45): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - |* | - |*** | - |* | - |* | - |**** | - | | - +--------+ */ - 0xf0, - 0x80, - 0xe0, - 0x80, - 0x80, - 0xf0, - 0x00, - - /* Character (0x46): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - |* | - |*** | - |* | - |* | - |* | - | | - +--------+ */ - 0xf0, - 0x80, - 0xe0, - 0x80, - 0x80, - 0x80, - 0x00, - - /* Character (0x47): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* | - |* ** | - |* * | - | *** | - | | - +--------+ */ - 0x60, - 0x90, - 0x80, - 0xb0, - 0x90, - 0x70, - 0x00, - - /* Character (0x48): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |**** | - |* * | - |* * | - |* * | - | | - +--------+ */ - 0x90, - 0x90, - 0xf0, - 0x90, - 0x90, - 0x90, - 0x00, - - /* Character (0x49): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - | * | - | * | - | * | - | * | - |*** | - | | - +--------+ */ - 0xe0, - 0x40, - 0x40, - 0x40, - 0x40, - 0xe0, - 0x00, - - /* Character (0x4a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | * | - | * | - |* * | - | ** | - | | - +--------+ */ - 0x10, - 0x10, - 0x10, - 0x10, - 0x90, - 0x60, - 0x00, - - /* Character (0x4b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |** | - |** | - |* * | - |* * | - | | - +--------+ */ - 0x90, - 0xa0, - 0xc0, - 0xc0, - 0xa0, - 0x90, - 0x00, - - /* Character (0x4c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - |* | - |* | - |* | - |* | - |**** | - | | - +--------+ */ - 0x80, - 0x80, - 0x80, - 0x80, - 0x80, - 0xf0, - 0x00, - - /* Character (0x4d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |**** | - |**** | - |* * | - |* * | - |* * | - | | - +--------+ */ - 0x90, - 0xf0, - 0xf0, - 0x90, - 0x90, - 0x90, - 0x00, - - /* Character (0x4e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |** * | - |** * | - |* ** | - |* ** | - |* * | - | | - +--------+ */ - 0x90, - 0xd0, - 0xd0, - 0xb0, - 0xb0, - 0x90, - 0x00, - - /* Character (0x4f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* * | - |* * | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0x90, - 0x90, - 0x90, - 0x60, - 0x00, - - /* Character (0x50): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - |* * | - |* * | - |*** | - |* | - |* | - | | - +--------+ */ - 0xe0, - 0x90, - 0x90, - 0xe0, - 0x80, - 0x80, - 0x00, - - /* Character (0x51): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - |* * | - |* * | - |** * | - | ** | - | * | - +--------+ */ - 0x60, - 0x90, - 0x90, - 0x90, - 0xd0, - 0x60, - 0x10, - - /* Character (0x52): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - |* * | - |* * | - |*** | - |* * | - |* * | - | | - +--------+ */ - 0xe0, - 0x90, - 0x90, - 0xe0, - 0xa0, - 0x90, - 0x00, - - /* Character (0x53): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | ** | - |* * | - | * | - | * | - |* * | - | ** | - | | - +--------+ */ - 0x60, - 0x90, - 0x40, - 0x20, - 0x90, - 0x60, - 0x00, - - /* Character (0x54): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - | * | - | * | - | * | - | * | - | * | - | | - +--------+ */ - 0xe0, - 0x40, - 0x40, - 0x40, - 0x40, - 0x40, - 0x00, - - /* Character (0x55): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |* * | - |* * | - |* * | - | ** | - | | - +--------+ */ - 0x90, - 0x90, - 0x90, - 0x90, - 0x90, - 0x60, - 0x00, - - /* Character (0x56): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |* * | - |* * | - | ** | - | ** | - | | - +--------+ */ - 0x90, - 0x90, - 0x90, - 0x90, - 0x60, - 0x60, - 0x00, - - /* Character (0x57): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |* * | - |**** | - |**** | - |* * | - | | - +--------+ */ - 0x90, - 0x90, - 0x90, - 0xf0, - 0xf0, - 0x90, - 0x00, - - /* Character (0x58): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - | ** | - | ** | - |* * | - |* * | - | | - +--------+ */ - 0x90, - 0x90, - 0x60, - 0x60, - 0x90, - 0x90, - 0x00, - - /* Character (0x59): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* * | - |* * | - |* * | - | * | - | * | - | * | - | | - +--------+ */ - 0xa0, - 0xa0, - 0xa0, - 0x40, - 0x40, - 0x40, - 0x00, - - /* Character (0x5a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |**** | - | * | - | * | - | * | - |* | - |**** | - | | - +--------+ */ - 0xf0, - 0x10, - 0x20, - 0x40, - 0x80, - 0xf0, - 0x00, - - /* Character (0x5b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - |* | - |* | - |* | - |* | - |*** | - | | - +--------+ */ - 0xe0, - 0x80, - 0x80, - 0x80, - 0x80, - 0xe0, - 0x00, - - /* Character (0x5c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - |* | - | * | - | * | - | * | - | | - | | - +--------+ */ - 0x00, - 0x80, - 0x40, - 0x20, - 0x10, - 0x00, - 0x00, - - /* Character (0x5d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |*** | - | * | - | * | - | * | - | * | - |*** | - | | - +--------+ */ - 0xe0, - 0x20, - 0x20, - 0x20, - 0x20, - 0xe0, - 0x00, - - /* Character (0x5e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - |* * | - | | - | | - | | - | | - | | - +--------+ */ - 0x40, - 0xa0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - - /* Character (0x5f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | | - | | - | | - |**** | - | | - +--------+ */ - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xf0, - 0x00, - - /* Character (0x60): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |** | - | * | - | * | - | | - | | - | | - | | - +--------+ */ - 0xc0, - 0x40, - 0x20, - 0x00, - 0x00, - 0x00, - 0x00, - - /* Character (0x61): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | *** | - |* * | - |* ** | - | * * | - | | - +--------+ */ - 0x00, - 0x00, - 0x70, - 0x90, - 0xb0, - 0x50, - 0x00, - - /* Character (0x62): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - |* | - |*** | - |* * | - |* * | - |*** | - | | - +--------+ */ - 0x80, - 0x80, - 0xe0, - 0x90, - 0x90, - 0xe0, - 0x00, - - /* Character (0x63): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | ** | - |* | - |* | - | ** | - | | - +--------+ */ - 0x00, - 0x00, - 0x60, - 0x80, - 0x80, - 0x60, - 0x00, - - /* Character (0x64): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | *** | - |* * | - |* * | - | *** | - | | - +--------+ */ - 0x10, - 0x10, - 0x70, - 0x90, - 0x90, - 0x70, - 0x00, - - /* Character (0x65): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | ** | - |* ** | - |** | - | ** | - | | - +--------+ */ - 0x00, - 0x00, - 0x60, - 0xb0, - 0xc0, - 0x60, - 0x00, - - /* Character (0x66): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * * | - | * | - |*** | - | * | - | * | - | | - +--------+ */ - 0x20, - 0x50, - 0x40, - 0xe0, - 0x40, - 0x40, - 0x00, - - /* Character (0x67): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | *** | - |* * | - | ** | - |* | - | *** | - +--------+ */ - 0x00, - 0x00, - 0x70, - 0x90, - 0x60, - 0x80, - 0x70, - - /* Character (0x68): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - |* | - |*** | - |* * | - |* * | - |* * | - | | - +--------+ */ - 0x80, - 0x80, - 0xe0, - 0x90, - 0x90, - 0x90, - 0x00, - - /* Character (0x69): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | | - |** | - | * | - | * | - |*** | - | | - +--------+ */ - 0x40, - 0x00, - 0xc0, - 0x40, - 0x40, - 0xe0, - 0x00, - - /* Character (0x6a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | | - | * | - | * | - | * | - |* * | - | * | - +--------+ */ - 0x20, - 0x00, - 0x20, - 0x20, - 0x20, - 0xa0, - 0x40, - - /* Character (0x6b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - |* | - |* * | - |** | - |* * | - |* * | - | | - +--------+ */ - 0x80, - 0x80, - 0xa0, - 0xc0, - 0xa0, - 0x90, - 0x00, - - /* Character (0x6c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |** | - | * | - | * | - | * | - | * | - |*** | - | | - +--------+ */ - 0xc0, - 0x40, - 0x40, - 0x40, - 0x40, - 0xe0, - 0x00, - - /* Character (0x6d): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |**** | - |* * | - |* * | - | | - +--------+ */ - 0x00, - 0x00, - 0xa0, - 0xf0, - 0x90, - 0x90, - 0x00, - - /* Character (0x6e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |*** | - |* * | - |* * | - |* * | - | | - +--------+ */ - 0x00, - 0x00, - 0xe0, - 0x90, - 0x90, - 0x90, - 0x00, - - /* Character (0x6f): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | ** | - |* * | - |* * | - | ** | - | | - +--------+ */ - 0x00, - 0x00, - 0x60, - 0x90, - 0x90, - 0x60, - 0x00, - - /* Character (0x70): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |*** | - |* * | - |* * | - |*** | - |* | - +--------+ */ - 0x00, - 0x00, - 0xe0, - 0x90, - 0x90, - 0xe0, - 0x80, - - /* Character (0x71): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | *** | - |* * | - |* * | - | *** | - | * | - +--------+ */ - 0x00, - 0x00, - 0x70, - 0x90, - 0x90, - 0x70, - 0x10, - - /* Character (0x72): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |*** | - |* * | - |* | - |* | - | | - +--------+ */ - 0x00, - 0x00, - 0xe0, - 0x90, - 0x80, - 0x80, - 0x00, - - /* Character (0x73): - bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - | *** | - |** | - | ** | - |*** | - | | - +--------+ */ - 0x00, - 0x00, - 0x70, - 0xc0, - 0x30, - 0xe0, - 0x00, - - /* Character (0x74): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - |*** | - | * | - | * | - | ** | - | | - +--------+ */ - 0x40, - 0x40, - 0xe0, - 0x40, - 0x40, - 0x30, - 0x00, - - /* Character (0x75): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |* * | - |* * | - | *** | - | | - +--------+ */ - 0x00, - 0x00, - 0x90, - 0x90, - 0x90, - 0x70, - 0x00, - - /* Character (0x76): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |* * | - |* * | - | * | - | | - +--------+ */ - 0x00, - 0x00, - 0xa0, - 0xa0, - 0xa0, - 0x40, - 0x00, - - /* Character (0x77): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |* * | - |**** | - |**** | - | | - +--------+ */ - 0x00, - 0x00, - 0x90, - 0x90, - 0xf0, - 0xf0, - 0x00, - - /* Character (0x78): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - | ** | - | ** | - |* * | - | | - +--------+ */ - 0x00, - 0x00, - 0x90, - 0x60, - 0x60, - 0x90, - 0x00, - - /* Character (0x79): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |* * | - |* * | - | * * | - | * | - | * | - +--------+ */ - 0x00, - 0x00, - 0x90, - 0x90, - 0x50, - 0x20, - 0x40, - - /* Character (0x7a): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | | - | | - |**** | - | * | - | * | - |**** | - | | - +--------+ */ - 0x00, - 0x00, - 0xf0, - 0x20, - 0x40, - 0xf0, - 0x00, - - /* Character (0x7b): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - |** | - | * | - | * | - | * | - | | - +--------+ */ - 0x20, - 0x40, - 0xc0, - 0x40, - 0x40, - 0x20, - 0x00, - - /* Character (0x7c): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * | - | * | - | * | - | * | - | * | - | * | - | | - +--------+ */ - 0x40, - 0x40, - 0x40, - 0x40, - 0x40, - 0x40, - 0x00, - - /* Character (0x7d): - bbw=6, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - |* | - | * | - | ** | - | * | - | * | - |* | - | | - +--------+ */ - 0x80, - 0x40, - 0x60, - 0x40, - 0x40, - 0x80, - 0x00, - - /* Character (0x7e): - bbw=5, bbh=7, bbx=0, bby=-1, width=5 - +--------+ - | * * | - |* * | - | | - | | - | | - | | - | | - +--------+ */ - 0x50, - 0xa0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; - -#if 0 -/* Character width data. */ -static UNS_8 x5x7_width [] = -{ - 5, /* (0x00) */ - 5, /* (0x01) */ - 5, /* (0x02) */ - 5, /* (0x03) */ - 5, /* (0x04) */ - 5, /* (0x05) */ - 5, /* (0x06) */ - 5, /* (0x07) */ - 5, /* (0x08) */ - 5, /* (0x09) */ - 5, /* (0x0a) */ - 5, /* (0x0b) */ - 5, /* (0x0c) */ - 5, /* (0x0d) */ - 5, /* (0x0e) */ - 5, /* (0x0f) */ - 5, /* (0x10) */ - 5, /* (0x11) */ - 5, /* (0x12) */ - 5, /* (0x13) */ - 5, /* (0x14) */ - 5, /* (0x15) */ - 5, /* (0x16) */ - 5, /* (0x17) */ - 5, /* (0x18) */ - 5, /* (0x19) */ - 5, /* (0x1a) */ - 5, /* (0x1b) */ - 5, /* (0x1c) */ - 5, /* (0x1d) */ - 5, /* (0x1e) */ - 5, /* (0x1f) */ - 5, /* (0x20) */ - 5, /* (0x21) */ - 5, /* (0x22) */ - 5, /* (0x23) */ - 5, /* (0x24) */ - 5, /* (0x25) */ - 5, /* (0x26) */ - 5, /* (0x27) */ - 5, /* (0x28) */ - 5, /* (0x29) */ - 5, /* (0x2a) */ - 5, /* (0x2b) */ - 5, /* (0x2c) */ - 5, /* (0x2d) */ - 5, /* (0x2e) */ - 5, /* (0x2f) */ - 5, /* (0x30) */ - 5, /* (0x31) */ - 5, /* (0x32) */ - 5, /* (0x33) */ - 5, /* (0x34) */ - 5, /* (0x35) */ - 5, /* (0x36) */ - 5, /* (0x37) */ - 5, /* (0x38) */ - 5, /* (0x39) */ - 5, /* (0x3a) */ - 5, /* (0x3b) */ - 5, /* (0x3c) */ - 5, /* (0x3d) */ - 5, /* (0x3e) */ - 5, /* (0x3f) */ - 5, /* (0x40) */ - 5, /* (0x41) */ - 5, /* (0x42) */ - 5, /* (0x43) */ - 5, /* (0x44) */ - 5, /* (0x45) */ - 5, /* (0x46) */ - 5, /* (0x47) */ - 5, /* (0x48) */ - 5, /* (0x49) */ - 5, /* (0x4a) */ - 5, /* (0x4b) */ - 5, /* (0x4c) */ - 5, /* (0x4d) */ - 5, /* (0x4e) */ - 5, /* (0x4f) */ - 5, /* (0x50) */ - 5, /* (0x51) */ - 5, /* (0x52) */ - 5, /* (0x53) */ - 5, /* (0x54) */ - 5, /* (0x55) */ - 5, /* (0x56) */ - 5, /* (0x57) */ - 5, /* (0x58) */ - 5, /* (0x59) */ - 5, /* (0x5a) */ - 5, /* (0x5b) */ - 5, /* (0x5c) */ - 5, /* (0x5d) */ - 5, /* (0x5e) */ - 5, /* (0x5f) */ - 5, /* (0x60) */ - 5, /* (0x61) */ - 5, /* (0x62) */ - 5, /* (0x63) */ - 5, /* (0x64) */ - 5, /* (0x65) */ - 5, /* (0x66) */ - 5, /* (0x67) */ - 5, /* (0x68) */ - 5, /* (0x69) */ - 5, /* (0x6a) */ - 5, /* (0x6b) */ - 5, /* (0x6c) */ - 5, /* (0x6d) */ - 5, /* (0x6e) */ - 5, /* (0x6f) */ - 5, /* (0x70) */ - 5, /* (0x71) */ - 5, /* (0x72) */ - 5, /* (0x73) */ - 5, /* (0x74) */ - 5, /* (0x75) */ - 5, /* (0x76) */ - 5, /* (0x77) */ - 5, /* (0x78) */ - 5, /* (0x79) */ - 5, /* (0x7a) */ - 5, /* (0x7b) */ - 5, /* (0x7c) */ - 5, /* (0x7d) */ - 5, /* (0x7e) */ -}; -#endif - -/* Font information structure */ -//const FONT_T font_x5x7 = {7, 0x, 0x7E, x5x7_bits, x5x7_width}; - - - -uint8_t x5x7_map_char_table(uint8_t ch) -{ - if ( ch > 0x7e ) - { - /* limit to largest character */ - ch = 0x7e - 32 + 9; - } - else if ( ch >= 32 ) - { - /* normal character */ - ch = ch - 32 + 9; - } - else - { - /* special character */ - } - - return ch; -} - diff --git a/Makefile b/Makefile index a33ec7e4..3c9f556f 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,7 @@ CSRC = $(STARTUPSRC) \ $(STREAMSSRC) \ $(SHELLSRC) \ usbcfg.c \ - main.c si5351.c tlv320aic3204.c dsp.c plot.c ui.c ili9341.c numfont20x24.c Font5x7.c Font8x8.c flash.c adc.c + main.c si5351.c tlv320aic3204.c dsp.c plot.c ui.c ili9341.c numfont20x24.c Font8x8.c flash.c adc.c # $(TESTSRC) \ diff --git a/ili9341.c b/ili9341.c index b5b68336..464454f1 100644 --- a/ili9341.c +++ b/ili9341.c @@ -336,28 +336,30 @@ ili9341_read_memory_continue(int len, uint16_t* out) -void +unsigned char ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) { uint16_t *buf = spi_buffer; uint8_t bits; - int c, r; + int cline, ccol; - ch = x5x7_map_char_table(ch); + ch = x8x8_map_char_table(ch); - for(c = 0; c < 7*size; c++) + for(cline = 0; cline < 8*size; cline++) { - bits = x5x7_bits[(ch * 7) + (c / size)]; - for (r = 0; r < 5*size; r++) + bits = x8x8_bits[ch][cline/size]; + for (ccol = 0; ccol < x8x8_len[ch]*size; ccol++) { *buf++ = (0x80 & bits) ? fg : bg; - if (r % size == (size-1)) + if (ccol % size == (size-1)) { bits <<= 1; } } } - ili9341_bulk(x, y, 5*size, 7*size); + ili9341_bulk(x, y, x8x8_len[ch]*size, 8*size); + + return x8x8_len[ch]*size; } @@ -365,9 +367,12 @@ ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_ void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) { - while (*str) { - ili9341_drawchar_size(*str, x, y, fg, bg, size); - x += 5 * size; + unsigned char clength = 0; + + while (*str) + { + clength = ili9341_drawchar_size(*str, x, y, fg, bg, size); + x += clength; str++; } } diff --git a/nanovna.h b/nanovna.h index beef50d8..64bd322f 100644 --- a/nanovna.h +++ b/nanovna.h @@ -150,7 +150,6 @@ extern int area_height; // font -extern const uint8_t x5x7_bits[]; extern const uint8_t x8x8_bits[][8]; extern const uint8_t x8x8_len[]; extern const uint32_t numfont20x24[][24]; @@ -164,7 +163,6 @@ extern const uint32_t numfont20x24[][24]; #define S_LARROW "\003" #define S_RARROW "\004" -extern uint8_t x5x7_map_char_table(uint8_t ch); extern uint8_t x8x8_map_char_table(uint8_t ch); @@ -287,7 +285,7 @@ void ili9341_init(void); void ili9341_test(int mode); void ili9341_bulk(int x, int y, int w, int h); void ili9341_fill(int x, int y, int w, int h, int color); -void ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); +unsigned char ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); unsigned char ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); void ili9341_drawstring_8x8(const char *str, int x, int y, uint16_t fg, uint16_t bg); diff --git a/plot.c b/plot.c index 46a5d737..a6f308a9 100644 --- a/plot.c +++ b/plot.c @@ -1022,24 +1022,31 @@ draw_marker(int w, int h, int x, int y, int c, int ch) { int i, j; - ch = x5x7_map_char_table(ch); + ch = x8x8_map_char_table(ch); - for (j = 10; j >= 0; j--) + for ( j = 12; j >= 0; j-- ) { int j0 = j / 2; - for (i = -j0; i <= j0; i++) + for ( i = -j0; i <= j0; i++ ) { int x0 = x + i; int y0 = y - j; int cc = c; - if ( j <= 9 && j > 2 && i >= -1 && i <= 3 ) + + if ( (4 < j) && (j <= 11) && (-4 <= i) && (i <= 3) ) { - uint8_t bits = x5x7_bits[(ch * 7) + (9-j)]; - if ( bits & (0x80>>(i+1)) ) + uint8_t bits = x8x8_bits[ch][11-j]; + + if ( bits & (0x80>>(i+3)) ) + { cc = 0; + } } + if (y0 >= 0 && y0 < h && x0 >= 0 && x0 < w) + { spi_buffer[y0*w+x0] = cc; + } } } } @@ -1365,6 +1372,7 @@ request_to_draw_cells_behind_numeric_input(void) +#if 0 void cell_drawchar_5x7(int w, int h, uint8_t ch, int x, int y, uint16_t fg, int invert) { @@ -1395,32 +1403,7 @@ cell_drawchar_5x7(int w, int h, uint8_t ch, int x, int y, uint16_t fg, int inver } } } - - - -void -cell_drawstring_5x7(int w, int h, char *str, int x, int y, uint16_t fg) -{ - while (*str) { - cell_drawchar_5x7(w, h, *str, x, y, fg, FALSE); - x += 5; - str++; - } -} - - - -void -cell_drawstring_invert_5x7(int w, int h, char *str, int x, int y, uint16_t fg, int invert) -{ - while (*str) - { - cell_drawchar_5x7(w, h, *str, x, y, fg, invert); - x += 5; - str++; - } -} - +#endif uint16_t diff --git a/ui.c b/ui.c index 6c3fa4c9..cc087b85 100644 --- a/ui.c +++ b/ui.c @@ -430,14 +430,14 @@ enter_dfu(void) { adc_stop(ADC1); - int x = 100, y = 20; + int x = 110, y = 20; // leave a last message ili9341_fill(0, 0, 320, 240, 0); - ili9341_drawstring_size("DFU", x+30, y, 0xffff, 0x0000, 4); + ili9341_drawstring_size("DFU", x, y, 0xffff, 0x0000, 4); + x = 5; y += 50; - ili9341_drawstring_8x8_var("Device Firmware Update Mode", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("To exit DFU mode, please reset device yourself.", x, y += 10, 0xffff, 0x0000); From 281bfaf0d34cfbf777ebc55d7532040bff0fda4f Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sun, 6 Oct 2019 19:04:25 +0200 Subject: [PATCH 15/42] fix: merge conflict --- main.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/main.c b/main.c index 54f0913b..dbc63702 100644 --- a/main.c +++ b/main.c @@ -37,9 +37,6 @@ static void apply_error_term_at(int i); static void apply_edelay_at(int i); static void cal_interpolate(int s); -void update_frequencies(void); -void set_frequencies(uint32_t start, uint32_t stop, int16_t points); - static void set_frequencies(uint32_t start, uint32_t stop, int16_t points); static void update_frequencies(void); @@ -608,17 +605,17 @@ float cal_data[5][101][2]; #endif config_t config = { - /* magic */ CONFIG_MAGIC, - /* dac_value */ 1922, - /* grid_color */ 0x1084, - /* menu_normal_color */ 0xffff, - /* menu_active_color */ 0x7777, - /* trace_color[4] */ { RGB_565(255,255,0), RGB_565(0,40,255), RGB_565(0,255,0), RGB_565(255,200,20) }, - /* trace_colors[4] */ // { RGB565(0,255,255), RGB565(255,0,40), RGB565(0,0,255), RGB565(50,255,0) }, - /* touch_cal[4] */ { 411, 592, 151, 189 }, - /* default_loadcal */ 0, - /* harmonic_freq_threshold */ 300000000, - /* checksum */ 0 + .magic = CONFIG_MAGIC, + .dac_value = 1922, + .grid_color = 0x1084, + .menu_normal_color = 0xffff, + .menu_active_color = 0x7777, + /* .trace_color = { RGB565(0,255,255), RGB565(255,0,40), RGB565(0,0,255), RGB565(50,255,0) }, */ + .trace_color = { RGB_565(255,255,0), RGB_565(0,40,255), RGB_565(0,255,0), RGB_565(255,200,20) }, + .touch_cal = { 411, 592, 151, 189 }, //{ 620, 600, 160, 190 }, + .default_loadcal = 0, + .harmonic_freq_threshold = 300000000, + .checksum = 0 }; properties_t current_props = { From 654deb50a16cfcdfe8f0c4c4ffd6c2f48b8ac021 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Thu, 10 Oct 2019 18:20:04 +0200 Subject: [PATCH 16/42] merged upstream, compiles with 8px font --- plot.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plot.c b/plot.c index 168c6822..af409a31 100644 --- a/plot.c +++ b/plot.c @@ -1562,19 +1562,22 @@ cell_draw_marker_info(int m, int n, int w, int h) if (electrical_delay != 0) { // draw electrical delay + + // fixme: adapt positions for 8px font + int xpos = 21; - int ypos = 1 + (j/2)*7; + int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH -CELLOFFSETX; ypos -= n * CELLHEIGHT; chsnprintf(buf, sizeof buf, "Edelay"); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); - xpos += 7 * 5; + cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += 8 * 8; int n = string_value_with_prefix(buf, sizeof buf, electrical_delay * 1e-12, 's'); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); - xpos += n * 5 + 5; + cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += n * 8 + 8; float light_speed_ps = 299792458e-12; //(m/ps) string_value_with_prefix(buf, sizeof buf, electrical_delay * light_speed_ps * velocity_factor / 100.0, 'm'); - cell_drawstring_5x7(w, h, buf, xpos, ypos, 0xffff); + cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); } // draw marker frequency From 887108ebde0dd3873433cf852b15e3d02495be46 Mon Sep 17 00:00:00 2001 From: cho45 Date: Sat, 12 Oct 2019 05:01:32 +0900 Subject: [PATCH 17/42] too much cost for sin_table --- fft.h | 38 ++------------------------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/fft.h b/fft.h index 02506718..9f8c44cb 100644 --- a/fft.h +++ b/fft.h @@ -33,39 +33,6 @@ static uint16_t reverse_bits(uint16_t x, int n) { return result; } -static const float sin_table[] = { - /* - * float has about 7.2 digits of precision - for (uint8_t i = 0; i < FFT_SIZE - (FFT_SIZE / 4); i++) { - printf("% .8f,%c", sin(2 * M_PI * i / FFT_SIZE), i % 8 == 7 ? '\n' : ' '); - } - */ - 0.00000000, 0.02454123, 0.04906767, 0.07356456, 0.09801714, 0.12241068, 0.14673047, 0.17096189, - 0.19509032, 0.21910124, 0.24298018, 0.26671276, 0.29028468, 0.31368174, 0.33688985, 0.35989504, - 0.38268343, 0.40524131, 0.42755509, 0.44961133, 0.47139674, 0.49289819, 0.51410274, 0.53499762, - 0.55557023, 0.57580819, 0.59569930, 0.61523159, 0.63439328, 0.65317284, 0.67155895, 0.68954054, - 0.70710678, 0.72424708, 0.74095113, 0.75720885, 0.77301045, 0.78834643, 0.80320753, 0.81758481, - 0.83146961, 0.84485357, 0.85772861, 0.87008699, 0.88192126, 0.89322430, 0.90398929, 0.91420976, - 0.92387953, 0.93299280, 0.94154407, 0.94952818, 0.95694034, 0.96377607, 0.97003125, 0.97570213, - 0.98078528, 0.98527764, 0.98917651, 0.99247953, 0.99518473, 0.99729046, 0.99879546, 0.99969882, - 1.00000000, 0.99969882, 0.99879546, 0.99729046, 0.99518473, 0.99247953, 0.98917651, 0.98527764, - 0.98078528, 0.97570213, 0.97003125, 0.96377607, 0.95694034, 0.94952818, 0.94154407, 0.93299280, - 0.92387953, 0.91420976, 0.90398929, 0.89322430, 0.88192126, 0.87008699, 0.85772861, 0.84485357, - 0.83146961, 0.81758481, 0.80320753, 0.78834643, 0.77301045, 0.75720885, 0.74095113, 0.72424708, - 0.70710678, 0.68954054, 0.67155895, 0.65317284, 0.63439328, 0.61523159, 0.59569930, 0.57580819, - 0.55557023, 0.53499762, 0.51410274, 0.49289819, 0.47139674, 0.44961133, 0.42755509, 0.40524131, - 0.38268343, 0.35989504, 0.33688985, 0.31368174, 0.29028468, 0.26671276, 0.24298018, 0.21910124, - 0.19509032, 0.17096189, 0.14673047, 0.12241068, 0.09801714, 0.07356456, 0.04906767, 0.02454123, - 0.00000000, -0.02454123, -0.04906767, -0.07356456, -0.09801714, -0.12241068, -0.14673047, -0.17096189, - -0.19509032, -0.21910124, -0.24298018, -0.26671276, -0.29028468, -0.31368174, -0.33688985, -0.35989504, - -0.38268343, -0.40524131, -0.42755509, -0.44961133, -0.47139674, -0.49289819, -0.51410274, -0.53499762, - -0.55557023, -0.57580819, -0.59569930, -0.61523159, -0.63439328, -0.65317284, -0.67155895, -0.68954054, - -0.70710678, -0.72424708, -0.74095113, -0.75720885, -0.77301045, -0.78834643, -0.80320753, -0.81758481, - -0.83146961, -0.84485357, -0.85772861, -0.87008699, -0.88192126, -0.89322430, -0.90398929, -0.91420976, - -0.92387953, -0.93299280, -0.94154407, -0.94952818, -0.95694034, -0.96377607, -0.97003125, -0.97570213, - -0.98078528, -0.98527764, -0.98917651, -0.99247953, -0.99518473, -0.99729046, -0.99879546, -0.99969882, -}; - /*** * dir = forward: 0, inverse: 1 * https://www.nayuki.io/res/free-small-fft-in-multiple-languages/fft.c @@ -73,7 +40,6 @@ static const float sin_table[] = { static void fft256(float array[][2], const uint8_t dir) { const uint16_t n = 256; const uint8_t levels = 8; // log2(n) - const float* const cos_table = &sin_table[64]; const uint8_t real = dir & 1; const uint8_t imag = ~real & 1; @@ -97,8 +63,8 @@ static void fft256(float array[][2], const uint8_t dir) { for (uint16_t i = 0; i < n; i += size) { for (uint16_t j = i, k = 0; j < i + halfsize; j++, k += tablestep) { uint16_t l = j + halfsize; - float tpre = array[l][real] * cos_table[k] + array[l][imag] * sin_table[k]; - float tpim = -array[l][real] * sin_table[k] + array[l][imag] * cos_table[k] ; + float tpre = array[l][real] * cos(2 * M_PI * k / 256) + array[l][imag] * sin(2 * M_PI * k / 256); + float tpim = -array[l][real] * sin(2 * M_PI * k / 256) + array[l][imag] * cos(2 * M_PI * k / 256); array[l][real] = array[j][real] - tpre; array[l][imag] = array[j][imag] - tpim; array[j][real] += tpre; From 9dc18102f1d06c5246247cfd05d92dc0af1f6e79 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 12 Oct 2019 22:10:57 +0200 Subject: [PATCH 18/42] fix: position of edelay with 8px font --- plot.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plot.c b/plot.c index af409a31..f79f37fa 100644 --- a/plot.c +++ b/plot.c @@ -1563,21 +1563,21 @@ cell_draw_marker_info(int m, int n, int w, int h) if (electrical_delay != 0) { // draw electrical delay - // fixme: adapt positions for 8px font - - int xpos = 21; + int xpos = 1; int ypos = 1 + (j/2)*8; + uint16_t slen = 0; + xpos -= m * CELLWIDTH -CELLOFFSETX; ypos -= n * CELLHEIGHT; - chsnprintf(buf, sizeof buf, "Edelay"); - cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); - xpos += 8 * 8; - int n = string_value_with_prefix(buf, sizeof buf, electrical_delay * 1e-12, 's'); - cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); - xpos += n * 8 + 8; + chsnprintf(buf, sizeof buf, "Edelay "); + slen = cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += slen; + string_value_with_prefix(buf, sizeof buf, electrical_delay * 1e-12, 's'); + slen = cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); + xpos += slen + 8; float light_speed_ps = 299792458e-12; //(m/ps) string_value_with_prefix(buf, sizeof buf, electrical_delay * light_speed_ps * velocity_factor / 100.0, 'm'); - cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } // draw marker frequency From d007b864bf818042c80f5c7ba7a79af1df6e5ae9 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sun, 13 Oct 2019 19:27:28 +0200 Subject: [PATCH 19/42] first official release with 8px font --- plot.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/plot.c b/plot.c index f79f37fa..3fb920d6 100644 --- a/plot.c +++ b/plot.c @@ -1442,11 +1442,6 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v uint8_t bits; uint16_t charwidthpx = 8; int cline, r; - -// fixme -// if (y <= -8 || y >= h || x <= -8 || x >= w) -// return 0; - ch = x8x8_map_char_table(ch); @@ -1455,9 +1450,9 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v charwidthpx = x8x8_len[ch]; } - -// if (y <= -8 || y >= h || x >= w ) // fixme x <= -(charlen) || x >= w) -// return 0; + + if ( y <= -8 || y >= h || x <= -(charwidthpx) || x >= w ) + return charwidthpx; for (cline = 0; cline < 8; cline++) @@ -1544,7 +1539,7 @@ cell_draw_marker_info(int m, int n, int w, int h) continue; int xpos = 1 + (j%2)*160; - int ypos = 1 + (j/2)*8; + int ypos = 1 + (j/2)*10; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1560,11 +1555,12 @@ cell_draw_marker_info(int m, int n, int w, int h) j++; } - if (electrical_delay != 0) { + if (electrical_delay != 0) + { // draw electrical delay int xpos = 1; - int ypos = 1 + (j/2)*8; + int ypos = 1 + (j/2)*10; uint16_t slen = 0; xpos -= m * CELLWIDTH -CELLOFFSETX; @@ -1582,7 +1578,7 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw marker frequency int xpos = 160; - int ypos = 1 + (j/2)*8; + int ypos = 1 + (j/2)*10; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1607,7 +1603,7 @@ cell_draw_marker_info(int m, int n, int w, int h) int idx0 = markers[previous_marker].index; xpos = 160; xpos -= m * CELLWIDTH - CELLOFFSETX; - ypos += 8; + ypos += 10; chsnprintf(buf, sizeof buf, "%s%d:", S_DIAMOND, previous_marker+1); strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); From 0c5d88f3d911d2b9de06a01667140a4abc64a167 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sun, 13 Oct 2019 19:44:04 +0200 Subject: [PATCH 20/42] fix: workaround overwrite issue --- plot.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/plot.c b/plot.c index 3fb920d6..3e341226 100644 --- a/plot.c +++ b/plot.c @@ -1539,7 +1539,7 @@ cell_draw_marker_info(int m, int n, int w, int h) continue; int xpos = 1 + (j%2)*160; - int ypos = 1 + (j/2)*10; + int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1560,7 +1560,7 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw electrical delay int xpos = 1; - int ypos = 1 + (j/2)*10; + int ypos = 1 + (j/2)*8; uint16_t slen = 0; xpos -= m * CELLWIDTH -CELLOFFSETX; @@ -1578,7 +1578,7 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw marker frequency int xpos = 160; - int ypos = 1 + (j/2)*10; + int ypos = 1 + (j/2)*8; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1603,15 +1603,12 @@ cell_draw_marker_info(int m, int n, int w, int h) int idx0 = markers[previous_marker].index; xpos = 160; xpos -= m * CELLWIDTH - CELLOFFSETX; - ypos += 10; + ypos += 8; chsnprintf(buf, sizeof buf, "%s%d:", S_DIAMOND, previous_marker+1); strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); xpos += strwidthpx + 4; - - - frequency_string(buf, sizeof buf, frequencies[idx] - frequencies[idx0]); cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); } From 5c01f722600b5f497a112b5fcf8a07526d1e0571 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sun, 13 Oct 2019 22:03:08 +0200 Subject: [PATCH 21/42] feat: bigger space between marker infos --- plot.c | 55 +++++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/plot.c b/plot.c index 3e341226..b79db582 100644 --- a/plot.c +++ b/plot.c @@ -768,6 +768,7 @@ static inline void markmap_upperarea(void) { markmap[current_mappage][0] |= 0xffff; + markmap[current_mappage][1] |= 0xffff; } static inline void @@ -1375,8 +1376,10 @@ redraw_marker(int marker, int update_info) // mark cells on marker info if (update_info) + { markmap[current_mappage][0] = 0xffff; - + markmap[current_mappage][1] = 0xffff; + } draw_all_cells(TRUE); } @@ -1402,40 +1405,6 @@ request_to_draw_cells_behind_numeric_input(void) -#if 0 -void -cell_drawchar_5x7(int w, int h, uint8_t ch, int x, int y, uint16_t fg, int invert) -{ - uint8_t bits; - int c, r; - - if (y <= -7 || y >= h || x <= -5 || x >= w) - return; - - ch = x5x7_map_char_table(ch); - - for(c = 0; c < 7; c++) - { - if ((y + c) < 0 || (y + c) >= h) - continue; - - bits = x5x7_bits[(ch * 7) + c]; - - if (invert) - bits = ~bits; - - for (r = 0; r < 5; r++) - { - if ( (x+r) >= 0 && (x+r) < w && (0x80 & bits) ) - spi_buffer[(y+c)*w + (x+r)] = fg; - - bits <<= 1; - } - } -} -#endif - - uint16_t cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, uint8_t invert) { @@ -1523,6 +1492,8 @@ cell_draw_marker_info(int m, int n, int w, int h) char buf[24]; int t; uint16_t slen, strwidthpx = 0; + +#define MARKER_Y_DELTA 10 if (n > 1) return; @@ -1538,8 +1509,8 @@ cell_draw_marker_info(int m, int n, int w, int h) if (!trace[t].enabled) continue; - int xpos = 1 + (j%2)*160; - int ypos = 1 + (j/2)*8; + int xpos = 1 + (j%2) * 160; + int ypos = 1 + (j/2) * MARKER_Y_DELTA; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1560,10 +1531,10 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw electrical delay int xpos = 1; - int ypos = 1 + (j/2)*8; + int ypos = 1 + (j/2) * MARKER_Y_DELTA; uint16_t slen = 0; - xpos -= m * CELLWIDTH -CELLOFFSETX; + xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; chsnprintf(buf, sizeof buf, "Edelay "); slen = cell_drawstring_8x8_var(w, h, buf, xpos, ypos, 0xffff, FALSE); @@ -1578,7 +1549,7 @@ cell_draw_marker_info(int m, int n, int w, int h) // draw marker frequency int xpos = 160; - int ypos = 1 + (j/2)*8; + int ypos = 1 + (j/2) * MARKER_Y_DELTA; xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; @@ -1598,12 +1569,12 @@ cell_draw_marker_info(int m, int n, int w, int h) } // draw marker delta - if ( previous_marker >= 0 && active_marker != previous_marker && markers[previous_marker].enabled ) + if ( (previous_marker >= 0) && (active_marker != previous_marker) && (markers[previous_marker].enabled) ) { int idx0 = markers[previous_marker].index; xpos = 160; xpos -= m * CELLWIDTH - CELLOFFSETX; - ypos += 8; + ypos += MARKER_Y_DELTA; chsnprintf(buf, sizeof buf, "%s%d:", S_DIAMOND, previous_marker+1); strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); From ca6a03b8fb85dc034c90efe876ff0d879fc1dc3d Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Fri, 18 Oct 2019 17:40:42 +0200 Subject: [PATCH 22/42] update doc --- README.md | 2 +- doc/nanovna_screen.jpg | Bin 0 -> 39469 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/nanovna_screen.jpg diff --git a/README.md b/README.md index 0127ea68..5e269a3b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ NanoVNA - Very tiny handheld Vector Network Analyzer [release]: https://github.com/ttrftech/NanoVNA/releases
- +
# About diff --git a/doc/nanovna_screen.jpg b/doc/nanovna_screen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9abe973f8eeb338212c7e813fb902910d8967bc5 GIT binary patch literal 39469 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 literal 0 HcmV?d00001 From df6bf23b34635ebadc3962d6ca68ebb6536d3e5f Mon Sep 17 00:00:00 2001 From: reald Date: Fri, 18 Oct 2019 17:44:42 +0200 Subject: [PATCH 23/42] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e269a3b..2c1916a5 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,8 @@ NanoVNA - Very tiny handheld Vector Network Analyzer [release]: https://github.com/ttrftech/NanoVNA/releases
- +

+

# About @@ -44,7 +45,7 @@ Download arm cross tools from [here](https://developer.arm.com/tools-and-softwar Fetch source and submodule. - $ git clone https://github.com/ttrftech/NanoVNA.git + $ git clone https://github.com/reald/NanoVNA.git $ cd NanoVNA $ git submodule update --init --recursive From ee173559a0d1752619666440e3ebcc7a6b5b22f9 Mon Sep 17 00:00:00 2001 From: reald Date: Fri, 18 Oct 2019 17:48:45 +0200 Subject: [PATCH 24/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c1916a5..00c1e9d8 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ standalone with lcd display, portable device with battery. This project aim to provide an RF gadget but useful instrument for enthusiast. -This repository contains source of NanoVNA firmware. +This repository contains source of NanoVNA firmware with a more readable font than the original. ## Prepare ARM Cross Tools From 68e602a07cb18c152e0b1b20c1bac08bb2612cc4 Mon Sep 17 00:00:00 2001 From: reald Date: Sun, 20 Oct 2019 17:28:55 +0200 Subject: [PATCH 25/42] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 00c1e9d8..1e3f2b6c 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,9 @@ enthusiast. This repository contains source of NanoVNA firmware with a more readable font than the original. +## Binary releases +From time to time there are binary releases so you don´t have to compile the firmware by yourself. See https://github.com/reald/NanoVNA/releases + ## Prepare ARM Cross Tools **UPDATE**: Recent gcc version works to build NanoVNA, no need old version. From 5bbd76804d22b80c80a97d01a634ddc6c5433383 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Mon, 21 Oct 2019 16:57:59 +0200 Subject: [PATCH 26/42] update version info --- ui.c | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/ui.c b/ui.c index 899e0511..9b127cea 100644 --- a/ui.c +++ b/ui.c @@ -34,23 +34,23 @@ uistat_t uistat = { -#define NO_EVENT 0 -#define EVT_BUTTON_SINGLE_CLICK 0x01 -#define EVT_BUTTON_DOUBLE_CLICK 0x02 -#define EVT_BUTTON_DOWN_LONG 0x04 -#define EVT_UP 0x10 -#define EVT_DOWN 0x20 -#define EVT_REPEAT 0x40 - -#define BUTTON_DOWN_LONG_TICKS 5000 /* 1sec */ -#define BUTTON_DOUBLE_TICKS 5000 /* 500ms */ -#define BUTTON_REPEAT_TICKS 1000 /* 100ms */ -#define BUTTON_DEBOUNCE_TICKS 200 +#define NO_EVENT 0 +#define EVT_BUTTON_SINGLE_CLICK 0x01 +#define EVT_BUTTON_DOUBLE_CLICK 0x02 +#define EVT_BUTTON_DOWN_LONG 0x04 +#define EVT_UP 0x10 +#define EVT_DOWN 0x20 +#define EVT_REPEAT 0x40 + +#define BUTTON_DOWN_LONG_TICKS 5000 /* 1sec */ +#define BUTTON_DOUBLE_TICKS 5000 /* 500ms */ +#define BUTTON_REPEAT_TICKS 1000 /* 100ms */ +#define BUTTON_DEBOUNCE_TICKS 200 /* lever switch assignment */ -#define BIT_UP1 3 -#define BIT_PUSH 2 -#define BIT_DOWN1 1 +#define BIT_UP1 3 +#define BIT_PUSH 2 +#define BIT_DOWN1 1 #define READ_PORT() palReadPort(GPIOA) #define BUTTON_MASK 0b1111 @@ -122,10 +122,10 @@ static void menu_push_submenu(const menuitem_t *submenu); static int btn_check(void) { int cur_button = READ_PORT() & BUTTON_MASK; - int changed = last_button ^ cur_button; - int status = 0; + int changed = last_button ^ cur_button; + int status = 0; uint32_t ticks = chVTGetSystemTime(); - if (changed & (1<= BUTTON_DEBOUNCE_TICKS) { if (cur_button & (1< Date: Tue, 22 Oct 2019 20:52:16 +0200 Subject: [PATCH 27/42] smith chart value more sqished --- main.c | 2 +- plot.c | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index b0aa87e0..b934f84c 100644 --- a/main.c +++ b/main.c @@ -1443,7 +1443,7 @@ const struct { { "LMG", 7, 10 }, { "PHA", 4, 90 }, { "DEL", 4, 1e-9 }, - { "SMI", 0, 1 }, + { "SM", 0, 1 }, { "POL", 0, 1 }, { "LIN", 0, 0.125 }, { "SWR", 0, 1 }, diff --git a/plot.c b/plot.c index 6e85cefc..3a161df1 100644 --- a/plot.c +++ b/plot.c @@ -605,7 +605,7 @@ string_value_with_prefix(char *buf, int len, float val, char unit) } if (val < 10) { - n = chsnprintf(buf, len, "%.2f", val); + n = chsnprintf(buf, len, "%.1f", val); } else if (val < 100) { n = chsnprintf(buf, len, "%.1f", val); } else { @@ -1526,7 +1526,11 @@ cell_draw_marker_info(int m, int n, int w, int h) xpos += strwidthpx + 4; slen = trace_get_info(t, buf, sizeof buf); + buf[slen] = ' '; + slen++; + trace_get_value_string(t, buf+slen, (sizeof(buf))-slen, measured[trace[t].channel], idx); + cell_drawstring_8x8_var(w, h, buf, xpos, ypos, config.trace_color[t], FALSE); j++; From a8b9d51002c8ac756923c667a63c19bb6246b2dc Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 26 Oct 2019 10:36:01 +0200 Subject: [PATCH 28/42] feat: big info for ch0 --- main.c | 2 +- nanovna.h | 2 + plot.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui.c | 19 +++++++++- 4 files changed, 128 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index b934f84c..e61f0046 100644 --- a/main.c +++ b/main.c @@ -57,7 +57,7 @@ int8_t sweep_once = FALSE; int8_t cal_auto_interpolate = TRUE; uint16_t redraw_request = 0; // contains REDRAW_XXX flags int16_t vbat = 0; - +bool biginfo_enabled = FALSE; static THD_WORKING_AREA(waThread1, 640); static THD_FUNCTION(Thread1, arg) diff --git a/nanovna.h b/nanovna.h index d34dd218..4fe81ea7 100644 --- a/nanovna.h +++ b/nanovna.h @@ -320,6 +320,8 @@ extern properties_t current_props; extern int8_t previous_marker; +extern bool biginfo_enabled; + #define frequency0 current_props._frequency0 #define frequency1 current_props._frequency1 #define sweep_points current_props._sweep_points diff --git a/plot.c b/plot.c index 3a161df1..d4b5c722 100644 --- a/plot.c +++ b/plot.c @@ -10,6 +10,10 @@ static void cell_draw_marker_info(int m, int n, int w, int h); void frequency_string(char *buf, size_t len, int32_t freq); void markmap_all_markers(void); +uint16_t cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert); +uint16_t cell_drawstring_size(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); + +void request_to_draw_cells_behind_biginfo(void); //#define GRID_COLOR 0x0863 //uint16_t grid_color = 0x1084; @@ -1207,6 +1211,7 @@ draw_cell(int m, int n) int i0, i1; int i; int t; + char buf[24]; if (x0off + w > area_width) w = area_width - x0off; @@ -1280,6 +1285,40 @@ draw_cell(int m, int n) } PULSE; + + + /* draw large ch0 infos */ + int cxpos = 15, cypos = 50; + cxpos -= m * CELLWIDTH - CELLOFFSETX; + cypos -= n * CELLHEIGHT; + + + + if ( (biginfo_enabled != FALSE) && (active_marker >= 0) ) + { + float *coeff = measured[0][ markers[active_marker].index ]; + float v; + v = swr(coeff); + + chsnprintf(buf, sizeof(buf), "CH0 Marker %d:", active_marker + 1); + cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0x0000, 0xffff, 3); + + + chsnprintf(buf, sizeof(buf), "SWR 1:%.2f", v); + cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0xffff, 0x000, 3); + + frequency_string(buf, sizeof(buf), frequencies[ markers[active_marker].index ]); + cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0xffff, 0x0000, 3); + + gamma2imp(buf, sizeof(buf), coeff, frequencies[ markers[active_marker].index ]); + cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0xffff, 0x0000, 3); + + request_to_draw_cells_behind_biginfo(); + + + } + + #if 1 /* draw rectanglar plot */ for (t = 0; t < TRACES_MAX; t++) @@ -1412,6 +1451,19 @@ request_to_draw_cells_behind_numeric_input(void) + +void +request_to_draw_cells_behind_biginfo(void) +{ + int n, m; + for (m = 0; m <= 9; m++) + for (n = 2; n < 7; n++) + mark_map(m, n); + redraw_request |= REDRAW_CELLS; +} + + + uint16_t cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, uint8_t invert) { @@ -1455,6 +1507,42 @@ cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t v +uint16_t +cell_drawchar_size(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) +{ + uint8_t bits; + uint16_t charwidthpx; + uint8_t cline, ccol; + + ch = x8x8_map_char_table(ch); + + charwidthpx = x8x8_len[ch] * size; + + if ( y <= -(8*size) || y >= h || x <= -(charwidthpx) || x >= w ) + return charwidthpx; + + + for (cline = 0; cline < (8*size); cline++) + { + if ((y + cline) < 0 || (y + cline) >= h) + continue; + + bits = x8x8_bits[ch][cline/size]; + for (ccol = 0; ccol < charwidthpx; ccol++) + { + if ( (x+ccol) >= 0 && (x+ccol) < w ) + spi_buffer[(y+cline)*w + (x+ccol)] = (0x80 & bits) ? fg : bg; + + if (ccol % size == (size-1)) + bits <<= 1; + } + } + + return charwidthpx; +} + + + uint16_t cell_drawstring_8x8(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert) { @@ -1492,6 +1580,26 @@ cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, uint +uint16_t +cell_drawstring_size(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) +{ + unsigned char clength = 0; + uint16_t strwidthpx = 0; + + while (*str) + { + clength = cell_drawchar_size(w, h, *str, x, y, fg, bg, size); + x += clength; + strwidthpx += clength; + str++; + } + + return strwidthpx; + +} + + + static void cell_draw_marker_info(int m, int n, int w, int h) { diff --git a/ui.c b/ui.c index 9b127cea..eb79be2f 100644 --- a/ui.c +++ b/ui.c @@ -121,7 +121,7 @@ static void menu_push_submenu(const menuitem_t *submenu); static int btn_check(void) { - int cur_button = READ_PORT() & BUTTON_MASK; + int cur_button = READ_PORT() & BUTTON_MASK; int changed = last_button ^ cur_button; int status = 0; uint32_t ticks = chVTGetSystemTime(); @@ -402,7 +402,7 @@ show_version(void) y += 25; ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var("Variant with lager fonts by DL9CAT", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("Variant with lager fonts by DL9CAT. =^..^=", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Licensed under GPL.", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var(" see: https://github.com/reald/NanoVNA", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Version: " VERSION, x, y += 10, 0xffff, 0x0000); @@ -558,6 +558,20 @@ menu_config_cb(int item) redraw_frame(); request_to_redraw_grid(); draw_menu(); + break; + case 4: + if ( biginfo_enabled == FALSE ) + { + biginfo_enabled = TRUE; + } + else + { + biginfo_enabled = FALSE; + } + redraw_frame(); + request_to_redraw_grid(); + draw_menu(); + break; } } @@ -1057,6 +1071,7 @@ const menuitem_t menu_config[] = { { MT_CALLBACK, "\2TOUCH\0TEST", menu_config_cb }, { MT_CALLBACK, "SAVE", menu_config_cb }, { MT_CALLBACK, "VERSION", menu_config_cb }, + { MT_CALLBACK, "INFO CH0", menu_config_cb }, { MT_SUBMENU, " " S_RARROW " DFU", menu_dfu }, { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel From 641ad4f702f16a3f93928e45de5648019cfd54a0 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 26 Oct 2019 10:47:09 +0200 Subject: [PATCH 29/42] feat: ch0 infoscreen --- README.md | 5 +++-- doc/nanovna_infoscreen.jpg | Bin 0 -> 40436 bytes 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/nanovna_infoscreen.jpg diff --git a/README.md b/README.md index 1e3f2b6c..583d6be4 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ NanoVNA - Very tiny handheld Vector Network Analyzer [release]: https://github.com/ttrftech/NanoVNA/releases
-

-

+

+ +

# About diff --git a/doc/nanovna_infoscreen.jpg b/doc/nanovna_infoscreen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1f57617ee8ba1c70b702a303c4bfb43cfc4e6ea1 GIT binary patch literal 40436 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%0DVj)GFZq2YK=&@PXx3 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 A#{d8T literal 0 HcmV?d00001 From 5d58d28d5f0f897d9563347c0f86be6de58b938e Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 26 Oct 2019 23:11:07 +0200 Subject: [PATCH 30/42] fix: hide menu after info screen toggled --- ui.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ui.c b/ui.c index eb79be2f..46575ece 100644 --- a/ui.c +++ b/ui.c @@ -568,9 +568,8 @@ menu_config_cb(int item) { biginfo_enabled = FALSE; } - redraw_frame(); - request_to_redraw_grid(); - draw_menu(); + menu_move_back(); + ui_mode_normal(); break; } } From e5654590b1b959d8bd38f5f91cf88972ccda87e6 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Mon, 28 Oct 2019 16:14:10 +0100 Subject: [PATCH 31/42] fix: x position of infoscreen slightly moved --- plot.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plot.c b/plot.c index d4b5c722..16f2b462 100644 --- a/plot.c +++ b/plot.c @@ -1288,16 +1288,17 @@ draw_cell(int m, int n) /* draw large ch0 infos */ - int cxpos = 15, cypos = 50; - cxpos -= m * CELLWIDTH - CELLOFFSETX; - cypos -= n * CELLHEIGHT; - if ( (biginfo_enabled != FALSE) && (active_marker >= 0) ) { float *coeff = measured[0][ markers[active_marker].index ]; float v; + int cxpos = 2, cypos = 50; + + cxpos -= m * CELLWIDTH - CELLOFFSETX; + cypos -= n * CELLHEIGHT; + v = swr(coeff); chsnprintf(buf, sizeof(buf), "CH0 Marker %d:", active_marker + 1); From 93a39714f555cc6f991c5c75021ec0e4e36b2511 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Tue, 29 Oct 2019 16:56:54 +0100 Subject: [PATCH 32/42] save flash space --- ili9341.c | 78 ++++++++------------------------------- nanovna.h | 11 +++--- plot.c | 108 +++++++++++------------------------------------------- 3 files changed, 43 insertions(+), 154 deletions(-) diff --git a/ili9341.c b/ili9341.c index ac4ed316..64e7fef4 100644 --- a/ili9341.c +++ b/ili9341.c @@ -337,19 +337,28 @@ ili9341_read_memory_continue(int len, uint16_t* out) unsigned char -ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) +ili9341_drawchar(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert) { uint16_t *buf = spi_buffer; + uint16_t charwidthpx = 8 * size; uint8_t bits; - int cline, ccol; ch = x8x8_map_char_table(ch); + + if ( var != FALSE ) + { + charwidthpx = x8x8_len[ch] * size; + } for(cline = 0; cline < 8*size; cline++) { bits = x8x8_bits[ch][cline/size]; - for (ccol = 0; ccol < x8x8_len[ch]*size; ccol++) + + if (invert) + bits = ~bits; + + for (ccol = 0; ccol < charwidthpx; ccol++) { *buf++ = (0x80 & bits) ? fg : bg; if (ccol % size == (size-1)) @@ -358,76 +367,21 @@ ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_ } } } - ili9341_bulk(x, y, x8x8_len[ch]*size, 8*size); + ili9341_bulk(x, y, charwidthpx, 8*size); - return x8x8_len[ch]*size; -} - - - -void -ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) -{ - unsigned char clength = 0; - - while (*str) - { - clength = ili9341_drawchar_size(*str, x, y, fg, bg, size); - x += clength; - str++; - } -} - - - -unsigned char -ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) -{ - uint16_t *buf = spi_buffer; - uint16_t bits; - int cline, r; - - ch = x8x8_map_char_table(ch); - - for(cline = 0; cline < 8; cline++) - { - bits = x8x8_bits[ch][cline]; - - for (r = 7; r >= 0; r--) - { - *buf++ = (0x80 & bits) ? fg : bg; - bits <<= 1; - } - //*buf++ = bg; - } - ili9341_bulk(x, y, 8, 8); - - return x8x8_len[ch]; -} - - - -void -ili9341_drawstring_8x8(const char *str, int x, int y, uint16_t fg, uint16_t bg) -{ - while (*str) - { - (void)ili9341_drawchar_8x8(*str, x, y, fg, bg); - x += 8; - str++; - } + return charwidthpx; } void -ili9341_drawstring_8x8_var(const char *str, int x, int y, uint16_t fg, uint16_t bg) +ili9341_drawstring(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert) { unsigned char clength = 0; while (*str) { - clength = ili9341_drawchar_8x8(*str, x, y, fg, bg); + clength = ili9341_drawchar(*str, x, y, fg, bg, size, var, invert); x += clength; str++; } diff --git a/nanovna.h b/nanovna.h index 4fe81ea7..0301fa8a 100644 --- a/nanovna.h +++ b/nanovna.h @@ -277,11 +277,12 @@ void ili9341_init(void); void ili9341_test(int mode); void ili9341_bulk(int x, int y, int w, int h); void ili9341_fill(int x, int y, int w, int h, int color); -unsigned char ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); -void ili9341_drawstring_size(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); -unsigned char ili9341_drawchar_8x8(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg); -void ili9341_drawstring_8x8(const char *str, int x, int y, uint16_t fg, uint16_t bg); -void ili9341_drawstring_8x8_var(const char *str, int x, int y, uint16_t fg, uint16_t bg); + +unsigned char ili9341_drawchar(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert); +void ili9341_drawstring(const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert); +#define ili9341_drawstring_size(str, x, y, fg, bg, size) ili9341_drawstring(str, x, y, fg, bg, size, TRUE, FALSE) +#define ili9341_drawstring_8x8(str, x, y, fg, bg) ili9341_drawstring(str, x, y, fg, bg, 1, FALSE, FALSE) +#define ili9341_drawstring_8x8_var(str, x, y, fg, bg) ili9341_drawstring(str, x, y, fg, bg, 1, TRUE, FALSE) void ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint16_t bg); void ili9341_read_memory(int x, int y, int w, int h, int len, uint16_t* out); void ili9341_read_memory_continue(int len, uint16_t* out); diff --git a/plot.c b/plot.c index 16f2b462..8e5a3fc5 100644 --- a/plot.c +++ b/plot.c @@ -10,8 +10,16 @@ static void cell_draw_marker_info(int m, int n, int w, int h); void frequency_string(char *buf, size_t len, int32_t freq); void markmap_all_markers(void); -uint16_t cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert); -uint16_t cell_drawstring_size(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size); + +uint16_t cell_drawchar(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert); +uint16_t cell_drawstring(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, int8_t var, uint8_t invert); +#define cell_drawchar_size(w, h, ch, x, y, fg, bg, size) cell_drawchar(w, h, ch, x, y, fg, bg, size, 1, 0) +#define cell_drawchar_8x8(w, h, ch, x, y, fg, var, invert) cell_drawchar(w, h, ch, x, y, fg, 0x0000, 1, var, invert) +#define cell_drawstring_8x8(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, FALSE, FALSE) +#define cell_drawstring_8x8_var(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, TRUE, FALSE) +#define cell_drawstring_size(w, h, str, x, y, fg, bg, size) cell_drawstring(w, h, str, x, y, fg, bg, size, TRUE, FALSE) +#define ili9341_drawchar_size(ch, x, y, fg, bg, size) ili9341_drawchar(ch, x, y, fg, bg, size, TRUE, FALSE) +#define ili9341_drawchar_8x8(ch, x, y, fg, bg) ili9341_drawchar(ch, x, y, fg, bg, 1, TRUE, FALSE) void request_to_draw_cells_behind_biginfo(void); @@ -1452,7 +1460,6 @@ request_to_draw_cells_behind_numeric_input(void) - void request_to_draw_cells_behind_biginfo(void) { @@ -1466,69 +1473,32 @@ request_to_draw_cells_behind_biginfo(void) uint16_t -cell_drawchar_8x8(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint8_t var, uint8_t invert) +cell_drawchar(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert) { uint8_t bits; - uint16_t charwidthpx = 8; - int cline, r; + uint16_t charwidthpx = 8 * size; + uint8_t cline, ccol; ch = x8x8_map_char_table(ch); if ( var != FALSE ) { - charwidthpx = x8x8_len[ch]; - } - - - if ( y <= -8 || y >= h || x <= -(charwidthpx) || x >= w ) - return charwidthpx; - - - for (cline = 0; cline < 8; cline++) - { - if ((y + cline) < 0 || (y + cline) >= h) - continue; - - bits = x8x8_bits[ch][cline]; - - if (invert) - bits = ~bits; - - for (r = 0; r < charwidthpx; r++) - { - if ( (x+r) >= 0 && (x+r) < w && (0x80 & bits) ) - spi_buffer[(y+cline)*w + (x+r)] = fg; - - bits <<= 1; - } + charwidthpx = x8x8_len[ch] * size; } - - return charwidthpx; -} - - - -uint16_t -cell_drawchar_size(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) -{ - uint8_t bits; - uint16_t charwidthpx; - uint8_t cline, ccol; - - ch = x8x8_map_char_table(ch); - - charwidthpx = x8x8_len[ch] * size; if ( y <= -(8*size) || y >= h || x <= -(charwidthpx) || x >= w ) return charwidthpx; - for (cline = 0; cline < (8*size); cline++) { if ((y + cline) < 0 || (y + cline) >= h) continue; bits = x8x8_bits[ch][cline/size]; + + if (invert) + bits = ~bits; + for (ccol = 0; ccol < charwidthpx; ccol++) { if ( (x+ccol) >= 0 && (x+ccol) < w ) @@ -1545,51 +1515,15 @@ cell_drawchar_size(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t uint16_t -cell_drawstring_8x8(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert) -{ - uint16_t strwidthpx = 0; - - while (*str) - { - strwidthpx += cell_drawchar_8x8(w, h, *str, x, y, fg, FALSE, invert); - x += 8; - str++; - } - - return strwidthpx; -} - - - -uint16_t -cell_drawstring_8x8_var(int w, int h, char *str, int x, int y, uint16_t fg, uint8_t invert) -{ - unsigned char clength = 0; - uint16_t strwidthpx = 0; - - while (*str) - { - clength = cell_drawchar_8x8(w, h, *str, x, y, fg, TRUE, invert); - x += clength; - strwidthpx += clength; - str++; - } - - return strwidthpx; - -} - - - -uint16_t -cell_drawstring_size(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size) +cell_drawstring(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, int8_t var, uint8_t invert) { unsigned char clength = 0; uint16_t strwidthpx = 0; while (*str) { - clength = cell_drawchar_size(w, h, *str, x, y, fg, bg, size); + clength = cell_drawchar(w, h, *str, x, y, fg, bg, size, var, invert); + x += clength; strwidthpx += clength; str++; From 1b93e7a9fa595af3eb657990d8f22d126e3a879a Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Wed, 6 Nov 2019 16:27:05 +0100 Subject: [PATCH 33/42] minor update --- plot.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/plot.c b/plot.c index 8e5a3fc5..dc679196 100644 --- a/plot.c +++ b/plot.c @@ -13,8 +13,6 @@ void markmap_all_markers(void); uint16_t cell_drawchar(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert); uint16_t cell_drawstring(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, int8_t var, uint8_t invert); -#define cell_drawchar_size(w, h, ch, x, y, fg, bg, size) cell_drawchar(w, h, ch, x, y, fg, bg, size, 1, 0) -#define cell_drawchar_8x8(w, h, ch, x, y, fg, var, invert) cell_drawchar(w, h, ch, x, y, fg, 0x0000, 1, var, invert) #define cell_drawstring_8x8(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, FALSE, FALSE) #define cell_drawstring_8x8_var(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, TRUE, FALSE) #define cell_drawstring_size(w, h, str, x, y, fg, bg, size) cell_drawstring(w, h, str, x, y, fg, bg, size, TRUE, FALSE) From 38d449aaecd60d4c8b19262106974a484e9d7399 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Wed, 6 Nov 2019 17:16:35 +0100 Subject: [PATCH 34/42] minor change --- plot.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plot.c b/plot.c index a490fffd..4d1bbd2b 100644 --- a/plot.c +++ b/plot.c @@ -1380,11 +1380,7 @@ draw_cell(int m, int n) } PULSE; - - /* draw large ch0 infos */ - - if ( (biginfo_enabled != FALSE) && (active_marker >= 0) ) { float *coeff = measured[0][ markers[active_marker].index ]; @@ -1399,7 +1395,6 @@ draw_cell(int m, int n) chsnprintf(buf, sizeof(buf), "CH0 Marker %d:", active_marker + 1); cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0x0000, 0xffff, 3); - chsnprintf(buf, sizeof(buf), "SWR 1:%.2f", v); cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0xffff, 0x000, 3); @@ -1410,7 +1405,6 @@ draw_cell(int m, int n) cell_drawstring_size(w, h, buf, cxpos, cypos+=30, 0xffff, 0x0000, 3); request_to_draw_cells_behind_biginfo(); - } From 7f776ab77272761f427a663aa371952827615e33 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Wed, 6 Nov 2019 21:34:22 +0100 Subject: [PATCH 35/42] feat: save info screen status in config --- flash.c | 2 +- main.c | 4 ++++ nanovna.h | 1 + ui.c | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/flash.c b/flash.c index 01f58f10..52ea3bce 100644 --- a/flash.c +++ b/flash.c @@ -97,7 +97,7 @@ config_save(void) /* erase flash pages */ flash_erase_page((uint32_t)dst); - /* write to flahs */ + /* write to flash */ while(count-- > 0) { flash_program_half_word((uint32_t)dst, *src++); dst++; diff --git a/main.c b/main.c index 8436f68e..f79e21ee 100644 --- a/main.c +++ b/main.c @@ -612,6 +612,7 @@ config_t config = { .trace_color = { RGB_565(255,255,0), RGB_565(0,40,255), RGB_565(0,255,0), RGB_565(255,200,20) }, .touch_cal = { 411, 592, 151, 189 }, //{ 620, 600, 160, 190 }, .default_loadcal = 0, + .biginfo_enabled = FALSE, .harmonic_freq_threshold = 300000000, .checksum = 0 }; @@ -2080,6 +2081,9 @@ int main(void) */ dacStart(&DACD2, &dac1cfg1); + /* restore big info screen status */ + biginfo_enabled = config.biginfo_enabled; + /* initial frequencies */ update_frequencies(); diff --git a/nanovna.h b/nanovna.h index d1438937..14203ce0 100644 --- a/nanovna.h +++ b/nanovna.h @@ -195,6 +195,7 @@ typedef struct { uint16_t trace_color[TRACES_MAX]; int16_t touch_cal[4]; int8_t default_loadcal; + bool biginfo_enabled; uint32_t harmonic_freq_threshold; int32_t checksum; } config_t; diff --git a/ui.c b/ui.c index f3b99304..94deb092 100644 --- a/ui.c +++ b/ui.c @@ -568,6 +568,7 @@ menu_config_cb(int item) { biginfo_enabled = FALSE; } + config.biginfo_enabled = biginfo_enabled; menu_move_back(); ui_mode_normal(); break; From 6cb481d12478c3a31c21fadbe76842efb5eac2fa Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 9 Nov 2019 12:58:35 +0100 Subject: [PATCH 36/42] feat: provide md5 and sha256 checksums for build --- Makefile | 4 ++++ md5.txt | 0 2 files changed, 4 insertions(+) create mode 100644 md5.txt diff --git a/Makefile b/Makefile index 47254be4..a15a101e 100644 --- a/Makefile +++ b/Makefile @@ -228,6 +228,10 @@ include $(RULESPATH)/rules.mk flash: build/ch.bin dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D build/ch.bin +release: build/ch.bin + cd build; md5sum ch.* > md5.txt; sha256sum ch.* > sha256.txt + zip -j -r build/nanovna_$(VERSION).zip build/ch* build/sha256.txt build/md5.txt + dfu: -@printf "reset dfu\r" >/dev/cu.usbmodem401 diff --git a/md5.txt b/md5.txt new file mode 100644 index 00000000..e69de29b From a28d9d105304cc50c9232397ce8c412be47d6fac Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 9 Nov 2019 16:58:28 +0100 Subject: [PATCH 37/42] fix: invert active trace --- plot.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plot.c b/plot.c index 4d1bbd2b..593e4e06 100644 --- a/plot.c +++ b/plot.c @@ -13,8 +13,8 @@ void markmap_all_markers(void); uint16_t cell_drawchar(int w, int h, uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, uint8_t var, uint8_t invert); uint16_t cell_drawstring(int w, int h, const char *str, int x, int y, uint16_t fg, uint16_t bg, uint8_t size, int8_t var, uint8_t invert); -#define cell_drawstring_8x8(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, FALSE, FALSE) -#define cell_drawstring_8x8_var(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, TRUE, FALSE) +#define cell_drawstring_8x8(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, FALSE, invert) +#define cell_drawstring_8x8_var(w, h, str, x, y, fg, invert) cell_drawstring(w, h, str, x, y, fg, 0x0000, 1, TRUE, invert) #define cell_drawstring_size(w, h, str, x, y, fg, bg, size) cell_drawstring(w, h, str, x, y, fg, bg, size, TRUE, FALSE) #define ili9341_drawchar_size(ch, x, y, fg, bg, size) ili9341_drawchar(ch, x, y, fg, bg, size, TRUE, FALSE) #define ili9341_drawchar_8x8(ch, x, y, fg, bg) ili9341_drawchar(ch, x, y, fg, bg, 1, TRUE, FALSE) From c2183aa47fc781751a9c9ad7d58123c57bda06c7 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 9 Nov 2019 23:12:36 +0100 Subject: [PATCH 38/42] feat: create dfu file with release --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a15a101e..b8e166ab 100644 --- a/Makefile +++ b/Makefile @@ -228,8 +228,11 @@ include $(RULESPATH)/rules.mk flash: build/ch.bin dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D build/ch.bin -release: build/ch.bin +release: build/ch.hex build/ch.bin build/ch.dmp cd build; md5sum ch.* > md5.txt; sha256sum ch.* > sha256.txt + dfu-tool convert dfuse ./build/ch.hex ./build/ch.dfu + dfu-tool set-product ./build/ch.dfu df11 + dfu-tool set-vendor ./build/ch.dfu 0483 zip -j -r build/nanovna_$(VERSION).zip build/ch* build/sha256.txt build/md5.txt dfu: From 4b81e2e811bb8e506f7aade0a8c9f2c5dc6eec1b Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sun, 10 Nov 2019 12:47:23 +0100 Subject: [PATCH 39/42] feat: checksum for .dfu file --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b8e166ab..71aba594 100644 --- a/Makefile +++ b/Makefile @@ -229,10 +229,10 @@ flash: build/ch.bin dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D build/ch.bin release: build/ch.hex build/ch.bin build/ch.dmp - cd build; md5sum ch.* > md5.txt; sha256sum ch.* > sha256.txt dfu-tool convert dfuse ./build/ch.hex ./build/ch.dfu dfu-tool set-product ./build/ch.dfu df11 dfu-tool set-vendor ./build/ch.dfu 0483 + cd build; md5sum ch.* > md5.txt; sha256sum ch.* > sha256.txt zip -j -r build/nanovna_$(VERSION).zip build/ch* build/sha256.txt build/md5.txt dfu: From 9fb936eba90e639e4c5b456480b16f8963ee5ab4 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Sat, 30 Nov 2019 21:55:52 +0100 Subject: [PATCH 40/42] feat: delta symbol --- Font8x8.c | 4 ++-- nanovna.h | 3 ++- plot.c | 18 +++++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Font8x8.c b/Font8x8.c index 33d170d9..14b89c33 100644 --- a/Font8x8.c +++ b/Font8x8.c @@ -2,7 +2,7 @@ const uint8_t x8x8_bits[][8]={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /* nul */ - {0x10,0x38,0x7C,0xFE,0x7C,0x38,0x10,0x00}, /* diamond */ + {0x00,0x20,0x50,0x50,0x88,0x88,0xFC,0x00}, /* delta */ {0x00,0x50,0xa0,0x50,0xa0,0x50,0xa0,0x00}, /* multiline marker */ {0x00,0x20,0x40,0xF8,0xF8,0x40,0x20,0x00}, /* left arrow */ {0x00,0x20,0x10,0xF8,0xF8,0x10,0x20,0x00}, /* right arrow */ @@ -112,7 +112,7 @@ const uint8_t x8x8_bits[][8]={ const uint8_t x8x8_len[] = { 1, /* nul */ - 8, /* diamond */ + 6, /* delta */ 5, /* multiline marker */ 6, /* arrow left */ 6, /* arrow right */ diff --git a/nanovna.h b/nanovna.h index 153a933e..b384c656 100644 --- a/nanovna.h +++ b/nanovna.h @@ -146,7 +146,7 @@ extern const uint8_t x8x8_bits[][8]; extern const uint8_t x8x8_len[]; extern const uint8_t numfont20x22[][22 * 3]; -#define S_DIAMOND "\001" +#define S_DELTA "\001" #define S_MULTIL "\002" #define S_PI "\005" #define S_MICRO "\006" @@ -154,6 +154,7 @@ extern const uint8_t numfont20x22[][22 * 3]; #define S_DEGREE "\010" #define S_LARROW "\003" #define S_RARROW "\004" +#define C_DELTA '\001' extern uint8_t x8x8_map_char_table(uint8_t ch); diff --git a/plot.c b/plot.c index ee520482..c217a88a 100644 --- a/plot.c +++ b/plot.c @@ -766,13 +766,13 @@ trace_get_value_string_delta(int t, char *buf, int len, float array[101][2], int case TRC_LOGMAG: v = logmag(coeff) - logmag(coeff_ref); if (v == -INFINITY) - chsnprintf(buf, len, "\004-INF dB"); + chsnprintf(buf, len, S_DELTA "-INF dB"); else - chsnprintf(buf, len, "\004%.2fdB", v); + chsnprintf(buf, len, S_DELTA "%.2fdB", v); break; case TRC_PHASE: v = phase(coeff) - phase(coeff_ref); - chsnprintf(buf, len, "\004%.2f" S_DEGREE, v); + chsnprintf(buf, len, S_DELTA "%.2f" S_DEGREE, v); break; case TRC_DELAY: v = groupdelay_from_array(index, array) - groupdelay_from_array(index_ref, array); @@ -780,20 +780,20 @@ trace_get_value_string_delta(int t, char *buf, int len, float array[101][2], int break; case TRC_LINEAR: v = linear(coeff) - linear(coeff_ref); - chsnprintf(buf, len, "\004%.2f", v); + chsnprintf(buf, len, S_DELTA "%.2f", v); break; case TRC_SWR: v = swr(coeff) - swr(coeff_ref); - chsnprintf(buf, len, "\004%.2f", v); + chsnprintf(buf, len, S_DELTA "%.2f", v); break; case TRC_SMITH: format_smith_value(buf, len, coeff, frequencies[index]); break; case TRC_REAL: - chsnprintf(buf, len, "\004%.2f", coeff[0] - coeff_ref[0]); + chsnprintf(buf, len, S_DELTA "%.2f", coeff[0] - coeff_ref[0]); break; case TRC_IMAG: - chsnprintf(buf, len, "\004%.2fj", coeff[1] - coeff_ref[1]); + chsnprintf(buf, len, S_DELTA "%.2fj", coeff[1] - coeff_ref[1]); break; case TRC_R: gamma2resistance(buf, len, coeff); @@ -1738,7 +1738,7 @@ cell_draw_marker_info(int m, int n, int w, int h) if (uistat.marker_delta && mk != active_marker) { freq -= frequencies[markers[active_marker].index]; - frequency_string_short(buf, sizeof buf, freq, '\004'); + frequency_string_short(buf, sizeof buf, freq, C_DELTA); } else { @@ -1768,7 +1768,7 @@ cell_draw_marker_info(int m, int n, int w, int h) xpos -= m * CELLWIDTH - CELLOFFSETX; ypos -= n * CELLHEIGHT; - chsnprintf(buf, sizeof buf, "%s%d:", S_DIAMOND, previous_marker+1); // fixme: character #4? + chsnprintf(buf, sizeof buf, "%c%d:", C_DELTA, previous_marker+1); strwidthpx = cell_drawstring_8x8(w, h, buf, xpos, ypos, 0xffff, FALSE); xpos += strwidthpx + 4; From d5deb0d377d3340a16b3d4877020da79c3b2c48d Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Tue, 10 Dec 2019 15:18:34 +0100 Subject: [PATCH 41/42] compressed version info --- ui.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui.c b/ui.c index 55ba9ad2..a14a6666 100644 --- a/ui.c +++ b/ui.c @@ -400,8 +400,10 @@ show_version(void) ili9341_drawstring_size(BOARD_NAME, x, y += 25, 0xffff, 0x0000, 4); y += 25; - ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555, DL9CAT under GPL", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("(c) @edy555, DL9CAT under GPL. V " VERSION, x, y += 10, 0xffff, 0x0000); + /* fixme: we are out of flash! + ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555 under GPL", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Variant with lager fonts by DL9CAT. =^..^=", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Licensed under GPL.", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var(" see: https://github.com/reald/NanoVNA", x, y += 10, 0xffff, 0x0000); From 417fde01196b31f1d9b4a1ddf534abb51f56ae18 Mon Sep 17 00:00:00 2001 From: "Dennis Real (DL9CAT)" Date: Tue, 10 Dec 2019 16:19:29 +0100 Subject: [PATCH 42/42] feat: removed one config save space to gain more program flash --- STM32F072xB.ld | 4 ++-- flash.c | 16 ++++++++++++++-- ili9341.c | 2 +- nanovna.h | 4 ++-- ui.c | 11 ++++++----- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/STM32F072xB.ld b/STM32F072xB.ld index 577e87fc..72765bb5 100644 --- a/STM32F072xB.ld +++ b/STM32F072xB.ld @@ -19,14 +19,14 @@ */ MEMORY { - flash0 : org = 0x08000000, len = 96k + flash0 : org = 0x08000000, len = 102k flash1 : org = 0x00000000, len = 0 flash2 : org = 0x00000000, len = 0 flash3 : org = 0x00000000, len = 0 flash4 : org = 0x00000000, len = 0 flash5 : org = 0x00000000, len = 0 flash6 : org = 0x00000000, len = 0 - flash7 : org = 0x08018000, len = 32k + flash7 : org = 0x08019800, len = 26k ram0 : org = 0x20000000, len = 16k ram1 : org = 0x00000000, len = 0 ram2 : org = 0x00000000, len = 0 diff --git a/flash.c b/flash.c index 52ea3bce..8006c339 100644 --- a/flash.c +++ b/flash.c @@ -79,7 +79,11 @@ checksum(const void *start, size_t len) #define FLASH_PAGESIZE 0x800 +#if SAVEAREA_MAX==5 const uint32_t save_config_area = 0x08018000; +#else +const uint32_t save_config_area = 0x08019800; +#endif int config_save(void) @@ -122,10 +126,14 @@ config_recall(void) return 0; } -#define SAVEAREA_MAX 5 + const uint32_t saveareas[] = - { 0x08018800, 0x0801a000, 0x0801b800, 0x0801d000, 0x0801e800 }; +{ +#if SAVEAREA_MAX==5 + 0x08018800, +#endif + 0x0801a000, 0x0801b800, 0x0801d000, 0x0801e800 }; int16_t lastsaveid = 0; @@ -210,7 +218,11 @@ caldata_ref(int id) return src; } +#if SAVEAREA_MAX==5 const uint32_t save_config_prop_area_size = 0x8000; +#else +const uint32_t save_config_prop_area_size = 0x6800; +#endif void clear_all_config_prop_data(void) diff --git a/ili9341.c b/ili9341.c index 329b55f1..97f41963 100644 --- a/ili9341.c +++ b/ili9341.c @@ -343,7 +343,7 @@ ili9341_drawchar(uint8_t ch, int x, int y, const uint16_t fg, const uint16_t bg, uint16_t charwidthpx = 8 * size; uint16_t cline; - uint32_t ccol; + uint32_t ccol; /* 32bit datatype saves flash?!? */ uint8_t bits; ch = x8x8_map_char_table(ch); diff --git a/nanovna.h b/nanovna.h index e87876ff..431dd68b 100644 --- a/nanovna.h +++ b/nanovna.h @@ -298,7 +298,7 @@ void ili9341_read_memory_continue(int len, uint16_t* out); /* * flash.c */ -#define SAVEAREA_MAX 5 +#define SAVEAREA_MAX 4 typedef struct { int32_t magic; @@ -320,7 +320,7 @@ typedef struct { int32_t checksum; } properties_t; -#define CONFIG_MAGIC 0x434f4e45 /* 'CONF' */ +#define CONFIG_MAGIC 0x434f4e46 /* 'CONF' */ extern int16_t lastsaveid; extern properties_t *active_props; diff --git a/ui.c b/ui.c index a14a6666..4a659e89 100644 --- a/ui.c +++ b/ui.c @@ -400,10 +400,7 @@ show_version(void) ili9341_drawstring_size(BOARD_NAME, x, y += 25, 0xffff, 0x0000, 4); y += 25; - ili9341_drawstring_8x8_var("(c) @edy555, DL9CAT under GPL. V " VERSION, x, y += 10, 0xffff, 0x0000); - - /* fixme: we are out of flash! - ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555 under GPL", x, y += 10, 0xffff, 0x0000); + ili9341_drawstring_8x8_var("2016-2019 Copyright @edy555", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Variant with lager fonts by DL9CAT. =^..^=", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var("Licensed under GPL.", x, y += 10, 0xffff, 0x0000); ili9341_drawstring_8x8_var(" see: https://github.com/reald/NanoVNA", x, y += 10, 0xffff, 0x0000); @@ -416,7 +413,7 @@ show_version(void) ili9341_drawstring_8x8_var("Port Info: " PORT_INFO, x, y += 10, 0xffff, 0x0000); y += 5; ili9341_drawstring_8x8_var("Platform: ", x, y += 10, 0xffff, 0x0000); - ili9341_drawstring_8x8_var(PLATFORM_NAME, x, y += 10, 0xffff, 0x0000); */ + ili9341_drawstring_8x8_var(PLATFORM_NAME, x, y += 10, 0xffff, 0x0000); while (true) { if (touch_check() == EVT_TOUCH_PRESSED) @@ -985,7 +982,9 @@ const menuitem_t menu_save[] = { { MT_CALLBACK, "SAVE 1", menu_save_cb }, { MT_CALLBACK, "SAVE 2", menu_save_cb }, { MT_CALLBACK, "SAVE 3", menu_save_cb }, +#if SAVEAREA_MAX == 5 { MT_CALLBACK, "SAVE 4", menu_save_cb }, +#endif { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel }; @@ -1144,7 +1143,9 @@ const menuitem_t menu_recall[] = { { MT_CALLBACK, "RECALL1", menu_recall_cb }, { MT_CALLBACK, "RECALL2", menu_recall_cb }, { MT_CALLBACK, "RECALL3", menu_recall_cb }, +#if SAVEAREA_MAX == 5 { MT_CALLBACK, "RECALL4", menu_recall_cb }, +#endif { MT_CANCEL, S_LARROW" BACK", NULL }, { MT_NONE, NULL, NULL } // sentinel };