Annotation of nono/wx/wxlcdwindow.cpp, revision 1.1.1.9

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
1.1.1.7   root        8: // LUNA LCD パネル、モニタ
1.1       root        9: //
                     10: 
                     11: #include "wxlcdwindow.h"
                     12: #include "wxcolor.h"
1.1.1.4   root       13: #include "wxuimessage.h"
1.1       root       14: #include "lcd.h"
1.1.1.9 ! root       15: #include "monitor.h"
1.1       root       16: 
1.1.1.7   root       17: //
                     18: // LUNA 前面 LCD パネル
                     19: //
1.1       root       20: 
1.1.1.7   root       21: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
                     22: // TextPanel からの継承としている。
                     23: //
                     24: // 全体図。横16文字 x 縦2行
                     25: // □ は1キャラクタ分。5x8ピクセル。
                     26: // _  は1ピクセル分のアキ。
1.1       root       27: //
1.1.1.7   root       28: //     +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
                     29: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_
                     30: //    _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_
1.1       root       31: //
1.1.1.7   root       32: //      1  2
                     33: // 縦 _□_□_
1.1       root       34: 
                     35: // コンストラクタ
                     36: WXLCDPanel::WXLCDPanel(wxWindow *parent)
1.1.1.7   root       37:        : inherited(parent)
1.1       root       38: {
1.1.1.7   root       39:        u_width  = 5 * 16 + 17;
                     40:        u_height = 8 * 2 + 3;
                     41: 
                     42:        lcd = GetLCDDevice();
                     43:        ddram = lcd->GetDDRAM();
1.1       root       44: 
1.1.1.4   root       45:        // VM からの通知を受け取る
                     46:        WXUIMessage::Connect(UIMessage::LCD, this,
                     47:                wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1.1.5   root       48: 
1.1.1.7   root       49:        FontChanged();
1.1.1.5   root       50:        SetBitmapBGColor(UD_CREAM);
1.1.1.7   root       51:        Fill();
1.1       root       52: }
                     53: 
                     54: // デストラクタ
                     55: WXLCDPanel::~WXLCDPanel()
                     56: {
1.1.1.7   root       57:        WXUIMessage::Disconnect(UIMessage::LCD, this,
1.1.1.4   root       58:                wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1       root       59: }
                     60: 
1.1.1.7   root       61: // フォントサイズ変更通知
                     62: void
                     63: WXLCDPanel::FontChanged()
                     64: {
                     65:        inherited::FontChanged();
                     66: 
                     67:        // このパネル内の描画の基本単位。
                     68:        // 12, 16, 24 を 2, 3, 4 にする。
                     69:        unit = (font_height + 5) / 6;
                     70: 
                     71:        // コントロールの大きさを変更
                     72:        wxSize size(u_width * unit, u_height * unit);
                     73:        SetClientSize(size);
                     74:        SetMinClientSize(size);
                     75: }
                     76: 
1.1.1.4   root       77: // LCD 状態変更イベント (UIMessage)
1.1       root       78: void
1.1.1.4   root       79: WXLCDPanel::OnLCDChanged(wxCommandEvent& event)
1.1       root       80: {
1.1.1.4   root       81:        Refresh();
1.1       root       82: }
                     83: 
                     84: // バックグラウンドバッファに描画
                     85: void
1.1.1.5   root       86: WXLCDPanel::Draw()
1.1       root       87: {
                     88:        for (int y = 0; y < 2; y++) {
                     89:                for (int x = 0; x < 16; x++) {
                     90:                        uint8 ch = ddram[0x40 * y + x];
1.1.1.5   root       91:                        DrawChar(x, y, ch);
1.1       root       92:                }
                     93:        }
                     94: }
                     95: 
                     96: // 1文字描画
                     97: void
1.1.1.5   root       98: WXLCDPanel::DrawChar(int x, int y, uint8 ch)
1.1       root       99: {
1.1.1.5   root      100:        const Color pal[2] = { UD_YELLOW_GREEN, UD_BROWN };
1.1       root      101:        const uint8 *font;
                    102: 
1.1.1.7   root      103:        font = lcd->GetFont(ch);
1.1.1.5   root      104:        BitmapI1 src(font, 5, 8);
1.1       root      105: 
1.1.1.8   root      106:        int dx = (1 + x * 6) * unit;
                    107:        int dy = (1 + y * 9) * unit;
                    108:        bitmap.DrawBitmapI1Scale(dx, dy, src, pal, unit);
1.1       root      109: }
                    110: 
1.1.1.5   root      111: 
1.1       root      112: //
1.1.1.7   root      113: // LUNA 前面 LCD ウィンドウ
1.1       root      114: //
                    115: 
                    116: // コンストラクタ
1.1.1.3   root      117: WXLCDWindow::WXLCDWindow(wxWindow *parent)
                    118:        : inherited(parent, wxID_ANY, _("Front LCD"))
1.1       root      119: {
                    120:        panel = new WXLCDPanel(this);
                    121: 
1.1.1.5   root      122:        DoSize();
1.1       root      123: }
                    124: 
                    125: // デストラクタ
                    126: WXLCDWindow::~WXLCDWindow()
                    127: {
                    128: }
                    129: 
1.1.1.5   root      130: 
1.1       root      131: //
1.1.1.7   root      132: // モニタの LCD キャラクタ部パネル
1.1       root      133: //
                    134: 
1.1.1.7   root      135: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
                    136: // TextPanel からの継承としている。
                    137: //
                    138: // 全体図。横16文字 + 横16文字の2段組。
                    139: // □ は1キャラクタ分。5x8ピクセル。
                    140: // _  は1ピクセル分のアキ。
                    141: //
                    142: //                                                   余白
                    143: //     +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f  +0 +1    +f
                    144: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□□□_□ … □_
                    145: //
                    146: //     00 10 20 30 40 50 60 70
                    147: // 縦 _□_□_□_□_□_□_□_□_
1.1       root      148: 
                    149: // コンストラクタ
                    150: WXLCDCharPanel::WXLCDCharPanel(wxWindow *parent)
1.1.1.7   root      151:        : inherited(parent)
1.1       root      152: {
1.1.1.7   root      153:        lcd = GetLCDDevice();
                    154: 
                    155:        u_width  = 5 * 33 + 32; // 横 5px * (32+1)文字、余白が計 32
                    156:        u_height = 8 * 8 + 9;   // 縦 8px * 8行、余白が計 9
                    157: 
                    158:        FontChanged();
1.1       root      159: }
                    160: 
                    161: // デストラクタ
                    162: WXLCDCharPanel::~WXLCDCharPanel()
                    163: {
                    164: }
                    165: 
1.1.1.7   root      166: // フォントサイズ変更通知
                    167: void
                    168: WXLCDCharPanel::FontChanged()
                    169: {
                    170:        inherited::FontChanged();
                    171: 
                    172:        // このパネル内の描画の基本単位。
                    173:        // 12, 16, 24 を 2, 3, 4 にする。
                    174:        unit = (font_height + 5) / 6;
                    175: 
                    176:        // コントロールの大きさを変更
                    177:        wxSize size(u_width * unit, u_height * unit);
                    178:        SetClientSize(size);
                    179:        SetMinClientSize(size);
                    180: }
                    181: 
1.1       root      182: // バックグラウンドバッファに描画
                    183: void
1.1.1.5   root      184: WXLCDCharPanel::Draw()
1.1       root      185: {
1.1.1.5   root      186:        const Color pal[2] = { UD_WHITE, UD_BLACK };
1.1       root      187: 
                    188:        // フォントは 5x8 (最下行はカーソル用に空けてあるので実際は 5x7)。
                    189:        // 実際には 0xe0 以降には 5x10 フォントが混在しているのだが、その
                    190:        // モードはサポートしていないので今の所全部 5x8 としてある。
                    191: 
1.1.1.2   root      192:        // cx, cy はこの文字の左上座標 (スケール前)
1.1.1.7   root      193:        int cx = 1;
                    194:        int cy = 1;
1.1.1.2   root      195:        for (int ch = 0; ch < 256; ch++) {
1.1.1.7   root      196:                const uint8 *font = lcd->GetFont(ch);
1.1.1.5   root      197:                BitmapI1 src(font, 5, 8);
1.1.1.8   root      198:                bitmap.DrawBitmapI1Scale(cx * unit, cy * unit, src, pal, unit);
1.1.1.2   root      199: 
                    200:                cx += 6;
                    201:                if (ch % 16 == 15) {
                    202:                        if (ch == 127) {
1.1.1.7   root      203:                                // 0x80 以降は右側に作る。
                    204:                                // 余白も含めた 6px ずつ加算してきたが中間のアキは計 5px
                    205:                                // なので、過剰分の 1 引く必要がある。
                    206:                                cx += 5 - 1;
1.1.1.2   root      207:                                cy = 1;
1.1.1.7   root      208:                        } else {
                    209:                                // 行折り返し
                    210:                                cx -= 6 * 16;
                    211:                                cy += 9;
1.1.1.2   root      212:                        }
                    213:                }
1.1       root      214:        }
                    215: }
                    216: 
1.1.1.5   root      217: 
1.1       root      218: //
                    219: // LCD モニタウィンドウ
                    220: //
                    221: 
                    222: // コンストラクタ
1.1.1.3   root      223: WXLCDMonitor::WXLCDMonitor(wxWindow *parent)
1.1.1.7   root      224:        : inherited(parent, wxID_ANY, "LCD (HD44780)")
1.1       root      225: {
1.1.1.5   root      226:        // +------------+
                    227:        // | TextScreen |
                    228:        // +------------+
                    229:        // | CharPanel  |
                    230:        // +------------+
                    231:        auto *topsizer = new wxBoxSizer(wxVERTICAL);
                    232: 
                    233:        // 上段、テキストスクリーン
1.1.1.6   root      234:        monpanel = new WXMonitorPanel(this, gMonitorManager->Get(ID_MONITOR_LCD));
1.1.1.5   root      235:        // 下辺は CharPanel の上余白が隣接しているため、自分のほうは付けない。
                    236:        monpanel->SetPadding(-1, -1, -1, 0);
                    237:        topsizer->Add(monpanel, 0, wxEXPAND);
1.1       root      238: 
1.1.1.5   root      239:        // 下段、キャラクタパネル
1.1       root      240:        chrpanel = new WXLCDCharPanel(this);
1.1.1.5   root      241:        topsizer->Add(chrpanel, 0, wxEXPAND);
1.1       root      242: 
                    243:        SetSizer(topsizer);
                    244: 
                    245:        // 大きさをそれに固定
1.1.1.5   root      246:        SetClientSize(GetSizer()->GetMinSize());
1.1       root      247: }
                    248: 
                    249: // デストラクタ
                    250: WXLCDMonitor::~WXLCDMonitor()
                    251: {
                    252: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.