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