|
|
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"
1.1.1.4 root 12: #include "wxuimessage.h"
1.1 root 13: #include "lcd.h"
1.1.1.9 root 14: #include "monitor.h"
1.1 root 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.10 root 38: SetName("LCDPanel");
39:
1.1.1.7 root 40: u_width = 5 * 16 + 17;
41: u_height = 8 * 2 + 3;
42:
43: lcd = GetLCDDevice();
44: ddram = lcd->GetDDRAM();
1.1 root 45:
1.1.1.4 root 46: // VM からの通知を受け取る
47: WXUIMessage::Connect(UIMessage::LCD, this,
48: wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1.1.5 root 49:
1.1.1.7 root 50: FontChanged();
1.1.1.5 root 51: SetBitmapBGColor(UD_CREAM);
1.1.1.7 root 52: Fill();
1.1 root 53: }
54:
55: // デストラクタ
56: WXLCDPanel::~WXLCDPanel()
57: {
1.1.1.7 root 58: WXUIMessage::Disconnect(UIMessage::LCD, this,
1.1.1.4 root 59: wxCommandEventHandler(WXLCDPanel::OnLCDChanged));
1.1 root 60: }
61:
1.1.1.7 root 62: // フォントサイズ変更通知
63: void
64: WXLCDPanel::FontChanged()
65: {
66: inherited::FontChanged();
67:
68: // このパネル内の描画の基本単位。
69: // 12, 16, 24 を 2, 3, 4 にする。
70: unit = (font_height + 5) / 6;
71: wxSize size(u_width * unit, u_height * unit);
1.1.1.10 root 72:
73: // バックバッファのサイズを固定。
74: SetMinBitmapSize(size);
75:
76: // コントロールの大きさを変更。
77: SetSize(size);
78: SetMinSize(size);
1.1.1.7 root 79: }
80:
1.1.1.4 root 81: // LCD 状態変更イベント (UIMessage)
1.1 root 82: void
1.1.1.4 root 83: WXLCDPanel::OnLCDChanged(wxCommandEvent& event)
1.1 root 84: {
1.1.1.4 root 85: Refresh();
1.1 root 86: }
87:
88: // バックグラウンドバッファに描画
89: void
1.1.1.5 root 90: WXLCDPanel::Draw()
1.1 root 91: {
92: for (int y = 0; y < 2; y++) {
93: for (int x = 0; x < 16; x++) {
94: uint8 ch = ddram[0x40 * y + x];
1.1.1.5 root 95: DrawChar(x, y, ch);
1.1 root 96: }
97: }
98: }
99:
100: // 1文字描画
101: void
1.1.1.5 root 102: WXLCDPanel::DrawChar(int x, int y, uint8 ch)
1.1 root 103: {
1.1.1.5 root 104: const Color pal[2] = { UD_YELLOW_GREEN, UD_BROWN };
1.1 root 105: const uint8 *font;
106:
1.1.1.7 root 107: font = lcd->GetFont(ch);
1.1.1.5 root 108: BitmapI1 src(font, 5, 8);
1.1 root 109:
1.1.1.8 root 110: int dx = (1 + x * 6) * unit;
111: int dy = (1 + y * 9) * unit;
112: bitmap.DrawBitmapI1Scale(dx, dy, src, pal, unit);
1.1 root 113: }
114:
1.1.1.5 root 115:
1.1 root 116: //
1.1.1.7 root 117: // LUNA 前面 LCD ウィンドウ
1.1 root 118: //
119:
120: // コンストラクタ
1.1.1.3 root 121: WXLCDWindow::WXLCDWindow(wxWindow *parent)
122: : inherited(parent, wxID_ANY, _("Front LCD"))
1.1 root 123: {
1.1.1.10 root 124: new WXLCDPanel(this);
125: Fit();
1.1 root 126: }
127:
128: // デストラクタ
129: WXLCDWindow::~WXLCDWindow()
130: {
131: }
132:
1.1.1.5 root 133:
1.1 root 134: //
1.1.1.7 root 135: // モニタの LCD キャラクタ部パネル
1.1 root 136: //
137:
1.1.1.7 root 138: // BitmapPanel の継承で十分だが FontChanged() に連動させるため、
139: // TextPanel からの継承としている。
140: //
141: // 全体図。横16文字 + 横16文字の2段組。
142: // □ は1キャラクタ分。5x8ピクセル。
143: // _ は1ピクセル分のアキ。
144: //
145: // 余白
146: // +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f +0 +1 +f
147: // 横 _□_□_□_□_□_□_□_□_□_□_□_□_□_□_□_□□□_□ … □_
148: //
149: // 00 10 20 30 40 50 60 70
150: // 縦 _□_□_□_□_□_□_□_□_
1.1 root 151:
152: // コンストラクタ
153: WXLCDCharPanel::WXLCDCharPanel(wxWindow *parent)
1.1.1.7 root 154: : inherited(parent)
1.1 root 155: {
1.1.1.10 root 156: SetName("LCDCharPanel");
157:
1.1.1.7 root 158: lcd = GetLCDDevice();
159:
160: u_width = 5 * 33 + 32; // 横 5px * (32+1)文字、余白が計 32
161: u_height = 8 * 8 + 9; // 縦 8px * 8行、余白が計 9
162:
163: FontChanged();
1.1 root 164: }
165:
166: // デストラクタ
167: WXLCDCharPanel::~WXLCDCharPanel()
168: {
169: }
170:
1.1.1.7 root 171: // フォントサイズ変更通知
172: void
173: WXLCDCharPanel::FontChanged()
174: {
175: inherited::FontChanged();
176:
177: // このパネル内の描画の基本単位。
178: // 12, 16, 24 を 2, 3, 4 にする。
179: unit = (font_height + 5) / 6;
180: wxSize size(u_width * unit, u_height * unit);
1.1.1.10 root 181:
182: // バックバッファのサイズを固定。
183: SetMinBitmapSize(size);
184:
185: // コントロールの大きさを変更。
186: SetSize(size);
187: SetMinSize(size);
1.1.1.7 root 188: }
189:
1.1 root 190: // バックグラウンドバッファに描画
191: void
1.1.1.5 root 192: WXLCDCharPanel::Draw()
1.1 root 193: {
1.1.1.5 root 194: const Color pal[2] = { UD_WHITE, UD_BLACK };
1.1 root 195:
196: // フォントは 5x8 (最下行はカーソル用に空けてあるので実際は 5x7)。
197: // 実際には 0xe0 以降には 5x10 フォントが混在しているのだが、その
198: // モードはサポートしていないので今の所全部 5x8 としてある。
199:
1.1.1.2 root 200: // cx, cy はこの文字の左上座標 (スケール前)
1.1.1.7 root 201: int cx = 1;
202: int cy = 1;
1.1.1.2 root 203: for (int ch = 0; ch < 256; ch++) {
1.1.1.7 root 204: const uint8 *font = lcd->GetFont(ch);
1.1.1.5 root 205: BitmapI1 src(font, 5, 8);
1.1.1.8 root 206: bitmap.DrawBitmapI1Scale(cx * unit, cy * unit, src, pal, unit);
1.1.1.2 root 207:
208: cx += 6;
209: if (ch % 16 == 15) {
210: if (ch == 127) {
1.1.1.7 root 211: // 0x80 以降は右側に作る。
212: // 余白も含めた 6px ずつ加算してきたが中間のアキは計 5px
213: // なので、過剰分の 1 引く必要がある。
214: cx += 5 - 1;
1.1.1.2 root 215: cy = 1;
1.1.1.7 root 216: } else {
217: // 行折り返し
218: cx -= 6 * 16;
219: cy += 9;
1.1.1.2 root 220: }
221: }
1.1 root 222: }
223: }
224:
1.1.1.5 root 225:
1.1 root 226: //
227: // LCD モニタウィンドウ
228: //
229:
230: // コンストラクタ
1.1.1.3 root 231: WXLCDMonitor::WXLCDMonitor(wxWindow *parent)
1.1.1.7 root 232: : inherited(parent, wxID_ANY, "LCD (HD44780)")
1.1 root 233: {
1.1.1.5 root 234: // +------------+
235: // | TextScreen |
236: // +------------+
237: // | CharPanel |
238: // +------------+
239:
240: // 上段、テキストスクリーン
1.1.1.6 root 241: monpanel = new WXMonitorPanel(this, gMonitorManager->Get(ID_MONITOR_LCD));
1.1.1.5 root 242: // 下辺は CharPanel の上余白が隣接しているため、自分のほうは付けない。
243: monpanel->SetPadding(-1, -1, -1, 0);
1.1 root 244:
1.1.1.5 root 245: // 下段、キャラクタパネル
1.1 root 246: chrpanel = new WXLCDCharPanel(this);
247:
1.1.1.10 root 248: // 空き地用。
249: space = new WXBitmapPanel(this);
1.1 root 250:
1.1.1.10 root 251: SetAutoLayout(true);
252: FontChanged();
1.1 root 253: }
254:
255: // デストラクタ
256: WXLCDMonitor::~WXLCDMonitor()
257: {
258: }
1.1.1.10 root 259:
260: void
261: WXLCDMonitor::FontChanged()
262: {
263: monpanel->FontChanged();
264: chrpanel->FontChanged();
265:
266: const wxSize& monsize = monpanel->GetSize();
267: const wxSize& chrsize = chrpanel->GetSize();
268: wxSize size(std::max(monsize.x, chrsize.x), monsize.y + chrsize.y);
269: SetClientSize(size);
270: }
271:
272: bool
273: WXLCDMonitor::Layout()
274: {
275: // inherited::Layout() は(実質何もしないので)、呼ばずに自力で行う。
276:
277: wxSize client = GetClientSize();
278: const wxSize& monsize = monpanel->GetSize();
279: const wxSize& chrsize = chrpanel->GetSize();
280:
281: // コントロールを配置。
282: monpanel->SetSize(0, 0, monsize.x, monsize.y);
283: chrpanel->SetSize(0, monsize.y, chrsize.x, chrsize.y);
284:
285: // monpanel と chrpanel はフォントサイズによる拡大倍率が違うため
286: // フォントサイズを変更した時に相似にならず、現状では必ずどちらかが
287: // 大きい (がどちらかは固定されない) という状態になる。
288: // そこで小さい方のコントロールの右に空き地が出来てしまう。そのままだと
289: // GTK3 のウィンドウ下地色が見えてしまうため、BGPANEL 色のパネルを敷く。
290:
291: if (monsize.x < chrsize.x) {
292: // 上が小さいので、右上に空き地を置く。
293: space->SetSize(monsize.x, 0, client.x - monsize.x, monsize.y);
294: } else {
295: // 下が小さいので、左下に空き地を置く。
296: space->SetSize(chrsize.x, monsize.y, client.x - chrsize.x, chrsize.y);
297: }
298:
299: return true;
300: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.