• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

UART通信を用いた組み込みデバッグ用途向けメモリモニタ


Commit MetaInfo

Revision5c07f033ac3fc92e04cbec32b6acd0fc8334bf0b (tree)
Time2018-05-14 22:32:54
AuthorYasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

YMODEM送信確認

Change Summary

Incremental Difference

--- a/DebugMonitor/DebugMonitor.vcxproj
+++ b/DebugMonitor/DebugMonitor.vcxproj
@@ -63,7 +63,7 @@
6363 </ItemDefinitionGroup>
6464 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
6565 <ClCompile>
66- <WarningLevel>Level3</WarningLevel>
66+ <WarningLevel>Level4</WarningLevel>
6767 <PrecompiledHeader>
6868 </PrecompiledHeader>
6969 <Optimization>MaxSpeed</Optimization>
@@ -71,12 +71,15 @@
7171 <IntrinsicFunctions>true</IntrinsicFunctions>
7272 <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
7373 <SDLCheck>true</SDLCheck>
74+ <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
75+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
7476 </ClCompile>
7577 <Link>
7678 <SubSystem>Windows</SubSystem>
7779 <GenerateDebugInformation>true</GenerateDebugInformation>
7880 <EnableCOMDATFolding>true</EnableCOMDATFolding>
7981 <OptimizeReferences>true</OptimizeReferences>
82+ <AdditionalDependencies>imm32.lib;winmm.lib;setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
8083 </Link>
8184 </ItemDefinitionGroup>
8285 <ItemGroup>
--- a/DebugMonitor/src/app/app.c
+++ b/DebugMonitor/src/app/app.c
@@ -9,6 +9,7 @@
99 #include "winmain.h"
1010 #include "logwin.h"
1111 #include "comm.h"
12+#include "ymodem.h"
1213 #include "app.h"
1314
1415 /*
@@ -17,12 +18,51 @@
1718 */
1819 void app_run(void)
1920 {
20- UINT count;
21+ UINT portnum;
22+ BYTE buf[240];
23+ UINT loop;
24+ BOOL result;
2125
22- count = 0;
23-
24- while (TRUE == do_events(1000))
26+ portnum = 0;
27+ while (0 == portnum)
2528 {
29+ if (FALSE == do_events(10))
30+ {
31+ return;
32+ }
2633 comm_enum();
34+ portnum = comm_get_portnum();
35+ }
36+
37+ if (2 != portnum)
38+ {
39+ return;
40+ }
41+
42+ /* ポート指定 */
43+ ymodem_init(0);
44+
45+ /* データ作成 */
46+ for (loop = 0; loop < sizeof(buf); loop++)
47+ {
48+ buf[loop] = (BYTE)loop;
49+ }
50+
51+ /* ファイルバッファへ転送 */
52+ memcpy(ymodem_get_filebuf(), buf, sizeof(buf));
53+
54+ /* ファイル送信 */
55+ result = ymodem_send("test.bin", sizeof(buf));
56+ if (FALSE == result)
57+ {
58+ return;
59+ }
60+
61+ while (YMODEM_BUSY == ymodem_get_status())
62+ {
63+ if (FALSE == do_events(10))
64+ {
65+ return;
66+ }
2767 }
2868 }
--- a/DebugMonitor/src/comm/comm.c
+++ b/DebugMonitor/src/comm/comm.c
@@ -835,7 +835,7 @@ UINT comm_get_bytes(UINT index)
835835 * 通信ポート
836836 * 受信
837837 */
838-UINT comm_recv(UINT index, LPBYTE buf, UINT buflen)
838+UINT comm_recv(UINT index, BYTE *buf, UINT buflen)
839839 {
840840 COMM_PORT *port;
841841 UINT inque;
@@ -884,7 +884,7 @@ UINT comm_recv(UINT index, LPBYTE buf, UINT buflen)
884884 * 通信ポート
885885 * 送信
886886 */
887-UINT comm_send(UINT index, LPBYTE buf, UINT buflen)
887+UINT comm_send(UINT index, const BYTE *buf, UINT buflen)
888888 {
889889 COMM_PORT *port;
890890 DWORD written;
--- a/DebugMonitor/src/comm/comm.h
+++ b/DebugMonitor/src/comm/comm.h
@@ -59,7 +59,7 @@ void comm_close(UINT index);
5959 UINT comm_get_bytes(UINT index);
6060
6161 /* 受信 */
62-UINT comm_recv(UINT index, LPBYTE buf, UINT buflen);
62+UINT comm_recv(UINT index, BYTE *buf, UINT buflen);
6363
6464 /* 送信 */
65-UINT comm_send(UINT index, LPBYTE buf, UINT buflen);
65+UINT comm_send(UINT index, const BYTE *buf, UINT buflen);
--- a/DebugMonitor/src/comm/ymodem.c
+++ b/DebugMonitor/src/comm/ymodem.c
@@ -6,11 +6,22 @@
66 */
77
88 #include "header.h"
9+#include "monitor.h"
910 #include "logwin.h"
1011 #include "comm.h"
1112 #include "ymodem.h"
1213
1314 /*
15+ * モニタ情報
16+ */
17+
18+/* モニタ開始位置(X) */
19+#define YMODEM_MONITOR_X 0
20+
21+/* モニタ開始位置(Y) */
22+#define YMODEM_MONITOR_Y 1
23+
24+/*
1425 * YMODEM定数
1526 */
1627
@@ -40,7 +51,7 @@
4051 */
4152
4253 /* 送信タイムアウト */
43-#define YMODEM_SEND_TIMEOUT 100
54+#define YMODEM_SEND_TIMEOUT 1000
4455
4556 /* 送信リトライ回数 */
4657 #define YMODEM_SEND_RETRY 40
@@ -406,22 +417,23 @@ static void ymodem_discard_recv(YMODEM_OBJECT *object)
406417
407418 assert(NULL != object);
408419
409- /* 無限ループ */
410- for (;;)
420+ /* 受信バイト数の取得 */
421+ bytes = comm_get_bytes(object->comm_index);
422+
423+ /* bytesが0以上である限りループ */
424+ while (0 < bytes)
411425 {
412- /* 受信バイト数の取得 */
413- bytes = comm_get_bytes(object->comm_index);
414- if (0 != bytes)
426+ /* 1バイト以上の受信バイト数があるので、1バイトだけ読み取る */
427+ result = comm_recv(object->comm_index, &buf, sizeof(buf));
428+ if (0 == result)
415429 {
416- /* 1バイト以上の受信バイト数があるので、1バイトだけ読み取る */
417- result = comm_recv(object->comm_index, &buf, sizeof(buf));
418- if (0 == result)
419- {
420- /* 読み取りに失敗した */
421- ymodem_error_closed(object);
422- break;
423- }
430+ /* 読み取りに失敗した */
431+ ymodem_error_closed(object);
432+ break;
424433 }
434+
435+ /* 受信バイト数の取得 */
436+ bytes = comm_get_bytes(object->comm_index);
425437 }
426438 }
427439
@@ -437,10 +449,12 @@ static BOOL ymodem_check_timeout(YMODEM_OBJECT *object, DWORD timeout)
437449
438450 /* 差分時間を得る */
439451 diff = (DWORD)(timeGetTime() - object->start_time);
440-
441452 /* 差分時間がパラメータ以上であればタイムアウト */
442453 if (diff >= timeout)
443454 {
455+ /* 開始時間を増やす */
456+ object->start_time += timeout;
457+
444458 /* タイムアウト回数++ */
445459 object->timeout_cnt++;
446460
@@ -800,6 +814,7 @@ static void ymodem_sendinfo_do(YMODEM_OBJECT *object)
800814 */
801815 static void ymodem_sendinfo_exit(YMODEM_OBJECT *object)
802816 {
817+ UNREFERENCED_PARAMETER(object);
803818 }
804819
805820 /*
@@ -864,6 +879,7 @@ static void ymodem_infoack_do(YMODEM_OBJECT *object)
864879 */
865880 static void ymodem_infoack_exit(YMODEM_OBJECT *object)
866881 {
882+ UNREFERENCED_PARAMETER(object);
867883 }
868884
869885 /*
@@ -897,7 +913,14 @@ static void ymodem_waitc2_do(YMODEM_OBJECT *object)
897913 /* 'C'であれば状態遷移 */
898914 if (YMODEM_C == buf)
899915 {
900- ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
916+ if (0 < object->file_size)
917+ {
918+ ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
919+ }
920+ else
921+ {
922+ ymodem_object_trans(object, YMODEM_TRANS_SENDEOT);
923+ }
901924 }
902925 }
903926
@@ -935,15 +958,15 @@ static void ymodem_senddata_enter(YMODEM_OBJECT *object)
935958 memset(object->block_buf, 0, sizeof(object->block_buf));
936959
937960 /* コピーする長さを算出(最大0x80) */
938- assert(object->block_offset < object->file_size);
939- len = object->file_size - object->block_offset;
961+ assert(object->buf_offset < object->file_size);
962+ len = object->file_size - object->buf_offset;
940963 if (0x80 < len)
941964 {
942965 len = 0x80;
943966 }
944967
945968 /* ブロックオフセットからデータをコピー */
946- memcpy(&object->block_buf[3], &object->file_buf[object->block_offset], len);
969+ memcpy(&object->block_buf[3], &object->file_buf[object->buf_offset], len);
947970
948971 /* ブロック送信開始 */
949972 ymodem_block_sendstart(object);
@@ -978,6 +1001,7 @@ static void ymodem_senddata_do(YMODEM_OBJECT *object)
9781001 */
9791002 static void ymodem_senddata_exit(YMODEM_OBJECT *object)
9801003 {
1004+ UNREFERENCED_PARAMETER(object);
9811005 }
9821006
9831007 /*
@@ -1013,7 +1037,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10131037 /* ACK */
10141038 case YMODEM_ACK:
10151039 /* ACKは次のブロックまたはEOT送信 */
1016- if ((object->block_offset + 0x80) <= object->file_size)
1040+ if ((object->buf_offset + 0x80) >= object->file_size)
10171041 {
10181042 /* リトライ回数を初期化 */
10191043 object->retry = 0;
@@ -1029,8 +1053,8 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10291053 /* ブロック番号を進める */
10301054 object->block_no = (object->block_no + 1) & 0xff;
10311055
1032- /* ブロックオフセットを進める */
1033- object->block_offset += 0x80;
1056+ /* バッファオフセットを進める */
1057+ object->buf_offset += 0x80;
10341058
10351059 /* データブロック送信 */
10361060 ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
@@ -1067,6 +1091,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10671091 */
10681092 static void ymodem_dataack_exit(YMODEM_OBJECT *object)
10691093 {
1094+ UNREFERENCED_PARAMETER(object);
10701095 }
10711096
10721097 /*
@@ -1076,6 +1101,7 @@ static void ymodem_dataack_exit(YMODEM_OBJECT *object)
10761101 */
10771102 static void ymodem_sendeot_enter(YMODEM_OBJECT *object)
10781103 {
1104+ UNREFERENCED_PARAMETER(object);
10791105 }
10801106
10811107 /*
@@ -1112,6 +1138,7 @@ static void ymodem_sendeot_do(YMODEM_OBJECT *object)
11121138 */
11131139 static void ymodem_sendeot_exit(YMODEM_OBJECT *object)
11141140 {
1141+ UNREFERENCED_PARAMETER(object);
11151142 }
11161143
11171144 /*
@@ -1151,6 +1178,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object)
11511178 /* ACKは送信終了 */
11521179 object->sending = FALSE;
11531180 object->status = YMODEM_SUCCESS;
1181+ object->state = YMODEM_TRANS_NONE;
11541182 break;
11551183
11561184 /* NAK */
@@ -1183,6 +1211,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object)
11831211 */
11841212 static void ymodem_eotack_exit(YMODEM_OBJECT *object)
11851213 {
1214+ UNREFERENCED_PARAMETER(object);
11861215 }
11871216
11881217 /*
@@ -1414,6 +1443,160 @@ static BOOL ymodem_object_send(YMODEM_OBJECT *object, const char *filename, UINT
14141443
14151444 /*
14161445 * YMODEM
1446+ * オブジェクトモニタ
1447+ */
1448+static void ymodem_object_monitor(YMODEM_OBJECT *object)
1449+{
1450+ assert(NULL != object);
1451+
1452+ /* 位置とクリア*/
1453+ monitor_locate(YMODEM_MONITOR_X, YMODEM_MONITOR_Y);
1454+ monitor_clear(40, 15);
1455+
1456+ /* タイトル */
1457+ monitor_printf("[YMODEM情報]\n");
1458+
1459+ /* 通信ポート番号 */
1460+ monitor_printf("通信ポート番号 %u\n", object->comm_index);
1461+
1462+ /* 送信中フラグ */
1463+ if (FALSE == object->sending)
1464+ {
1465+ monitor_printf("送信状態 アイドル\n");
1466+ }
1467+ else
1468+ {
1469+ monitor_printf("送信状態 送信中\n");
1470+ }
1471+
1472+ /* 受信中フラグ */
1473+ if (FALSE == object->receiving)
1474+ {
1475+ monitor_printf("受信状態 アイドル\n");
1476+ }
1477+ else
1478+ {
1479+ monitor_printf("受信状態 受信中\n");
1480+ }
1481+
1482+ /* ステータス */
1483+ switch (object->status)
1484+ {
1485+ /* 成功 */
1486+ case YMODEM_SUCCESS:
1487+ monitor_printf("ステータス 成功\n");
1488+ break;
1489+
1490+ /* 動作中 */
1491+ case YMODEM_BUSY:
1492+ monitor_printf("ステータス 動作中\n");
1493+ break;
1494+
1495+ /* バッファサイズ溢れ */
1496+ case YMODEM_SIZEOVER:
1497+ monitor_printf("ステータス バッファサイズ溢れ\n");
1498+ break;
1499+
1500+ /* タイムアウト */
1501+ case YMODEM_TIMEOUT:
1502+ monitor_printf("ステータス タイムアウト\n");
1503+ break;
1504+
1505+ /* リトライオーバー */
1506+ case YMODEM_RETRY:
1507+ monitor_printf("ステータス リトライオーバー\n");
1508+ break;
1509+
1510+ /* キャンセル要求受信 */
1511+ case YMODEM_CANCEL:
1512+ monitor_printf("ステータス キャンセル要求受信\n");
1513+ break;
1514+
1515+ /* ポートクローズ */
1516+ case YMODEM_CLOSED:
1517+ monitor_printf("ステータス ポートクローズ\n");
1518+ break;
1519+ }
1520+
1521+ /* ファイルネーム */
1522+ monitor_printf("ファイルネーム %s\n", object->file_name);
1523+
1524+ /* ファイルサイズ */
1525+ monitor_printf("ファイルサイズ %u\n", object->file_size);
1526+
1527+ /* 内部状態 */
1528+ switch (object->state)
1529+ {
1530+ /* 初期状態 */
1531+ case YMODEM_TRANS_NONE:
1532+ monitor_printf("内部状態 初期状態\n");
1533+ break;
1534+
1535+ /* 受信側の'C'送信待ち(1) */
1536+ case YMODEM_TRANS_WAITC1:
1537+ monitor_printf("内部状態 受信側の'C'送信待ち(1)\n");
1538+ break;
1539+
1540+ /* ファイル情報送信 */
1541+ case YMODEM_TRANS_SENDINFO:
1542+ monitor_printf("内部状態 ファイル情報送信\n");
1543+ break;
1544+
1545+ /* ファイル情報ACK待ち */
1546+ case YMODEM_TRANS_INFOACK:
1547+ monitor_printf("内部状態 ファイル情報ACK待ち\n");
1548+ break;
1549+
1550+ /* 受信側の'C'送信待ち(2) */
1551+ case YMODEM_TRANS_WAITC2:
1552+ monitor_printf("内部状態 受信側の'C'送信待ち(2)\n");
1553+ break;
1554+
1555+ /* データブロック送信 */
1556+ case YMODEM_TRANS_SENDDATA:
1557+ monitor_printf("内部状態 データブロック送信\n");
1558+ break;
1559+
1560+ /* データブロックACK待ち */
1561+ case YMODEM_TRANS_DATAACK:
1562+ monitor_printf("内部状態 データブロックACK待ち\n");
1563+ break;
1564+
1565+ /* EOT送信 */
1566+ case YMODEM_TRANS_SENDEOT:
1567+ monitor_printf("内部状態 EOT送信\n");
1568+ break;
1569+
1570+ /* EOTに対するACK待ち */
1571+ case YMODEM_TRANS_EOTACK:
1572+ monitor_printf("内部状態 EOTに対するACK待ち\n");
1573+ break;
1574+ }
1575+
1576+ /* ブロック番号 */
1577+ monitor_printf("ブロック番号 0x%02X\n", object->block_no);
1578+
1579+ /* バッファオフセット */
1580+ monitor_printf("オフセット 0x%04X\n", object->buf_offset);
1581+
1582+ /* ACK送受信回数 */
1583+ monitor_printf("ACK送受信回数 %u\n", object->ack_cnt);
1584+
1585+ /* NAK送受信回数 */
1586+ monitor_printf("NAK送受信回数 %u\n", object->nak_cnt);
1587+
1588+ /* CAN送受信回数 */
1589+ monitor_printf("CAN送受信回数 %u\n", object->can_cnt);
1590+
1591+ /* タイムアウト回数 */
1592+ monitor_printf("タイムアウト回数 %u\n", object->timeout_cnt);
1593+
1594+ /* リトライ回数 */
1595+ monitor_printf("リトライ回数 %u\n", object->retry_cnt);
1596+}
1597+
1598+/*
1599+ * YMODEM
14171600 * 初期化
14181601 */
14191602 void ymodem_init(UINT comm_index)
@@ -1430,6 +1613,9 @@ void ymodem_idle(void)
14301613 {
14311614 /* オブジェクトアイドル */
14321615 ymodem_object_idle(&g_ymodem_object);
1616+
1617+ /* モニタ */
1618+ ymodem_object_monitor(&g_ymodem_object);
14331619 }
14341620
14351621 /*
@@ -1459,7 +1645,7 @@ BOOL ymodem_recv(void)
14591645 */
14601646 UINT ymodem_get_status(void)
14611647 {
1462- return 0;
1648+ return g_ymodem_object.status;
14631649 }
14641650
14651651 /*
@@ -1477,7 +1663,7 @@ const char* ymodem_get_filename(void)
14771663 */
14781664 UINT ymodem_get_filesize(void)
14791665 {
1480- return 0;
1666+ return g_ymodem_object.file_size;
14811667 }
14821668
14831669 /*
@@ -1486,5 +1672,5 @@ UINT ymodem_get_filesize(void)
14861672 */
14871673 BYTE* ymodem_get_filebuf(void)
14881674 {
1489- return NULL;
1675+ return g_ymodem_object.file_buf;
14901676 }
--- a/DebugMonitor/src/framework/logwin.c
+++ b/DebugMonitor/src/framework/logwin.c
@@ -203,6 +203,16 @@ void logwin_resize(int x, int y, int width, int height)
203203
204204 /*
205205 * Windowsログ
206+ * キー押下
207+ */
208+void logwin_keydown(WPARAM wparam, LPARAM lparam)
209+{
210+ /* WM_KEYDOWNをポスト */
211+ PostMessage(g_logwin_screen.hwnd, WM_KEYDOWN, wparam, lparam);
212+}
213+
214+/*
215+ * Windowsログ
206216 * ログ出力(char)
207217 */
208218 void logwin_out(const char *log)
--- a/DebugMonitor/src/framework/logwin.h
+++ b/DebugMonitor/src/framework/logwin.h
@@ -17,6 +17,9 @@ BOOL logwin_init(HWND parent, int x, int y, int width, int height);
1717 /* リサイズ */
1818 void logwin_resize(int x, int y, int width, int height);
1919
20+/* キー押下 */
21+void logwin_keydown(WPARAM wparam, LPARAM lparam);
22+
2023 /* ログ追加(char) */
2124 void logwin_out(const char *log);
2225
--- a/DebugMonitor/src/framework/monitor.c
+++ b/DebugMonitor/src/framework/monitor.c
@@ -135,11 +135,12 @@ void monitor_idle(void)
135135 {
136136 SYSTEMTIME st;
137137
138- monitor_locate(0, 0);
138+ /* ローカルタイムを取得 */
139+ GetLocalTime(&st);
139140
141+ /* 現在時刻を表示 */
142+ monitor_locate(0, 0);
140143 monitor_reverse(TRUE);
141- GetLocalTime(&st);
142- monitor_printf("%02d:%02d:%02d\n", st.wHour, st.wMinute, st.wSecond);
144+ monitor_printf("現在時刻 %02d:%02d:%02d\n", st.wHour, st.wMinute, st.wSecond);
143145 monitor_reverse(FALSE);
144-
145146 }
--- a/DebugMonitor/src/framework/screen.c
+++ b/DebugMonitor/src/framework/screen.c
@@ -1997,9 +1997,8 @@ void screen_clear(SCREEN_OBJECT *screen, UINT width, UINT height)
19971997 /* yループ */
19981998 for (y_loop = 0; y_loop < height; y_loop++)
19991999 {
2000- /* x,yをセット */
2000+ /* xをセット */
20012001 screen->real.x = x_real;
2002- screen->real.y = y_loop;
20032002
20042003 /* lineを得る */
20052004 line = screen_real_getline(screen);
@@ -2014,6 +2013,9 @@ void screen_clear(SCREEN_OBJECT *screen, UINT width, UINT height)
20142013 /* 文字セット */
20152014 screen_realline_setchr(line, screen, L' ');
20162015 }
2016+
2017+ /* 次のyへ */
2018+ screen->real.y++;
20172019 }
20182020
20192021 /* 現在の位置を復元 */
--- a/DebugMonitor/src/framework/winmain.c
+++ b/DebugMonitor/src/framework/winmain.c
@@ -11,6 +11,7 @@
1111 #include "monitor.h"
1212 #include "logwin.h"
1313 #include "comm.h"
14+#include "ymodem.h"
1415 #include "app.h"
1516 #include "winmain.h"
1617
@@ -501,6 +502,29 @@ static void OnUser(HWND hWnd)
501502
502503 /*
503504 * WinMain
505+ * WM_KEYDOWNメッセージハンドラ
506+ */
507+static void OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
508+{
509+ assert(NULL != hWnd);
510+
511+ /* キー別に処理 */
512+ switch (wParam)
513+ {
514+ case VK_HOME:
515+ case VK_END:
516+ case VK_PRIOR:
517+ case VK_NEXT:
518+ case VK_UP:
519+ case VK_DOWN:
520+ /* Windowsログへ転送 */
521+ logwin_keydown(wParam, lParam);
522+ break;
523+ }
524+}
525+
526+/*
527+ * WinMain
504528 * フレームウィンドウのウィンドウプロシージャ
505529 */
506530 static LRESULT CALLBACK FrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -560,6 +584,12 @@ static LRESULT CALLBACK FrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
560584 OnUser(hWnd);
561585 return 0;
562586
587+ /* WM_KEYDOWN */
588+ case WM_KEYDOWN:
589+ /* ハンドラを呼び出す */
590+ OnKeyDown(hWnd, wParam, lParam);
591+ return 0;
592+
563593 /* その他 */
564594 default:
565595 break;
@@ -711,6 +741,25 @@ static void ExitInstance(void)
711741
712742 /*
713743 * WinMain
744+ * アイドル処理
745+ */
746+static void OnIdle(void)
747+{
748+ /* フレームウィンドウ作成前は何もしない */
749+ if (NULL == g_hFrameWnd)
750+ {
751+ return;
752+ }
753+
754+ /* frameworkとcommのアイドル処理 */
755+ screen_idle();
756+ cons_idle();
757+ monitor_idle();
758+ ymodem_idle();
759+}
760+
761+/*
762+ * WinMain
714763 * メッセージポンプ
715764 * ※アプリケーションを終了すべき場合はFALSEを返す
716765 */
@@ -736,7 +785,7 @@ BOOL do_events(DWORD dwTimeOut)
736785 }
737786
738787 /* メッセージが到着しているか */
739- if (TRUE == PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
788+ if (FALSE != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
740789 {
741790 /* メッセージをキューから取得 */
742791 if (GetMessage(&msg, NULL, 0, 0) <= 0)
@@ -749,13 +798,13 @@ BOOL do_events(DWORD dwTimeOut)
749798 TranslateMessage(&msg);
750799 DispatchMessage(&msg);
751800 }
752- else
753- {
754- /* アイドル処理*/
755- screen_idle();
756- cons_idle();
757- monitor_idle();
758801
802+ /* アイドル処理 */
803+ OnIdle();
804+
805+ /* メッセージが到着していなければスリープ */
806+ if (FALSE == PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
807+ {
759808 /* スリープ */
760809 Sleep(10);
761810 }
@@ -794,16 +843,30 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
794843 /* メッセージループ */
795844 for (;;)
796845 {
797- /* メッセージをキューから取得 */
798- if (GetMessage(&msg, NULL, 0, 0) <= 0)
846+ /* メッセージが到着しているか */
847+ if (FALSE != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
799848 {
800- /* WM_QUITなら終了 */
801- break;
849+ /* メッセージをキューから取得 */
850+ if (GetMessage(&msg, NULL, 0, 0) <= 0)
851+ {
852+ /* WM_QUITなら終了 */
853+ break;
854+ }
855+
856+ /* メッセージをディスパッチ */
857+ TranslateMessage(&msg);
858+ DispatchMessage(&msg);
802859 }
803860
804- /* メッセージをディスパッチ */
805- TranslateMessage(&msg);
806- DispatchMessage(&msg);
861+ /* ユーザアプリが終了していて、WM_CLOSE到着前なら */
862+ if ((FALSE != g_bUserQuit) && (g_bCloseReq == FALSE))
863+ {
864+ /* アイドル処理 */
865+ OnIdle();
866+
867+ /* スリープ */
868+ Sleep(10);
869+ }
807870 }
808871
809872 /* インスタンスの終了 */