• 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

Revisión8634a4e72a4da8bec42eb994b5698cb86839c9a6 (tree)
Tiempo2018-05-16 22:32:39
AutorYasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

リソースを追加

Cambiar Resumen

Diferencia incremental

--- a/DebugMonitor/DebugMonitor.vcxproj
+++ b/DebugMonitor/DebugMonitor.vcxproj
@@ -47,13 +47,13 @@
4747 </PropertyGroup>
4848 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
4949 <ClCompile>
50- <PrecompiledHeader>
51- </PrecompiledHeader>
50+ <PrecompiledHeader>Create</PrecompiledHeader>
5251 <WarningLevel>Level4</WarningLevel>
5352 <Optimization>Disabled</Optimization>
5453 <PreprocessorDefinitions>_CRTDBG_MAP_ALLOC;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
5554 <SDLCheck>true</SDLCheck>
56- <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
55+ <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;$(ProjectDir)res;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
56+ <PrecompiledHeaderFile>header.h</PrecompiledHeaderFile>
5757 </ClCompile>
5858 <Link>
5959 <SubSystem>Windows</SubSystem>
@@ -64,15 +64,15 @@
6464 <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
6565 <ClCompile>
6666 <WarningLevel>Level4</WarningLevel>
67- <PrecompiledHeader>
68- </PrecompiledHeader>
67+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
6968 <Optimization>MaxSpeed</Optimization>
7069 <FunctionLevelLinking>true</FunctionLevelLinking>
7170 <IntrinsicFunctions>true</IntrinsicFunctions>
7271 <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
7372 <SDLCheck>true</SDLCheck>
74- <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
73+ <AdditionalIncludeDirectories>$(ProjectDir)src\framework;$(ProjectDir)src\comm;$(ProjectDir)src\app;$(ProjectDir)res;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
7574 <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
75+ <PrecompiledHeaderFile>header.h</PrecompiledHeaderFile>
7676 </ClCompile>
7777 <Link>
7878 <SubSystem>Windows</SubSystem>
@@ -83,6 +83,7 @@
8383 </Link>
8484 </ItemDefinitionGroup>
8585 <ItemGroup>
86+ <ClInclude Include="res\resource.h" />
8687 <ClInclude Include="src\app\app.h" />
8788 <ClInclude Include="src\comm\comm.h" />
8889 <ClInclude Include="src\comm\ymodem.h" />
@@ -105,6 +106,9 @@
105106 <ClCompile Include="src\framework\screen.c" />
106107 <ClCompile Include="src\framework\winmain.c" />
107108 </ItemGroup>
109+ <ItemGroup>
110+ <ResourceCompile Include="res\DebugMonitor.rc" />
111+ </ItemGroup>
108112 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
109113 <ImportGroup Label="ExtensionTargets">
110114 </ImportGroup>
--- a/DebugMonitor/DebugMonitor.vcxproj.filters
+++ b/DebugMonitor/DebugMonitor.vcxproj.filters
@@ -31,6 +31,9 @@
3131 <Filter Include="ソース ファイル\app">
3232 <UniqueIdentifier>{7f74ed15-8047-46a8-b2bf-3cd283e0275c}</UniqueIdentifier>
3333 </Filter>
34+ <Filter Include="ヘッダー ファイル\res">
35+ <UniqueIdentifier>{0893a148-4f06-4220-b6f2-e59c315e2ee9}</UniqueIdentifier>
36+ </Filter>
3437 </ItemGroup>
3538 <ItemGroup>
3639 <ClInclude Include="src\framework\screen.h">
@@ -63,6 +66,9 @@
6366 <ClInclude Include="src\comm\ymodem.h">
6467 <Filter>ヘッダー ファイル\comm</Filter>
6568 </ClInclude>
69+ <ClInclude Include="res\resource.h">
70+ <Filter>ヘッダー ファイル\res</Filter>
71+ </ClInclude>
6672 </ItemGroup>
6773 <ItemGroup>
6874 <ClCompile Include="src\framework\winmain.c">
@@ -93,4 +99,9 @@
9399 <Filter>ソース ファイル\comm</Filter>
94100 </ClCompile>
95101 </ItemGroup>
102+ <ItemGroup>
103+ <ResourceCompile Include="res\DebugMonitor.rc">
104+ <Filter>リソース ファイル</Filter>
105+ </ResourceCompile>
106+ </ItemGroup>
96107 </Project>
\ No newline at end of file
--- /dev/null
+++ b/DebugMonitor/res/DebugMonitor.rc
@@ -0,0 +1,43 @@
1+// Generated by ResEdit 1.6.6
2+// Copyright (C) 2006-2015
3+// http://www.resedit.net
4+
5+#include <windows.h>
6+#include <commctrl.h>
7+#include <richedit.h>
8+#include "resource.h"
9+
10+
11+
12+
13+//
14+// Menu resources
15+//
16+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
17+IDR_MAINMENU MENU
18+{
19+ POPUP "ファイル(&F)"
20+ {
21+ MENUITEM "終了(&X)", IDM_EXIT
22+ }
23+ POPUP "ヘルプ(&H)"
24+ {
25+ MENUITEM "バージョン情報(&A)", IDM_ABOUT
26+ }
27+}
28+
29+
30+
31+//
32+// Dialog resources
33+//
34+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
35+IDD_ABOUTDIALOG DIALOG 0, 0, 186, 95
36+STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
37+CAPTION "バージョン情報"
38+FONT 8, "MS UI Gothic"
39+{
40+ DEFPUSHBUTTON "OK", IDOK, 68, 72, 50, 14, 0, WS_EX_LEFT
41+ CTEXT "DebugMonitor", IDD_ABOUT_APP, 19, 23, 145, 10, SS_CENTER | SS_CENTERIMAGE, WS_EX_LEFT
42+ CTEXT "http://ja.osdn.net/users/xm6_original/", IDD_ABOUT_COPYRIGHT, 15, 47, 151, 9, SS_CENTER, WS_EX_LEFT
43+}
--- /dev/null
+++ b/DebugMonitor/res/resource.h
@@ -0,0 +1,10 @@
1+#ifndef IDC_STATIC
2+#define IDC_STATIC (-1)
3+#endif
4+
5+#define IDR_MAINMENU 100
6+#define IDD_ABOUTDIALOG 102
7+#define IDD_ABOUT_APP 104
8+#define IDD_ABOUT_COPYRIGHT 106
9+#define IDM_EXIT 40000
10+#define IDM_ABOUT 40001
--- a/DebugMonitor/src/app/app.c
+++ b/DebugMonitor/src/app/app.c
@@ -19,8 +19,6 @@
1919 void app_run(void)
2020 {
2121 UINT portnum;
22- BYTE buf[240];
23- UINT loop;
2422 BOOL result;
2523
2624 portnum = 0;
@@ -42,17 +40,8 @@ void app_run(void)
4240 /* ポート指定 */
4341 ymodem_init(0);
4442
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));
43+ /* ファイル受信 */
44+ result = ymodem_recv();
5645 if (FALSE == result)
5746 {
5847 return;
--- a/DebugMonitor/src/comm/ymodem.c
+++ b/DebugMonitor/src/comm/ymodem.c
@@ -51,41 +51,61 @@
5151 */
5252
5353 /* 送信タイムアウト */
54-#define YMODEM_SEND_TIMEOUT 1000
54+#define YMODEM_SEND_TIMEOUT 1000
5555
5656 /* 送信リトライ回数 */
57-#define YMODEM_SEND_RETRY 40
57+#define YMODEM_SEND_RETRY 40
58+
59+/* 受信タイムアウト */
60+#define YMODEM_RECV_TIMEOUT 500
61+
62+/* 受信リトライ回数 */
63+#define YMODEM_RECV_RETRY 80
5864
5965 /*
6066 * 状態遷移
6167 */
6268
6369 /* 初期状態 */
64-#define YMODEM_TRANS_NONE 0
70+#define YMODEM_STATE_NONE 0
71+
72+/*
73+ * 送信系
74+ */
6575
6676 /* 受信側の'C'送信待ち(1) */
67-#define YMODEM_TRANS_WAITC1 1
77+#define YMODEM_STATE_WAITC1 1
6878
6979 /* ファイル情報送信 */
70-#define YMODEM_TRANS_SENDINFO 2
80+#define YMODEM_STATE_SENDINFO 2
7181
7282 /* ファイル情報ACK待ち */
73-#define YMODEM_TRANS_INFOACK 3
83+#define YMODEM_STATE_INFOACK 3
7484
7585 /* 受信側の'C'送信待ち(2) */
76-#define YMODEM_TRANS_WAITC2 4
86+#define YMODEM_STATE_WAITC2 4
7787
7888 /* データブロック送信 */
79-#define YMODEM_TRANS_SENDDATA 5
89+#define YMODEM_STATE_SENDDATA 5
8090
8191 /* データブロックACK待ち */
82-#define YMODEM_TRANS_DATAACK 6
92+#define YMODEM_STATE_DATAACK 6
8393
8494 /* EOT送信 */
85-#define YMODEM_TRANS_SENDEOT 7
95+#define YMODEM_STATE_SENDEOT 7
8696
8797 /* EOTに対するACK待ち */
88-#define YMODEM_TRANS_EOTACK 8
98+#define YMODEM_STATE_EOTACK 8
99+
100+/*
101+ * 受信系
102+ */
103+
104+/* 'C'送信(1) */
105+#define YMODEM_STATE_SENDC1 9
106+
107+/* SOH送信待ち */
108+#define YMODEM_STATE_WAITSOH 10
89109
90110 /*
91111 * YMODEMオブジェクト
@@ -279,6 +299,41 @@ static void ymodem_object_init(YMODEM_OBJECT *object, UINT comm_index)
279299
280300 /*
281301 * YMODEM
302+ * エラー(成功)
303+ */
304+static void ymodem_error_success(YMODEM_OBJECT *object)
305+{
306+ assert(NULL != object);
307+
308+ /* 成功 */
309+ object->status = YMODEM_SUCCESS;
310+
311+ /* 初期状態に戻す */
312+ object->state = YMODEM_STATE_NONE;
313+
314+ /* 送信中か */
315+ if (FALSE != object->sending)
316+ {
317+ /* 送信中でない */
318+ object->sending = FALSE;
319+
320+ /* ログ */
321+ logwin_printf("ファイル送信成功");
322+ }
323+
324+ /* 受信中か */
325+ if (FALSE != object->sending)
326+ {
327+ /* 受信中でない */
328+ object->receiving = FALSE;
329+
330+ /* ログ */
331+ logwin_printf("ファイル受信成功");
332+ }
333+}
334+
335+/*
336+ * YMODEM
282337 * エラー(ポートがクローズされた)
283338 */
284339 static void ymodem_error_closed(YMODEM_OBJECT *object)
@@ -618,6 +673,90 @@ static BYTE ymodem_wait_send(YMODEM_OBJECT *object)
618673 ymodem_error_cancel(object);
619674 return 0;
620675 }
676+
677+ /* その他は読み捨て */
678+ default:
679+ break;
680+ }
681+ }
682+
683+ /* 有効な受信データなし */
684+ return 0;
685+}
686+
687+/*
688+ * YMODEM
689+ * 受信時の受信キャラクタ待ち
690+ */
691+static BYTE ymodem_wait_recv(YMODEM_OBJECT *object)
692+{
693+ BOOL result;
694+ UINT len;
695+ UINT error;
696+ BYTE buf;
697+
698+ /* タイムアウトチェック */
699+ result = ymodem_check_timeout(object, YMODEM_RECV_TIMEOUT);
700+ if (FALSE != result)
701+ {
702+ /* タイムアウトしたので、リトライチェック */
703+ result = ymodem_check_retry(object, YMODEM_RECV_RETRY);
704+ if (FALSE != result)
705+ {
706+ /* タイムアウトエラー */
707+ ymodem_error_timeout(object);
708+ return 0;
709+ }
710+ }
711+
712+ /* 受信バッファのデータサイズを得る */
713+ len = comm_get_bytes(object->comm_index);
714+ while (len > 0)
715+ {
716+ /* 1バイト読み込み */
717+ error = comm_recv(object->comm_index, &buf, sizeof(buf));
718+ if (0 == error)
719+ {
720+ /* ポートがクローズされた */
721+ ymodem_error_closed(object);
722+ return 0;
723+ }
724+
725+ /* CAN以外であればCANカウンタをクリア */
726+ if (YMODEM_CAN != buf)
727+ {
728+ object->cancel = 0;
729+ }
730+
731+ switch (buf)
732+ {
733+ /* SOH */
734+ case YMODEM_SOH:
735+ return YMODEM_SOH;
736+
737+ /* STX */
738+ case YMODEM_STX:
739+ return YMODEM_STX;
740+
741+ /* EOT */
742+ case YMODEM_EOT:
743+ return YMODEM_EOT;
744+
745+ /* CAN */
746+ case YMODEM_CAN:
747+ object->can_cnt++;
748+ /* キャンセルチェック */
749+ result = ymodem_check_cancel(object);
750+ if (FALSE != result)
751+ {
752+ /* キャンセルエラー */
753+ ymodem_error_cancel(object);
754+ return 0;
755+ }
756+
757+ /* その他は読み捨て */
758+ default:
759+ break;
621760 }
622761 }
623762
@@ -736,7 +875,7 @@ static void ymodem_waitc1_do(YMODEM_OBJECT *object)
736875 /* 'C'であれば状態遷移 */
737876 if (YMODEM_C == buf)
738877 {
739- ymodem_object_trans(object, YMODEM_TRANS_SENDINFO);
878+ ymodem_object_trans(object, YMODEM_STATE_SENDINFO);
740879 }
741880 }
742881
@@ -803,7 +942,7 @@ static void ymodem_sendinfo_do(YMODEM_OBJECT *object)
803942 if (FALSE != result)
804943 {
805944 /* ファイル情報ACK待ち */
806- ymodem_object_trans(object, YMODEM_TRANS_INFOACK);
945+ ymodem_object_trans(object, YMODEM_STATE_INFOACK);
807946 }
808947 }
809948
@@ -847,7 +986,7 @@ static void ymodem_infoack_do(YMODEM_OBJECT *object)
847986 {
848987 /* ACKは状態遷移 */
849988 case YMODEM_ACK:
850- ymodem_object_trans(object, YMODEM_TRANS_WAITC2);
989+ ymodem_object_trans(object, YMODEM_STATE_WAITC2);
851990 break;
852991
853992 /* NAKはリトライチェック */
@@ -862,7 +1001,7 @@ static void ymodem_infoack_do(YMODEM_OBJECT *object)
8621001 else
8631002 {
8641003 /* ファイル情報を再送 */
865- ymodem_object_trans(object, YMODEM_TRANS_SENDINFO);
1004+ ymodem_object_trans(object, YMODEM_STATE_SENDINFO);
8661005 }
8671006 break;
8681007
@@ -915,11 +1054,11 @@ static void ymodem_waitc2_do(YMODEM_OBJECT *object)
9151054 {
9161055 if (0 < object->file_size)
9171056 {
918- ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
1057+ ymodem_object_trans(object, YMODEM_STATE_SENDDATA);
9191058 }
9201059 else
9211060 {
922- ymodem_object_trans(object, YMODEM_TRANS_SENDEOT);
1061+ ymodem_object_trans(object, YMODEM_STATE_SENDEOT);
9231062 }
9241063 }
9251064 }
@@ -990,7 +1129,7 @@ static void ymodem_senddata_do(YMODEM_OBJECT *object)
9901129 result = ymodem_check_offset(object);
9911130 if (FALSE != result)
9921131 {
993- ymodem_object_trans(object, YMODEM_TRANS_DATAACK);
1132+ ymodem_object_trans(object, YMODEM_STATE_DATAACK);
9941133 }
9951134 }
9961135
@@ -1043,7 +1182,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10431182 object->retry = 0;
10441183
10451184 /* EOT送信 */
1046- ymodem_object_trans(object, YMODEM_TRANS_SENDEOT);
1185+ ymodem_object_trans(object, YMODEM_STATE_SENDEOT);
10471186 }
10481187 else
10491188 {
@@ -1057,7 +1196,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10571196 object->buf_offset += 0x80;
10581197
10591198 /* データブロック送信 */
1060- ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
1199+ ymodem_object_trans(object, YMODEM_STATE_SENDDATA);
10611200 }
10621201 break;
10631202
@@ -1074,7 +1213,7 @@ static void ymodem_dataack_do(YMODEM_OBJECT *object)
10741213 else
10751214 {
10761215 /* データブロックを再送 */
1077- ymodem_object_trans(object, YMODEM_TRANS_SENDDATA);
1216+ ymodem_object_trans(object, YMODEM_STATE_SENDDATA);
10781217 }
10791218 break;
10801219
@@ -1127,7 +1266,7 @@ static void ymodem_sendeot_do(YMODEM_OBJECT *object)
11271266 else
11281267 {
11291268 /* 状態遷移 */
1130- ymodem_object_trans(object, YMODEM_TRANS_EOTACK);
1269+ ymodem_object_trans(object, YMODEM_STATE_EOTACK);
11311270 }
11321271 }
11331272
@@ -1176,9 +1315,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object)
11761315 /* ACK */
11771316 case YMODEM_ACK:
11781317 /* ACKは送信終了 */
1179- object->sending = FALSE;
1180- object->status = YMODEM_SUCCESS;
1181- object->state = YMODEM_TRANS_NONE;
1318+ ymodem_error_success(object);
11821319 break;
11831320
11841321 /* NAK */
@@ -1194,7 +1331,7 @@ static void ymodem_eotack_do(YMODEM_OBJECT *object)
11941331 else
11951332 {
11961333 /* EOTを再送 */
1197- ymodem_object_trans(object, YMODEM_TRANS_SENDEOT);
1334+ ymodem_object_trans(object, YMODEM_STATE_SENDEOT);
11981335 }
11991336 break;
12001337
@@ -1216,6 +1353,90 @@ static void ymodem_eotack_exit(YMODEM_OBJECT *object)
12161353
12171354 /*
12181355 * YMODEM
1356+ * 'C'送信(1)
1357+ * enter
1358+ */
1359+static void ymodem_sendc1_enter(YMODEM_OBJECT *object)
1360+{
1361+}
1362+
1363+/*
1364+ * YMODEM
1365+ * 'C'送信(1)
1366+ * do
1367+ */
1368+static void ymodem_sendc1_do(YMODEM_OBJECT *object)
1369+{
1370+ UINT result;
1371+ BYTE buf;
1372+
1373+ assert(NULL != object);
1374+
1375+ /* C送信 */
1376+ buf = YMODEM_C;
1377+ result = comm_send(object->comm_index, &buf, sizeof(buf));
1378+ if (0 == result)
1379+ {
1380+ /* 書き込みに失敗した */
1381+ ymodem_error_closed(object);
1382+ }
1383+ else
1384+ {
1385+ /* 状態遷移 */
1386+ ymodem_object_trans(object, YMODEM_STATE_WAITSOH);
1387+ }
1388+}
1389+
1390+/*
1391+ * YMODEM
1392+ * 'C'送信(1)
1393+ * exit
1394+ */
1395+static void ymodem_sendc1_exit(YMODEM_OBJECT *object)
1396+{
1397+}
1398+
1399+/*
1400+ * YMODEM
1401+ * SOH送信待ち
1402+ * enter
1403+ */
1404+static void ymodem_waitsoh_enter(YMODEM_OBJECT *object)
1405+{
1406+ /* 開始時間を初期化 */
1407+ object->start_time = timeGetTime();
1408+}
1409+
1410+/*
1411+ * YMODEM
1412+ * SOH送信待ち
1413+ * do
1414+ */
1415+static void ymodem_waitsoh_do(YMODEM_OBJECT *object)
1416+{
1417+ BYTE buf;
1418+
1419+ /* 受信時の受信キャラクタ待ち */
1420+ buf = ymodem_wait_recv(object);
1421+
1422+ /* SOHであれば状態遷移 */
1423+ if (YMODEM_SOH == buf)
1424+ {
1425+ ymodem_object_trans(object, YMODEM_STATE_SENDINFO);
1426+ }
1427+}
1428+
1429+/*
1430+ * YMODEM
1431+ * SOH送信待ち
1432+ * exit
1433+ */
1434+static void ymodem_waitsoh_exit(YMODEM_OBJECT *object)
1435+{
1436+}
1437+
1438+/*
1439+ * YMODEM
12191440 * オブジェクト状態遷移要求
12201441 */
12211442 static void ymodem_object_trans(YMODEM_OBJECT *object, UINT state)
@@ -1226,48 +1447,58 @@ static void ymodem_object_trans(YMODEM_OBJECT *object, UINT state)
12261447 switch (object->state)
12271448 {
12281449 /* 初期状態 */
1229- case YMODEM_TRANS_NONE:
1450+ case YMODEM_STATE_NONE:
12301451 break;
12311452
12321453 /* 受信側の'C'送信待ち(1) */
1233- case YMODEM_TRANS_WAITC1:
1454+ case YMODEM_STATE_WAITC1:
12341455 ymodem_waitc1_exit(object);
12351456 break;
12361457
12371458 /* ファイル情報の送信 */
1238- case YMODEM_TRANS_SENDINFO:
1459+ case YMODEM_STATE_SENDINFO:
12391460 ymodem_sendinfo_exit(object);
12401461 break;
12411462
12421463 /* ファイル情報ACK待ち */
1243- case YMODEM_TRANS_INFOACK:
1464+ case YMODEM_STATE_INFOACK:
12441465 ymodem_infoack_exit(object);
12451466 break;
12461467
12471468 /* 受信側の'C'送信待ち(2) */
1248- case YMODEM_TRANS_WAITC2:
1469+ case YMODEM_STATE_WAITC2:
12491470 ymodem_waitc2_exit(object);
12501471 break;
12511472
12521473 /* データブロック送信 */
1253- case YMODEM_TRANS_SENDDATA:
1474+ case YMODEM_STATE_SENDDATA:
12541475 ymodem_senddata_exit(object);
12551476 break;
12561477
12571478 /* データブロックACK待ち */
1258- case YMODEM_TRANS_DATAACK:
1479+ case YMODEM_STATE_DATAACK:
12591480 ymodem_dataack_exit(object);
12601481 break;
12611482
12621483 /* EOT送信 */
1263- case YMODEM_TRANS_SENDEOT:
1484+ case YMODEM_STATE_SENDEOT:
12641485 ymodem_sendeot_exit(object);
12651486 break;
12661487
12671488 /* EOTに対するACK待ち */
1268- case YMODEM_TRANS_EOTACK:
1489+ case YMODEM_STATE_EOTACK:
12691490 ymodem_eotack_exit(object);
12701491 break;
1492+
1493+ /* 'C'送信(1) */
1494+ case YMODEM_STATE_SENDC1:
1495+ ymodem_sendc1_exit(object);
1496+ break;
1497+
1498+ /* SOH送信待ち */
1499+ case YMODEM_STATE_WAITSOH:
1500+ ymodem_waitsoh_exit(object);
1501+ break;
12711502 }
12721503
12731504 /* 状態変更 */
@@ -1277,44 +1508,54 @@ static void ymodem_object_trans(YMODEM_OBJECT *object, UINT state)
12771508 switch (object->state)
12781509 {
12791510 /* 受信側の'C'送信待ち(1) */
1280- case YMODEM_TRANS_WAITC1:
1511+ case YMODEM_STATE_WAITC1:
12811512 ymodem_waitc1_enter(object);
12821513 break;
12831514
12841515 /* ファイル情報の送信 */
1285- case YMODEM_TRANS_SENDINFO:
1516+ case YMODEM_STATE_SENDINFO:
12861517 ymodem_sendinfo_enter(object);
12871518 break;
12881519
12891520 /* ファイル情報ACK待ち */
1290- case YMODEM_TRANS_INFOACK:
1521+ case YMODEM_STATE_INFOACK:
12911522 ymodem_infoack_enter(object);
12921523 break;
12931524
12941525 /* 受信側の'C'送信待ち(2) */
1295- case YMODEM_TRANS_WAITC2:
1526+ case YMODEM_STATE_WAITC2:
12961527 ymodem_waitc2_enter(object);
12971528 break;
12981529
12991530 /* データブロック送信 */
1300- case YMODEM_TRANS_SENDDATA:
1531+ case YMODEM_STATE_SENDDATA:
13011532 ymodem_senddata_enter(object);
13021533 break;
13031534
13041535 /* データブロックACK待ち */
1305- case YMODEM_TRANS_DATAACK:
1536+ case YMODEM_STATE_DATAACK:
13061537 ymodem_dataack_enter(object);
13071538 break;
13081539
13091540 /* EOT送信 */
1310- case YMODEM_TRANS_SENDEOT:
1541+ case YMODEM_STATE_SENDEOT:
13111542 ymodem_sendeot_enter(object);
13121543 break;
13131544
13141545 /* EOTに対するACK待ち */
1315- case YMODEM_TRANS_EOTACK:
1546+ case YMODEM_STATE_EOTACK:
13161547 ymodem_eotack_enter(object);
13171548 break;
1549+
1550+ /* 'C'送信(1) */
1551+ case YMODEM_STATE_SENDC1:
1552+ ymodem_sendc1_enter(object);
1553+ break;
1554+
1555+ /* SOH送信待ち */
1556+ case YMODEM_STATE_WAITSOH:
1557+ ymodem_waitsoh_enter(object);
1558+ break;
13181559 }
13191560 }
13201561
@@ -1333,48 +1574,58 @@ static void ymodem_object_idle(YMODEM_OBJECT *object)
13331574 }
13341575
13351576 /* do処理 */
1336- assert(YMODEM_TRANS_NONE != object->state);
1577+ assert(YMODEM_STATE_NONE != object->state);
13371578 switch (object->state)
13381579 {
13391580 /* 受信側の'C'送信待ち(1) */
1340- case YMODEM_TRANS_WAITC1:
1581+ case YMODEM_STATE_WAITC1:
13411582 ymodem_waitc1_do(object);
13421583 break;
13431584
13441585 /* ファイル情報の送信 */
1345- case YMODEM_TRANS_SENDINFO:
1586+ case YMODEM_STATE_SENDINFO:
13461587 ymodem_sendinfo_do(object);
13471588 break;
13481589
13491590 /* ファイル情報ACK待ち */
1350- case YMODEM_TRANS_INFOACK:
1591+ case YMODEM_STATE_INFOACK:
13511592 ymodem_infoack_do(object);
13521593 break;
13531594
13541595 /* 受信側の'C'送信待ち(2) */
1355- case YMODEM_TRANS_WAITC2:
1596+ case YMODEM_STATE_WAITC2:
13561597 ymodem_waitc2_do(object);
13571598 break;
13581599
13591600 /* データブロック送信 */
1360- case YMODEM_TRANS_SENDDATA:
1601+ case YMODEM_STATE_SENDDATA:
13611602 ymodem_senddata_do(object);
13621603 break;
13631604
13641605 /* データブロックACK待ち */
1365- case YMODEM_TRANS_DATAACK:
1606+ case YMODEM_STATE_DATAACK:
13661607 ymodem_dataack_do(object);
13671608 break;
13681609
13691610 /* EOT送信 */
1370- case YMODEM_TRANS_SENDEOT:
1611+ case YMODEM_STATE_SENDEOT:
13711612 ymodem_sendeot_do(object);
13721613 break;
13731614
1374- /* EOTに対するACK待ち */
1375- case YMODEM_TRANS_EOTACK:
1615+ /* EOTに対するACK待ち */
1616+ case YMODEM_STATE_EOTACK:
13761617 ymodem_eotack_do(object);
13771618 break;
1619+
1620+ /* 'C'送信(1) */
1621+ case YMODEM_STATE_SENDC1:
1622+ ymodem_sendc1_do(object);
1623+ break;
1624+
1625+ /* SOH送信待ち */
1626+ case YMODEM_STATE_WAITSOH:
1627+ ymodem_waitsoh_do(object);
1628+ break;
13781629 }
13791630 }
13801631
@@ -1435,7 +1686,51 @@ static BOOL ymodem_object_send(YMODEM_OBJECT *object, const char *filename, UINT
14351686 object->file_size = filesize;
14361687
14371688 /* 状態遷移 */
1438- ymodem_object_trans(object, YMODEM_TRANS_WAITC1);
1689+ ymodem_object_trans(object, YMODEM_STATE_WAITC1);
1690+
1691+ /* 成功 */
1692+ return TRUE;
1693+}
1694+
1695+/*
1696+ * YMODEM
1697+ * オブジェクト受信開始
1698+ */
1699+static BOOL ymodem_object_recv(YMODEM_OBJECT *object)
1700+{
1701+ BOOL result;
1702+
1703+ assert(NULL != object);
1704+
1705+ /* 送信中または受信中であればエラー */
1706+ assert((FALSE == object->sending) && (FALSE == object->receiving));
1707+ if ((FALSE != object->sending) || (FALSE != object->receiving))
1708+ {
1709+ /* 送信中または受信中である */
1710+ return FALSE;
1711+ }
1712+
1713+ /* 通信ポートがオープンできなければエラー */
1714+ result = comm_open(object->comm_index);
1715+ if (FALSE == result)
1716+ {
1717+ return FALSE;
1718+ }
1719+
1720+ /* 受信中 */
1721+ object->receiving = TRUE;
1722+
1723+ /* BUSY */
1724+ object->status = YMODEM_BUSY;
1725+
1726+ /* 受信バッファの読み捨て */
1727+ ymodem_discard_recv(object);
1728+
1729+ /* リトライ回数を初期化 */
1730+ object->retry = 0;
1731+
1732+ /* 状態遷移 */
1733+ ymodem_object_trans(object, YMODEM_STATE_SENDC1);
14391734
14401735 /* 成功 */
14411736 return TRUE;
@@ -1528,49 +1823,59 @@ static void ymodem_object_monitor(YMODEM_OBJECT *object)
15281823 switch (object->state)
15291824 {
15301825 /* 初期状態 */
1531- case YMODEM_TRANS_NONE:
1826+ case YMODEM_STATE_NONE:
15321827 monitor_printf("内部状態 初期状態\n");
15331828 break;
15341829
15351830 /* 受信側の'C'送信待ち(1) */
1536- case YMODEM_TRANS_WAITC1:
1831+ case YMODEM_STATE_WAITC1:
15371832 monitor_printf("内部状態 受信側の'C'送信待ち(1)\n");
15381833 break;
15391834
15401835 /* ファイル情報送信 */
1541- case YMODEM_TRANS_SENDINFO:
1836+ case YMODEM_STATE_SENDINFO:
15421837 monitor_printf("内部状態 ファイル情報送信\n");
15431838 break;
15441839
15451840 /* ファイル情報ACK待ち */
1546- case YMODEM_TRANS_INFOACK:
1841+ case YMODEM_STATE_INFOACK:
15471842 monitor_printf("内部状態 ファイル情報ACK待ち\n");
15481843 break;
15491844
15501845 /* 受信側の'C'送信待ち(2) */
1551- case YMODEM_TRANS_WAITC2:
1846+ case YMODEM_STATE_WAITC2:
15521847 monitor_printf("内部状態 受信側の'C'送信待ち(2)\n");
15531848 break;
15541849
15551850 /* データブロック送信 */
1556- case YMODEM_TRANS_SENDDATA:
1851+ case YMODEM_STATE_SENDDATA:
15571852 monitor_printf("内部状態 データブロック送信\n");
15581853 break;
15591854
15601855 /* データブロックACK待ち */
1561- case YMODEM_TRANS_DATAACK:
1856+ case YMODEM_STATE_DATAACK:
15621857 monitor_printf("内部状態 データブロックACK待ち\n");
15631858 break;
15641859
15651860 /* EOT送信 */
1566- case YMODEM_TRANS_SENDEOT:
1861+ case YMODEM_STATE_SENDEOT:
15671862 monitor_printf("内部状態 EOT送信\n");
15681863 break;
15691864
15701865 /* EOTに対するACK待ち */
1571- case YMODEM_TRANS_EOTACK:
1866+ case YMODEM_STATE_EOTACK:
15721867 monitor_printf("内部状態 EOTに対するACK待ち\n");
15731868 break;
1869+
1870+ /* 'C'送信(1) */
1871+ case YMODEM_STATE_SENDC1:
1872+ monitor_printf("内部状態 'C'送信(1)\n");
1873+ break;
1874+
1875+ /* SOH送信待ち */
1876+ case YMODEM_STATE_WAITSOH:
1877+ monitor_printf("内部状態 SOH送信待ち\n");
1878+ break;
15741879 }
15751880
15761881 /* ブロック番号 */
@@ -1636,7 +1941,8 @@ BOOL ymodem_send(const char* filename, UINT filesize)
16361941 */
16371942 BOOL ymodem_recv(void)
16381943 {
1639- return FALSE;
1944+ /* オブジェクト受信開始 */
1945+ return ymodem_object_recv(&g_ymodem_object);
16401946 }
16411947
16421948 /*
--- a/DebugMonitor/src/comm/ymodem.h
+++ b/DebugMonitor/src/comm/ymodem.h
@@ -8,17 +8,29 @@
88 #pragma once
99
1010 /*
11- * 定数
11+ * ステータス
1212 */
1313
14-/* ステータス */
15-#define YMODEM_SUCCESS 0 /* 成功 */
16-#define YMODEM_BUSY 1 /* 動作中 */
17-#define YMODEM_SIZEOVER 2 /* バッファサイズ溢れ */
18-#define YMODEM_TIMEOUT 3 /* タイムアウト */
19-#define YMODEM_RETRY 4 /* リトライオーバー */
20-#define YMODEM_CANCEL 5 /* キャンセル要求受信 */
21-#define YMODEM_CLOSED 6 /* ポートクローズ */
14+/* 成功 */
15+#define YMODEM_SUCCESS 0
16+
17+/* 動作中 */
18+#define YMODEM_BUSY 1
19+
20+/* バッファサイズ溢れ */
21+#define YMODEM_SIZEOVER 2
22+
23+/* タイムアウト */
24+#define YMODEM_TIMEOUT 3
25+
26+/* リトライオーバー */
27+#define YMODEM_RETRY 4
28+
29+/* キャンセル要求受信 */
30+#define YMODEM_CANCEL 5
31+
32+/* ポートクローズ */
33+#define YMODEM_CLOSED 6
2234
2335 /*
2436 * グローバル関数
--- a/DebugMonitor/src/framework/winmain.c
+++ b/DebugMonitor/src/framework/winmain.c
@@ -13,6 +13,7 @@
1313 #include "comm.h"
1414 #include "ymodem.h"
1515 #include "app.h"
16+#include "resource.h"
1617 #include "winmain.h"
1718
1819 /*
@@ -298,7 +299,7 @@ static BOOL OnCreateFont(HWND hWnd)
298299 * WinMain
299300 * WM_CREATEメッセージハンドラ
300301 */
301-static BOOL OnCreate(HWND hWnd, const CREATESTRUCT *lpcs)
302+static BOOL OnCreate(HWND hWnd)
302303 {
303304 BOOL bResult;
304305 int x;
@@ -307,7 +308,6 @@ static BOOL OnCreate(HWND hWnd, const CREATESTRUCT *lpcs)
307308 int height;
308309
309310 assert(NULL != hWnd);
310- assert(NULL != lpcs);
311311
312312 /* フォントを作成 */
313313 if (FALSE == OnCreateFont(hWnd))
@@ -440,6 +440,73 @@ static void OnSize(HWND hWnd)
440440
441441 /*
442442 * WinMain
443+ * バージョン情報ダイアログプロシージャ
444+ */
445+static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
446+{
447+ RECT rect;
448+ RECT rectParent;
449+ int x;
450+ int y;
451+
452+ switch (message)
453+ {
454+ /* ダイアログの初期化 */
455+ case WM_INITDIALOG:
456+ /* ダイアログと親ウィンドウの矩形を取得 */
457+ GetWindowRect(hDlg, &rect);
458+ GetWindowRect(GetParent(hDlg), &rectParent);
459+
460+ /* 親ウィンドウの中央になるように位置を設定 */
461+ x = ((rectParent.left + rectParent.right) / 2) - ((rect.right - rect.left) / 2);
462+ y = ((rectParent.top + rectParent.bottom) / 2) - ((rect.bottom - rect.top) / 2);
463+ SetWindowPos(hDlg, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
464+ return TRUE;
465+
466+ /* コマンド */
467+ case WM_COMMAND:
468+ switch (LOWORD(wParam))
469+ {
470+ case IDOK:
471+ case IDCANCEL:
472+ EndDialog(hDlg, 0);
473+ return TRUE;
474+ }
475+ break;
476+ }
477+
478+ /* その他のメッセージ */
479+ return FALSE;
480+}
481+
482+/*
483+ * WinMain
484+ * WM_COMMANDメッセージハンドラ
485+ */
486+static void OnCommand(HWND hWnd, WORD wID)
487+{
488+ assert(NULL != hWnd);
489+
490+ switch (wID)
491+ {
492+ /* ファイル(F)-終了(X) */
493+ case IDM_EXIT:
494+ PostMessage(hWnd, WM_CLOSE, 0, 0);
495+ break;
496+
497+ /* ヘルプ(H)-バージョン情報(A) */
498+ case IDM_ABOUT:
499+ DialogBox(g_hAppInstance, MAKEINTRESOURCE(IDD_ABOUTDIALOG), hWnd, AboutDialogProc);
500+ break;
501+
502+ /* その他 */
503+ default:
504+ break;
505+ }
506+}
507+
508+/*
509+ * WinMain
443510 * WM_ACTIVATEメッセージハンドラ
444511 */
445512 static void OnActivate(HWND hWnd)
@@ -529,7 +596,6 @@ static void OnKeyDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
529596 */
530597 static LRESULT CALLBACK FrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
531598 {
532- const CREATESTRUCT *lpcs;
533599 BOOL bResult;
534600
535601 switch (uMsg)
@@ -537,9 +603,7 @@ static LRESULT CALLBACK FrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
537603 /* ウィンドウが作成された */
538604 case WM_CREATE:
539605 /* ハンドラを呼び出す */
540- lpcs = (const CREATESTRUCT *)lParam;
541- assert(NULL != lpcs);
542- bResult = OnCreate(hWnd, lpcs);
606+ bResult = OnCreate(hWnd);
543607
544608 /* ハンドラの結果によって、CreateWindowを失敗させる */
545609 if (FALSE == bResult)
@@ -566,6 +630,15 @@ static LRESULT CALLBACK FrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
566630 OnSize(hWnd);
567631 return 0;
568632
633+ /* コマンドが送信された */
634+ case WM_COMMAND:
635+ /* ハンドラを呼び出す */
636+ if (0 == HIWORD(wParam))
637+ {
638+ OnCommand(hWnd, LOWORD(wParam));
639+ }
640+ return 0;
641+
569642 /* ウィンドウが表示された */
570643 case WM_ACTIVATE:
571644 /* ハンドラを呼び出す */
@@ -715,7 +788,7 @@ static BOOL InitInstance(HINSTANCE hInstance)
715788 CW_USEDEFAULT,
716789 CW_USEDEFAULT,
717790 NULL,
718- NULL,
791+ LoadMenu(g_hAppInstance, MAKEINTRESOURCE(IDR_MAINMENU)),
719792 g_hAppInstance,
720793 NULL);
721794