UART通信を用いた組み込みデバッグ用途向けメモリモニタ
Revision | 5c07f033ac3fc92e04cbec32b6acd0fc8334bf0b (tree) |
---|---|
Time | 2018-05-14 22:32:54 |
Author | Yasushi Tanaka <tanaka_yasushi2008@yaho...> |
Commiter | Yasushi Tanaka |
YMODEM送信確認
@@ -63,7 +63,7 @@ | ||
63 | 63 | </ItemDefinitionGroup> |
64 | 64 | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
65 | 65 | <ClCompile> |
66 | - <WarningLevel>Level3</WarningLevel> | |
66 | + <WarningLevel>Level4</WarningLevel> | |
67 | 67 | <PrecompiledHeader> |
68 | 68 | </PrecompiledHeader> |
69 | 69 | <Optimization>MaxSpeed</Optimization> |
@@ -71,12 +71,15 @@ | ||
71 | 71 | <IntrinsicFunctions>true</IntrinsicFunctions> |
72 | 72 | <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
73 | 73 | <SDLCheck>true</SDLCheck> |
74 | + <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |
75 | + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | |
74 | 76 | </ClCompile> |
75 | 77 | <Link> |
76 | 78 | <SubSystem>Windows</SubSystem> |
77 | 79 | <GenerateDebugInformation>true</GenerateDebugInformation> |
78 | 80 | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
79 | 81 | <OptimizeReferences>true</OptimizeReferences> |
82 | + <AdditionalDependencies>imm32.lib;winmm.lib;setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies> | |
80 | 83 | </Link> |
81 | 84 | </ItemDefinitionGroup> |
82 | 85 | <ItemGroup> |
@@ -9,6 +9,7 @@ | ||
9 | 9 | #include "winmain.h" |
10 | 10 | #include "logwin.h" |
11 | 11 | #include "comm.h" |
12 | +#include "ymodem.h" | |
12 | 13 | #include "app.h" |
13 | 14 | |
14 | 15 | /* |
@@ -17,12 +18,51 @@ | ||
17 | 18 | */ |
18 | 19 | void app_run(void) |
19 | 20 | { |
20 | - UINT count; | |
21 | + UINT portnum; | |
22 | + BYTE buf[240]; | |
23 | + UINT loop; | |
24 | + BOOL result; | |
21 | 25 | |
22 | - count = 0; | |
23 | - | |
24 | - while (TRUE == do_events(1000)) | |
26 | + portnum = 0; | |
27 | + while (0 == portnum) | |
25 | 28 | { |
29 | + if (FALSE == do_events(10)) | |
30 | + { | |
31 | + return; | |
32 | + } | |
26 | 33 | 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 | + } | |
27 | 67 | } |
28 | 68 | } |
@@ -835,7 +835,7 @@ UINT comm_get_bytes(UINT index) | ||
835 | 835 | * 通信ポート |
836 | 836 | * 受信 |
837 | 837 | */ |
838 | -UINT comm_recv(UINT index, LPBYTE buf, UINT buflen) | |
838 | +UINT comm_recv(UINT index, BYTE *buf, UINT buflen) | |
839 | 839 | { |
840 | 840 | COMM_PORT *port; |
841 | 841 | UINT inque; |
@@ -884,7 +884,7 @@ UINT comm_recv(UINT index, LPBYTE buf, UINT buflen) | ||
884 | 884 | * 通信ポート |
885 | 885 | * 送信 |
886 | 886 | */ |
887 | -UINT comm_send(UINT index, LPBYTE buf, UINT buflen) | |
887 | +UINT comm_send(UINT index, const BYTE *buf, UINT buflen) | |
888 | 888 | { |
889 | 889 | COMM_PORT *port; |
890 | 890 | DWORD written; |
@@ -59,7 +59,7 @@ void comm_close(UINT index); | ||
59 | 59 | UINT comm_get_bytes(UINT index); |
60 | 60 | |
61 | 61 | /* 受信 */ |
62 | -UINT comm_recv(UINT index, LPBYTE buf, UINT buflen); | |
62 | +UINT comm_recv(UINT index, BYTE *buf, UINT buflen); | |
63 | 63 | |
64 | 64 | /* 送信 */ |
65 | -UINT comm_send(UINT index, LPBYTE buf, UINT buflen); | |
65 | +UINT comm_send(UINT index, const BYTE *buf, UINT buflen); |
@@ -6,11 +6,22 @@ | ||
6 | 6 | */ |
7 | 7 | |
8 | 8 | #include "header.h" |
9 | +#include "monitor.h" | |
9 | 10 | #include "logwin.h" |
10 | 11 | #include "comm.h" |
11 | 12 | #include "ymodem.h" |
12 | 13 | |
13 | 14 | /* |
15 | + * モニタ情報 | |
16 | + */ | |
17 | + | |
18 | +/* モニタ開始位置(X) */ | |
19 | +#define YMODEM_MONITOR_X 0 | |
20 | + | |
21 | +/* モニタ開始位置(Y) */ | |
22 | +#define YMODEM_MONITOR_Y 1 | |
23 | + | |
24 | +/* | |
14 | 25 | * YMODEM定数 |
15 | 26 | */ |
16 | 27 |
@@ -40,7 +51,7 @@ | ||
40 | 51 | */ |
41 | 52 | |
42 | 53 | /* 送信タイムアウト */ |
43 | -#define YMODEM_SEND_TIMEOUT 100 | |
54 | +#define YMODEM_SEND_TIMEOUT 1000 | |
44 | 55 | |
45 | 56 | /* 送信リトライ回数 */ |
46 | 57 | #define YMODEM_SEND_RETRY 40 |
@@ -406,22 +417,23 @@ static void ymodem_discard_recv(YMODEM_OBJECT *object) | ||
406 | 417 | |
407 | 418 | assert(NULL != object); |
408 | 419 | |
409 | - /* 無限ループ */ | |
410 | - for (;;) | |
420 | + /* 受信バイト数の取得 */ | |
421 | + bytes = comm_get_bytes(object->comm_index); | |
422 | + | |
423 | + /* bytesが0以上である限りループ */ | |
424 | + while (0 < bytes) | |
411 | 425 | { |
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) | |
415 | 429 | { |
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; | |
424 | 433 | } |
434 | + | |
435 | + /* 受信バイト数の取得 */ | |
436 | + bytes = comm_get_bytes(object->comm_index); | |
425 | 437 | } |
426 | 438 | } |
427 | 439 |
@@ -437,10 +449,12 @@ static BOOL ymodem_check_timeout(YMODEM_OBJECT *object, DWORD timeout) | ||
437 | 449 | |
438 | 450 | /* 差分時間を得る */ |
439 | 451 | diff = (DWORD)(timeGetTime() - object->start_time); |
440 | - | |
441 | 452 | /* 差分時間がパラメータ以上であればタイムアウト */ |
442 | 453 | if (diff >= timeout) |
443 | 454 | { |
455 | + /* 開始時間を増やす */ | |
456 | + object->start_time += timeout; | |
457 | + | |
444 | 458 | /* タイムアウト回数++ */ |
445 | 459 | object->timeout_cnt++; |
446 | 460 |
@@ -800,6 +814,7 @@ static void ymodem_sendinfo_do(YMODEM_OBJECT *object) | ||
800 | 814 | */ |
801 | 815 | static void ymodem_sendinfo_exit(YMODEM_OBJECT *object) |
802 | 816 | { |
817 | + UNREFERENCED_PARAMETER(object); | |
803 | 818 | } |
804 | 819 | |
805 | 820 | /* |
@@ -864,6 +879,7 @@ static void ymodem_infoack_do(YMODEM_OBJECT *object) | ||
864 | 879 | */ |
865 | 880 | static void ymodem_infoack_exit(YMODEM_OBJECT *object) |
866 | 881 | { |
882 | + UNREFERENCED_PARAMETER(object); | |
867 | 883 | } |
868 | 884 | |
869 | 885 | /* |
@@ -897,7 +913,14 @@ static void ymodem_waitc2_do(YMODEM_OBJECT *object) | ||
897 | 913 | /* 'C'であれば状態遷移 */ |
898 | 914 | if (YMODEM_C == buf) |
899 | 915 | { |
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 | + } | |
901 | 924 | } |
902 | 925 | } |
903 | 926 |
@@ -935,15 +958,15 @@ static void ymodem_senddata_enter(YMODEM_OBJECT *object) | ||
935 | 958 | memset(object->block_buf, 0, sizeof(object->block_buf)); |
936 | 959 | |
937 | 960 | /* コピーする長さを算出(最大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; | |
940 | 963 | if (0x80 < len) |
941 | 964 | { |
942 | 965 | len = 0x80; |
943 | 966 | } |
944 | 967 | |
945 | 968 | /* ブロックオフセットからデータをコピー */ |
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); | |
947 | 970 | |
948 | 971 | /* ブロック送信開始 */ |
949 | 972 | ymodem_block_sendstart(object); |
@@ -978,6 +1001,7 @@ static void ymodem_senddata_do(YMODEM_OBJECT *object) | ||
978 | 1001 | */ |
979 | 1002 | static void ymodem_senddata_exit(YMODEM_OBJECT *object) |
980 | 1003 | { |
1004 | + UNREFERENCED_PARAMETER(object); | |
981 | 1005 | } |
982 | 1006 | |
983 | 1007 | /* |
@@ -1013,7 +1037,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object) | ||
1013 | 1037 | /* ACK */ |
1014 | 1038 | case YMODEM_ACK: |
1015 | 1039 | /* ACKは次のブロックまたはEOT送信 */ |
1016 | - if ((object->block_offset + 0x80) <= object->file_size) | |
1040 | + if ((object->buf_offset + 0x80) >= object->file_size) | |
1017 | 1041 | { |
1018 | 1042 | /* リトライ回数を初期化 */ |
1019 | 1043 | object->retry = 0; |
@@ -1029,8 +1053,8 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object) | ||
1029 | 1053 | /* ブロック番号を進める */ |
1030 | 1054 | object->block_no = (object->block_no + 1) & 0xff; |
1031 | 1055 | |
1032 | - /* ブロックオフセットを進める */ | |
1033 | - object->block_offset += 0x80; | |
1056 | + /* バッファオフセットを進める */ | |
1057 | + object->buf_offset += 0x80; | |
1034 | 1058 | |
1035 | 1059 | /* データブロック送信 */ |
1036 | 1060 | ymodem_object_trans(object, YMODEM_TRANS_SENDDATA); |
@@ -1067,6 +1091,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object) | ||
1067 | 1091 | */ |
1068 | 1092 | static void ymodem_dataack_exit(YMODEM_OBJECT *object) |
1069 | 1093 | { |
1094 | + UNREFERENCED_PARAMETER(object); | |
1070 | 1095 | } |
1071 | 1096 | |
1072 | 1097 | /* |
@@ -1076,6 +1101,7 @@ static void ymodem_dataack_exit(YMODEM_OBJECT *object) | ||
1076 | 1101 | */ |
1077 | 1102 | static void ymodem_sendeot_enter(YMODEM_OBJECT *object) |
1078 | 1103 | { |
1104 | + UNREFERENCED_PARAMETER(object); | |
1079 | 1105 | } |
1080 | 1106 | |
1081 | 1107 | /* |
@@ -1112,6 +1138,7 @@ static void ymodem_sendeot_do(YMODEM_OBJECT *object) | ||
1112 | 1138 | */ |
1113 | 1139 | static void ymodem_sendeot_exit(YMODEM_OBJECT *object) |
1114 | 1140 | { |
1141 | + UNREFERENCED_PARAMETER(object); | |
1115 | 1142 | } |
1116 | 1143 | |
1117 | 1144 | /* |
@@ -1151,6 +1178,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object) | ||
1151 | 1178 | /* ACKは送信終了 */ |
1152 | 1179 | object->sending = FALSE; |
1153 | 1180 | object->status = YMODEM_SUCCESS; |
1181 | + object->state = YMODEM_TRANS_NONE; | |
1154 | 1182 | break; |
1155 | 1183 | |
1156 | 1184 | /* NAK */ |
@@ -1183,6 +1211,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object) | ||
1183 | 1211 | */ |
1184 | 1212 | static void ymodem_eotack_exit(YMODEM_OBJECT *object) |
1185 | 1213 | { |
1214 | + UNREFERENCED_PARAMETER(object); | |
1186 | 1215 | } |
1187 | 1216 | |
1188 | 1217 | /* |
@@ -1414,6 +1443,160 @@ static BOOL ymodem_object_send(YMODEM_OBJECT *object, const char *filename, UINT | ||
1414 | 1443 | |
1415 | 1444 | /* |
1416 | 1445 | * 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 | |
1417 | 1600 | * 初期化 |
1418 | 1601 | */ |
1419 | 1602 | void ymodem_init(UINT comm_index) |
@@ -1430,6 +1613,9 @@ void ymodem_idle(void) | ||
1430 | 1613 | { |
1431 | 1614 | /* オブジェクトアイドル */ |
1432 | 1615 | ymodem_object_idle(&g_ymodem_object); |
1616 | + | |
1617 | + /* モニタ */ | |
1618 | + ymodem_object_monitor(&g_ymodem_object); | |
1433 | 1619 | } |
1434 | 1620 | |
1435 | 1621 | /* |
@@ -1459,7 +1645,7 @@ BOOL ymodem_recv(void) | ||
1459 | 1645 | */ |
1460 | 1646 | UINT ymodem_get_status(void) |
1461 | 1647 | { |
1462 | - return 0; | |
1648 | + return g_ymodem_object.status; | |
1463 | 1649 | } |
1464 | 1650 | |
1465 | 1651 | /* |
@@ -1477,7 +1663,7 @@ const char* ymodem_get_filename(void) | ||
1477 | 1663 | */ |
1478 | 1664 | UINT ymodem_get_filesize(void) |
1479 | 1665 | { |
1480 | - return 0; | |
1666 | + return g_ymodem_object.file_size; | |
1481 | 1667 | } |
1482 | 1668 | |
1483 | 1669 | /* |
@@ -1486,5 +1672,5 @@ UINT ymodem_get_filesize(void) | ||
1486 | 1672 | */ |
1487 | 1673 | BYTE* ymodem_get_filebuf(void) |
1488 | 1674 | { |
1489 | - return NULL; | |
1675 | + return g_ymodem_object.file_buf; | |
1490 | 1676 | } |
@@ -203,6 +203,16 @@ void logwin_resize(int x, int y, int width, int height) | ||
203 | 203 | |
204 | 204 | /* |
205 | 205 | * 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ログ | |
206 | 216 | * ログ出力(char) |
207 | 217 | */ |
208 | 218 | void logwin_out(const char *log) |
@@ -17,6 +17,9 @@ BOOL logwin_init(HWND parent, int x, int y, int width, int height); | ||
17 | 17 | /* リサイズ */ |
18 | 18 | void logwin_resize(int x, int y, int width, int height); |
19 | 19 | |
20 | +/* キー押下 */ | |
21 | +void logwin_keydown(WPARAM wparam, LPARAM lparam); | |
22 | + | |
20 | 23 | /* ログ追加(char) */ |
21 | 24 | void logwin_out(const char *log); |
22 | 25 |
@@ -135,11 +135,12 @@ void monitor_idle(void) | ||
135 | 135 | { |
136 | 136 | SYSTEMTIME st; |
137 | 137 | |
138 | - monitor_locate(0, 0); | |
138 | + /* ローカルタイムを取得 */ | |
139 | + GetLocalTime(&st); | |
139 | 140 | |
141 | + /* 現在時刻を表示 */ | |
142 | + monitor_locate(0, 0); | |
140 | 143 | 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); | |
143 | 145 | monitor_reverse(FALSE); |
144 | - | |
145 | 146 | } |
@@ -1997,9 +1997,8 @@ void screen_clear(SCREEN_OBJECT *screen, UINT width, UINT height) | ||
1997 | 1997 | /* yループ */ |
1998 | 1998 | for (y_loop = 0; y_loop < height; y_loop++) |
1999 | 1999 | { |
2000 | - /* x,yをセット */ | |
2000 | + /* xをセット */ | |
2001 | 2001 | screen->real.x = x_real; |
2002 | - screen->real.y = y_loop; | |
2003 | 2002 | |
2004 | 2003 | /* lineを得る */ |
2005 | 2004 | line = screen_real_getline(screen); |
@@ -2014,6 +2013,9 @@ void screen_clear(SCREEN_OBJECT *screen, UINT width, UINT height) | ||
2014 | 2013 | /* 文字セット */ |
2015 | 2014 | screen_realline_setchr(line, screen, L' '); |
2016 | 2015 | } |
2016 | + | |
2017 | + /* 次のyへ */ | |
2018 | + screen->real.y++; | |
2017 | 2019 | } |
2018 | 2020 | |
2019 | 2021 | /* 現在の位置を復元 */ |
@@ -11,6 +11,7 @@ | ||
11 | 11 | #include "monitor.h" |
12 | 12 | #include "logwin.h" |
13 | 13 | #include "comm.h" |
14 | +#include "ymodem.h" | |
14 | 15 | #include "app.h" |
15 | 16 | #include "winmain.h" |
16 | 17 |
@@ -501,6 +502,29 @@ static void OnUser(HWND hWnd) | ||
501 | 502 | |
502 | 503 | /* |
503 | 504 | * 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 | |
504 | 528 | * フレームウィンドウのウィンドウプロシージャ |
505 | 529 | */ |
506 | 530 | 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 | ||
560 | 584 | OnUser(hWnd); |
561 | 585 | return 0; |
562 | 586 | |
587 | + /* WM_KEYDOWN */ | |
588 | + case WM_KEYDOWN: | |
589 | + /* ハンドラを呼び出す */ | |
590 | + OnKeyDown(hWnd, wParam, lParam); | |
591 | + return 0; | |
592 | + | |
563 | 593 | /* その他 */ |
564 | 594 | default: |
565 | 595 | break; |
@@ -711,6 +741,25 @@ static void ExitInstance(void) | ||
711 | 741 | |
712 | 742 | /* |
713 | 743 | * 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 | |
714 | 763 | * メッセージポンプ |
715 | 764 | * ※アプリケーションを終了すべき場合はFALSEを返す |
716 | 765 | */ |
@@ -736,7 +785,7 @@ BOOL do_events(DWORD dwTimeOut) | ||
736 | 785 | } |
737 | 786 | |
738 | 787 | /* メッセージが到着しているか */ |
739 | - if (TRUE == PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
788 | + if (FALSE != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
740 | 789 | { |
741 | 790 | /* メッセージをキューから取得 */ |
742 | 791 | if (GetMessage(&msg, NULL, 0, 0) <= 0) |
@@ -749,13 +798,13 @@ BOOL do_events(DWORD dwTimeOut) | ||
749 | 798 | TranslateMessage(&msg); |
750 | 799 | DispatchMessage(&msg); |
751 | 800 | } |
752 | - else | |
753 | - { | |
754 | - /* アイドル処理*/ | |
755 | - screen_idle(); | |
756 | - cons_idle(); | |
757 | - monitor_idle(); | |
758 | 801 | |
802 | + /* アイドル処理 */ | |
803 | + OnIdle(); | |
804 | + | |
805 | + /* メッセージが到着していなければスリープ */ | |
806 | + if (FALSE == PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
807 | + { | |
759 | 808 | /* スリープ */ |
760 | 809 | Sleep(10); |
761 | 810 | } |
@@ -794,16 +843,30 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine | ||
794 | 843 | /* メッセージループ */ |
795 | 844 | for (;;) |
796 | 845 | { |
797 | - /* メッセージをキューから取得 */ | |
798 | - if (GetMessage(&msg, NULL, 0, 0) <= 0) | |
846 | + /* メッセージが到着しているか */ | |
847 | + if (FALSE != PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) | |
799 | 848 | { |
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); | |
802 | 859 | } |
803 | 860 | |
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 | + } | |
807 | 870 | } |
808 | 871 | |
809 | 872 | /* インスタンスの終了 */ |