|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.