• 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

M16C/5Mマイコンを使用したCAN動作チェッカー


Commit MetaInfo

Revisionde3126571c9e91b128130c541b3db9ca9751937f (tree)
Time2017-01-09 18:00:32
AuthorYasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

新規作成

Change Summary

Incremental Difference

--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M.sln
@@ -0,0 +1,22 @@
1+
2+Microsoft Visual Studio Solution File, Format Version 12.00
3+# Visual Studio Express 2013 for Windows Desktop
4+VisualStudioVersion = 12.0.40629.0
5+MinimumVisualStudioVersion = 10.0.40219.1
6+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CANTarget5M", "CANTarget5M\CANTarget5M.vcxproj", "{95D4FCF7-8009-4EB9-943A-9088A5CD3EED}"
7+EndProject
8+Global
9+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+ Debug|Win32 = Debug|Win32
11+ Release|Win32 = Release|Win32
12+ EndGlobalSection
13+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+ {95D4FCF7-8009-4EB9-943A-9088A5CD3EED}.Debug|Win32.ActiveCfg = Debug|Win32
15+ {95D4FCF7-8009-4EB9-943A-9088A5CD3EED}.Debug|Win32.Build.0 = Debug|Win32
16+ {95D4FCF7-8009-4EB9-943A-9088A5CD3EED}.Release|Win32.ActiveCfg = Release|Win32
17+ {95D4FCF7-8009-4EB9-943A-9088A5CD3EED}.Release|Win32.Build.0 = Release|Win32
18+ EndGlobalSection
19+ GlobalSection(SolutionProperties) = preSolution
20+ HideSolutionNode = FALSE
21+ EndGlobalSection
22+EndGlobal
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/CANTarget5M.vcxproj
@@ -0,0 +1,103 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+ <ItemGroup Label="ProjectConfigurations">
4+ <ProjectConfiguration Include="Debug|Win32">
5+ <Configuration>Debug</Configuration>
6+ <Platform>Win32</Platform>
7+ </ProjectConfiguration>
8+ <ProjectConfiguration Include="Release|Win32">
9+ <Configuration>Release</Configuration>
10+ <Platform>Win32</Platform>
11+ </ProjectConfiguration>
12+ </ItemGroup>
13+ <PropertyGroup Label="Globals">
14+ <ProjectGuid>{95D4FCF7-8009-4EB9-943A-9088A5CD3EED}</ProjectGuid>
15+ <Keyword>Win32Proj</Keyword>
16+ <RootNamespace>CANTarget5M</RootNamespace>
17+ </PropertyGroup>
18+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
19+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
20+ <ConfigurationType>Application</ConfigurationType>
21+ <UseDebugLibraries>true</UseDebugLibraries>
22+ <PlatformToolset>v120</PlatformToolset>
23+ <CharacterSet>Unicode</CharacterSet>
24+ </PropertyGroup>
25+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
26+ <ConfigurationType>Application</ConfigurationType>
27+ <UseDebugLibraries>false</UseDebugLibraries>
28+ <PlatformToolset>v120</PlatformToolset>
29+ <WholeProgramOptimization>true</WholeProgramOptimization>
30+ <CharacterSet>Unicode</CharacterSet>
31+ </PropertyGroup>
32+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
33+ <ImportGroup Label="ExtensionSettings">
34+ </ImportGroup>
35+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
36+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
37+ </ImportGroup>
38+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
39+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
40+ </ImportGroup>
41+ <PropertyGroup Label="UserMacros" />
42+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
43+ <LinkIncremental>true</LinkIncremental>
44+ </PropertyGroup>
45+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
46+ <LinkIncremental>false</LinkIncremental>
47+ </PropertyGroup>
48+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
49+ <ClCompile>
50+ <PrecompiledHeader>
51+ </PrecompiledHeader>
52+ <WarningLevel>Level4</WarningLevel>
53+ <Optimization>Disabled</Optimization>
54+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
55+ </ClCompile>
56+ <Link>
57+ <SubSystem>Windows</SubSystem>
58+ <GenerateDebugInformation>true</GenerateDebugInformation>
59+ <AdditionalDependencies>setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
60+ </Link>
61+ </ItemDefinitionGroup>
62+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
63+ <ClCompile>
64+ <WarningLevel>Level3</WarningLevel>
65+ <PrecompiledHeader>
66+ </PrecompiledHeader>
67+ <Optimization>MaxSpeed</Optimization>
68+ <FunctionLevelLinking>true</FunctionLevelLinking>
69+ <IntrinsicFunctions>true</IntrinsicFunctions>
70+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
71+ </ClCompile>
72+ <Link>
73+ <SubSystem>Windows</SubSystem>
74+ <GenerateDebugInformation>true</GenerateDebugInformation>
75+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
76+ <OptimizeReferences>true</OptimizeReferences>
77+ <AdditionalDependencies>setupapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
78+ </Link>
79+ </ItemDefinitionGroup>
80+ <ItemGroup>
81+ <ClCompile Include="Source\CommCommand.cpp" />
82+ <ClCompile Include="Source\CommDevice.cpp" />
83+ <ClCompile Include="Source\CommDeviceList.cpp" />
84+ <ClCompile Include="Source\LogListBox.cpp" />
85+ <ClCompile Include="Source\SampleApp.c" />
86+ <ClCompile Include="Source\WinMain.cpp" />
87+ </ItemGroup>
88+ <ItemGroup>
89+ <ResourceCompile Include="Source\resource.rc" />
90+ </ItemGroup>
91+ <ItemGroup>
92+ <ClInclude Include="Source\CommCommand.h" />
93+ <ClInclude Include="Source\CommDevice.h" />
94+ <ClInclude Include="Source\CommDeviceList.h" />
95+ <ClInclude Include="Source\Helper.h" />
96+ <ClInclude Include="Source\LogListBox.h" />
97+ <ClInclude Include="Source\resource.h" />
98+ <ClInclude Include="Source\StdAfx.h" />
99+ </ItemGroup>
100+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
101+ <ImportGroup Label="ExtensionTargets">
102+ </ImportGroup>
103+</Project>
\ No newline at end of file
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/CANTarget5M.vcxproj.filters
@@ -0,0 +1,65 @@
1+<?xml version="1.0" encoding="utf-8"?>
2+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+ <ItemGroup>
4+ <Filter Include="ソース ファイル">
5+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
6+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
7+ </Filter>
8+ <Filter Include="ヘッダー ファイル">
9+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
10+ <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
11+ </Filter>
12+ <Filter Include="リソース ファイル">
13+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
14+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
15+ </Filter>
16+ </ItemGroup>
17+ <ItemGroup>
18+ <ClCompile Include="Source\WinMain.cpp">
19+ <Filter>ソース ファイル</Filter>
20+ </ClCompile>
21+ <ClCompile Include="Source\CommDevice.cpp">
22+ <Filter>ソース ファイル</Filter>
23+ </ClCompile>
24+ <ClCompile Include="Source\CommDeviceList.cpp">
25+ <Filter>ソース ファイル</Filter>
26+ </ClCompile>
27+ <ClCompile Include="Source\LogListBox.cpp">
28+ <Filter>ソース ファイル</Filter>
29+ </ClCompile>
30+ <ClCompile Include="Source\CommCommand.cpp">
31+ <Filter>ソース ファイル</Filter>
32+ </ClCompile>
33+ <ClCompile Include="Source\SampleApp.c">
34+ <Filter>ソース ファイル</Filter>
35+ </ClCompile>
36+ </ItemGroup>
37+ <ItemGroup>
38+ <ResourceCompile Include="Source\resource.rc">
39+ <Filter>リソース ファイル</Filter>
40+ </ResourceCompile>
41+ </ItemGroup>
42+ <ItemGroup>
43+ <ClInclude Include="Source\CommDevice.h">
44+ <Filter>ヘッダー ファイル</Filter>
45+ </ClInclude>
46+ <ClInclude Include="Source\CommDeviceList.h">
47+ <Filter>ヘッダー ファイル</Filter>
48+ </ClInclude>
49+ <ClInclude Include="Source\LogListBox.h">
50+ <Filter>ヘッダー ファイル</Filter>
51+ </ClInclude>
52+ <ClInclude Include="Source\resource.h">
53+ <Filter>ヘッダー ファイル</Filter>
54+ </ClInclude>
55+ <ClInclude Include="Source\StdAfx.h">
56+ <Filter>ヘッダー ファイル</Filter>
57+ </ClInclude>
58+ <ClInclude Include="Source\CommCommand.h">
59+ <Filter>ヘッダー ファイル</Filter>
60+ </ClInclude>
61+ <ClInclude Include="Source\Helper.h">
62+ <Filter>ヘッダー ファイル</Filter>
63+ </ClInclude>
64+ </ItemGroup>
65+</Project>
\ No newline at end of file
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommCommand.cpp
@@ -0,0 +1,566 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ COMコマンド ]
6+//
7+
8+#include "StdAfx.h"
9+#include "CommDeviceList.h"
10+#include "CommCommand.h"
11+
12+//
13+// 定数定義
14+//
15+#define COMM_COMMAND_TIMEOUT (100)
16+ // タイムアウト(ms)
17+#define COMM_COMMAND_RETRY (3)
18+ // リトライ回数
19+#define COMM_OFFSET_STX0 (0)
20+ // STX0(0x5A)
21+#define COMM_OFFSET_STX1 (1)
22+ // STX1(0xA5)
23+#define COMM_OFFSET_CMD_LEN (2)
24+ // コマンド(上位4bit)+レングス(下位4bit)
25+#define COMM_OFFSET_DATA0 (3)
26+ // データ0
27+#define COMM_OFFSET_DATA1 (4)
28+ // データ1
29+#define COMM_OFFSET_DATA2 (5)
30+ // データ2
31+#define COMM_OFFSET_DATA3 (6)
32+ // データ3
33+#define COMM_OFFSET_DATA4 (7)
34+ // データ4
35+#define COMM_OFFSET_DATA5 (8)
36+ // データ5
37+#define COMM_COMMAND_NAK (0xF0)
38+ // NAKコマンド
39+
40+//
41+// CommCommand()
42+// コンストラクタ
43+//
44+CommCommand::CommCommand(CommDeviceList* pCommDeviceList)
45+{
46+ // COMデバイスリストを記憶
47+ m_pCommDeviceList = pCommDeviceList;
48+}
49+
50+//
51+// ~CommCommand()
52+// デストラクタ
53+//
54+CommCommand::~CommCommand()
55+{
56+ DeInit();
57+}
58+
59+//
60+// Init()
61+// 初期化
62+//
63+BOOL CommCommand::Init()
64+{
65+ // 初期化はStartCmd()で行うため、何もしない
66+ return TRUE;
67+}
68+
69+//
70+// DeInit()
71+// 終了
72+//
73+void CommCommand::DeInit()
74+{
75+}
76+
77+//
78+// GetVersion()
79+// バージョン取得
80+//
81+BOOL CommCommand::GetVersion(LPWORD pVersion)
82+{
83+ BOOL bResult;
84+ WORD wVersion;
85+
86+ // コマンド送信
87+ bResult = StartCmd(0, 0);
88+
89+ // 成功すれば、バージョンを格納
90+ if (bResult == TRUE)
91+ {
92+ wVersion = m_byRecvBuf[COMM_OFFSET_DATA0];
93+ wVersion <<= 8;
94+ wVersion |= m_byRecvBuf[COMM_OFFSET_DATA1];
95+
96+ *pVersion = wVersion;
97+ }
98+
99+ return bResult;
100+}
101+
102+//
103+// Read8bit()
104+// 8bit読み込み
105+//
106+BOOL CommCommand::Read8bit(WORD wAddr, LPBYTE pData)
107+{
108+ BOOL bResult;
109+ BYTE byData;
110+
111+ // 送信データ設定
112+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
113+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
114+
115+ // コマンド送信
116+ bResult = StartCmd(1, 2);
117+
118+ // 成功すれば、データ読み取り
119+ if (bResult == TRUE)
120+ {
121+ byData = m_byRecvBuf[COMM_OFFSET_DATA0];
122+
123+ *pData = byData;
124+ }
125+
126+ return bResult;
127+}
128+
129+//
130+// Write8bit()
131+// 8bit書き込み
132+//
133+BOOL CommCommand::Write8bit(WORD wAddr, BYTE byData)
134+{
135+ // 送信データ設定
136+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
137+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
138+ m_bySendBuf[COMM_OFFSET_DATA2] = byData;
139+
140+ // コマンド送信
141+ return StartCmd(2, 3);
142+}
143+
144+//
145+// Read16bit()
146+// 16bit読み込み
147+//
148+BOOL CommCommand::Read16bit(WORD wAddr, LPWORD pData)
149+{
150+ BOOL bResult;
151+ WORD wData;
152+
153+ // 送信データ設定
154+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
155+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
156+
157+ // コマンド送信
158+ bResult = StartCmd(3, 2);
159+
160+ // 成功すれば、データ読み取り
161+ if (bResult == TRUE)
162+ {
163+ wData = (WORD)m_byRecvBuf[COMM_OFFSET_DATA0];
164+ wData <<= 8;
165+ wData |= (WORD)m_byRecvBuf[COMM_OFFSET_DATA1];
166+
167+ *pData = wData;
168+ }
169+
170+ return bResult;
171+}
172+
173+//
174+// Write16bit()
175+// 16bit書き込み
176+//
177+BOOL CommCommand::Write16bit(WORD wAddr, WORD wData)
178+{
179+ // 送信データ設定
180+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
181+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
182+ m_bySendBuf[COMM_OFFSET_DATA2] = (BYTE)(wData >> 8);
183+ m_bySendBuf[COMM_OFFSET_DATA3] = (BYTE)wData;
184+
185+ // コマンド送信
186+ return StartCmd(4, 4);
187+}
188+
189+//
190+// Read32bit()
191+// 32bit読み込み
192+//
193+BOOL CommCommand::Read32bit(WORD wAddr, LPDWORD pData)
194+{
195+ BOOL bResult;
196+ DWORD dwData;
197+
198+ // 送信データ設定
199+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
200+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
201+
202+ // コマンド送信
203+ bResult = StartCmd(5, 2);
204+
205+ // 成功すれば、データ読み取り
206+ if (bResult == TRUE)
207+ {
208+ dwData = (DWORD)m_byRecvBuf[COMM_OFFSET_DATA0];
209+ dwData <<= 8;
210+ dwData |= (DWORD)m_byRecvBuf[COMM_OFFSET_DATA1];
211+ dwData <<= 8;
212+ dwData |= (DWORD)m_byRecvBuf[COMM_OFFSET_DATA2];
213+ dwData <<= 8;
214+ dwData |= (DWORD)m_byRecvBuf[COMM_OFFSET_DATA3];
215+
216+ *pData = dwData;
217+ }
218+
219+ return bResult;
220+}
221+
222+//
223+// Write32bit()
224+// 32bit書き込み
225+//
226+BOOL CommCommand::Write32bit(WORD wAddr, DWORD dwData)
227+{
228+ // 送信データ設定
229+ m_bySendBuf[COMM_OFFSET_DATA0] = (BYTE)(wAddr >> 8);
230+ m_bySendBuf[COMM_OFFSET_DATA1] = (BYTE)wAddr;
231+ m_bySendBuf[COMM_OFFSET_DATA2] = (BYTE)(dwData >> 24);
232+ m_bySendBuf[COMM_OFFSET_DATA3] = (BYTE)(dwData >> 16);
233+ m_bySendBuf[COMM_OFFSET_DATA4] = (BYTE)(dwData >> 8);
234+ m_bySendBuf[COMM_OFFSET_DATA5] = (BYTE)dwData;
235+
236+ // コマンド送信
237+ return StartCmd(6, 6);
238+}
239+
240+//
241+// StartCmd()
242+// コマンド開始
243+//
244+BOOL CommCommand::StartCmd(UINT uCmd, UINT uLen)
245+{
246+ BYTE bySum;
247+ UINT uLoop;
248+
249+ // STXを格納
250+ m_bySendBuf[COMM_OFFSET_STX0] = 0x5A;
251+ m_bySendBuf[COMM_OFFSET_STX1] = 0xA5;
252+
253+ // コマンド&レングスを格納
254+ m_bySendBuf[COMM_OFFSET_CMD_LEN] = (BYTE)((uCmd << 4) | uLen);
255+ uLen += 3;
256+
257+ // チェックサムを算出
258+ bySum = 0;
259+ for (uLoop=0; uLoop < uLen; uLoop++)
260+ {
261+ bySum += m_bySendBuf[uLoop];
262+ }
263+
264+ // チェックサムを格納
265+ m_bySendBuf[uLen] = bySum;
266+
267+ // 受信リングバッファ
268+ m_dwHead = 0;
269+ m_dwTail = 0;
270+ m_dwNum = 0;
271+
272+ // コマンド番号
273+ m_uCmdNum = uCmd;
274+
275+ // リトライ回数
276+ m_uRetry = 0;
277+
278+ // コマンドメイン
279+ return CmdMain();
280+}
281+
282+//
283+// CmdMain()
284+// コマンドメイン
285+//
286+BOOL CommCommand::CmdMain()
287+{
288+ BOOL bResult;
289+
290+ // bResultを失敗で初期化
291+ bResult = FALSE;
292+
293+ // リトライループ
294+ while (m_uRetry < COMM_COMMAND_RETRY)
295+ {
296+ // リトライ開始(送信)
297+ bResult = StartRetry();
298+ if (bResult == FALSE)
299+ {
300+ // 送信失敗
301+ break;
302+ }
303+
304+ // 受信待ち
305+ bResult = WaitReply();
306+ if (bResult == TRUE)
307+ {
308+ // 返信OK
309+ break;
310+ }
311+ }
312+
313+ return bResult;
314+}
315+
316+//
317+// StartRetry()
318+// リトライ開始
319+//
320+BOOL CommCommand::StartRetry()
321+{
322+ DWORD dwBytes;
323+ BOOL bResult;
324+
325+ // 送信バイト数を取得
326+ dwBytes = (DWORD)m_bySendBuf[COMM_OFFSET_CMD_LEN];
327+ dwBytes &= 0x0f;
328+ dwBytes += 4;
329+
330+ // 送信
331+ bResult = m_pCommDeviceList->Write(m_bySendBuf, dwBytes);
332+
333+ // ティックカウント取得
334+ m_dwTickCount = GetTickCount();
335+
336+ return bResult;
337+}
338+
339+//
340+// WaitReply()
341+// 返信待ち
342+//
343+BOOL CommCommand::WaitReply()
344+{
345+ DWORD dwDiff;
346+ DWORD dwRecv;
347+ DWORD dwLen;
348+ UINT uCmd;
349+
350+ // 無限ループ
351+ for (;;)
352+ {
353+ // タイムアウト判定
354+ dwDiff = (DWORD)(GetTickCount() - m_dwTickCount);
355+ if (dwDiff >= COMM_COMMAND_TIMEOUT)
356+ {
357+ break;
358+ }
359+
360+ // ストレートバッファを経由してリングバッファへ挿入
361+ dwRecv = m_pCommDeviceList->Read(m_byRecvBuf, sizeof(m_byRecvBuf));
362+ if (dwRecv > 0)
363+ {
364+ // 挿入
365+ Insert(m_byRecvBuf, dwRecv);
366+ }
367+
368+ // リングバッファからストレートバッファへ取得
369+ dwRecv = Get(m_byRecvBuf, sizeof(m_byRecvBuf));
370+
371+ // 最低2バイトが必要(STX)
372+ if (dwRecv >= 2)
373+ {
374+ // STXのチェック
375+ if ((m_byRecvBuf[COMM_OFFSET_STX0] == 0x5A) || (m_byRecvBuf[COMM_OFFSET_STX1] == 0xA5))
376+ {
377+ // 最低4バイトが必要(コマンドレングスとチェックサム)
378+ if (dwRecv >= 4)
379+ {
380+ // レングスを取得
381+ dwLen = m_byRecvBuf[COMM_OFFSET_CMD_LEN];
382+ dwLen &= 0x0f;
383+ dwLen += 4;
384+
385+ // レングスが足りているか
386+ if (dwRecv >= dwLen)
387+ {
388+ // チェックサムの検査
389+ if (IsEqualSum(dwLen - 1) == TRUE)
390+ {
391+ // コマンドが正しいか
392+ uCmd = (UINT)m_byRecvBuf[COMM_OFFSET_CMD_LEN];
393+ uCmd >>= 4;
394+
395+ if (uCmd == m_uCmdNum)
396+ {
397+ // STX, チェックサム, コマンドが全てOK
398+ return TRUE;
399+ }
400+ else
401+ {
402+ // コマンドが不一致(おそらくはNAK)
403+ Discard(dwLen);
404+ return FALSE;
405+ }
406+ }
407+ else
408+ {
409+ // チェックサムが不一致
410+ Discard(dwLen);
411+ return FALSE;
412+ }
413+ }
414+ }
415+ }
416+ else
417+ {
418+ // STXが異なる。受信バッファを1バイトだけ廃棄
419+ Discard(1);
420+ }
421+ }
422+
423+ // スリープ
424+ Sleep(1);
425+ }
426+
427+ // タイムアウト
428+ return FALSE;
429+}
430+
431+//
432+// IsEqualSum()
433+// チェックサム検査
434+//
435+BOOL CommCommand::IsEqualSum(DWORD dwLen)
436+{
437+ BYTE bySum;
438+ DWORD dwLoop;
439+
440+ // チェックサムを算出
441+ bySum = 0;
442+ for (dwLoop=0; dwLoop < dwLen; dwLoop++)
443+ {
444+ bySum += m_byRecvBuf[dwLoop];
445+ }
446+
447+ // チェックサム比較
448+ if (m_byRecvBuf[dwLen] == bySum)
449+ {
450+ return TRUE;
451+ }
452+ else
453+ {
454+ return FALSE;
455+ }
456+}
457+
458+//
459+// Insert()
460+// リングバッファへ挿入
461+//
462+void CommCommand::Insert(const LPBYTE pData, DWORD dwBytes)
463+{
464+ DWORD dwRest;
465+
466+ // リングバッファをまたぐか判断
467+ if ((m_dwTail + dwBytes) > sizeof(m_byRingBuf))
468+ {
469+ // 2回に分けて挿入
470+ dwRest = (m_dwTail + dwBytes) - sizeof(m_byRingBuf);
471+ dwBytes -= dwRest;
472+ }
473+ else
474+ {
475+ // 1回で挿入
476+ dwRest = 0;
477+ }
478+
479+ // 1回目
480+ memcpy(&m_byRingBuf[m_dwTail], &pData[0], dwBytes);
481+ m_dwTail += dwBytes;
482+ if (m_dwTail == sizeof(m_byRingBuf))
483+ {
484+ m_dwTail = 0;
485+ }
486+ m_dwNum += dwBytes;
487+
488+ // 2回目
489+ if (dwRest > 0)
490+ {
491+ memcpy(&m_byRingBuf[0], &pData[dwBytes], dwRest);
492+ m_dwTail = dwRest;
493+ m_dwNum += dwRest;
494+ }
495+
496+ // m_dwNumが上限に達した場合
497+ if (m_dwNum >= sizeof(m_byRingBuf))
498+ {
499+ m_dwNum = sizeof(m_byRingBuf);
500+ m_dwHead = m_dwTail;
501+ }
502+}
503+
504+//
505+// Get()
506+// リングバッファから取得
507+//
508+DWORD CommCommand::Get(LPBYTE pData, DWORD dwMaxBytes)
509+{
510+ DWORD dwBytes;
511+ DWORD dwRest;
512+
513+ // dwMaxBytesとm_dwNumを比較し、より少ない方
514+ dwBytes = m_dwNum;
515+ if (dwBytes < dwMaxBytes)
516+ {
517+ dwBytes = dwMaxBytes;
518+ }
519+
520+ // リングバッファをまたぐか判断
521+ if ((m_dwHead + dwBytes) > sizeof(m_byRingBuf))
522+ {
523+ // 2回に分けて挿入
524+ dwRest = (m_dwHead + dwBytes) - sizeof(m_byRingBuf);
525+ dwBytes -= dwRest;
526+ }
527+ else
528+ {
529+ // 1回で挿入
530+ dwRest = 0;
531+ }
532+
533+ // 1回目
534+ memcpy(&pData[0], &m_byRingBuf[m_dwHead], dwBytes);
535+
536+ // 2回目
537+ if (dwRest > 0)
538+ {
539+ memcpy(&pData[dwBytes], &m_byRingBuf[0], dwRest);
540+ }
541+
542+ return (dwBytes + dwRest);
543+}
544+
545+//
546+// Discard()
547+// リングバッファから廃棄
548+//
549+void CommCommand::Discard(DWORD dwBytes)
550+{
551+ // dwBytesとNumのうち、より小さい方
552+ if (m_dwNum < dwBytes)
553+ {
554+ dwBytes = m_dwNum;
555+ }
556+
557+ // Headを加算
558+ m_dwHead += dwBytes;
559+ if (m_dwHead >= sizeof(m_byRingBuf))
560+ {
561+ m_dwHead -= sizeof(m_byRingBuf);
562+ }
563+
564+ // Numを減算
565+ m_dwNum -= dwBytes;
566+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommCommand.h
@@ -0,0 +1,82 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ COMコマンド ]
6+//
7+
8+#pragma once
9+
10+class CommDeviceList;
11+
12+//
13+// COMコマンド
14+//
15+class CommCommand
16+{
17+public:
18+ // 初期化および終了
19+ CommCommand(CommDeviceList *pCommDeviceList);
20+ // コンストラクタ
21+ virtual ~CommCommand();
22+ // デストラクタ
23+ BOOL Init();
24+ // 初期化
25+ void DeInit();
26+ // 終了
27+
28+ // コマンド
29+ BOOL GetVersion(LPWORD pVersion);
30+ // バージョン取得
31+ BOOL Read8bit(WORD wAddr, LPBYTE pData);
32+ // 8bit読み込み
33+ BOOL Write8bit(WORD wAddr, BYTE byData);
34+ // 8bit書き込み
35+ BOOL Read16bit(WORD wAddr, LPWORD pData);
36+ // 16bit読み込み
37+ BOOL Write16bit(WORD wAddr, WORD wData);
38+ // 16bit書き込み
39+ BOOL Read32bit(WORD wAddr, LPDWORD pData);
40+ // 32bit読み込み
41+ BOOL Write32bit(WORD wAddr, DWORD dwData);
42+ // 32bit書き込み
43+
44+private:
45+ BOOL StartCmd(UINT uCmd, UINT nLen);
46+ // コマンド開始
47+ BOOL CmdMain();
48+ // コマンドメイン
49+ BOOL StartRetry();
50+ // リトライ開始
51+ BOOL WaitReply();
52+ // 返信待ち
53+ BOOL IsEqualSum(DWORD dwLen);
54+ // チェックサム検査
55+ void Insert(const LPBYTE pData, DWORD dwBytes);
56+ // リングバッファへ挿入
57+ DWORD Get(LPBYTE pData, DWORD dwMaxBytes);
58+ // リングバッファから取得
59+ void Discard(DWORD dwBytes);
60+ // リングバッファから廃棄
61+
62+ CommDeviceList* m_pCommDeviceList;
63+ // COMデバイスリスト
64+ BYTE m_bySendBuf[32];
65+ // 送信バッファ
66+ BYTE m_byRingBuf[32];
67+ // 受信リングバッファ
68+ BYTE m_byRecvBuf[32];
69+ // 受信ストレートバッファ
70+ DWORD m_dwHead;
71+ // リングバッファ先頭
72+ DWORD m_dwTail;
73+ // リングバッファ終端
74+ DWORD m_dwNum;
75+ // リングバッファ個数
76+ DWORD m_dwTickCount;
77+ // コマンド送信時のティックカウンタ
78+ UINT m_uCmdNum;
79+ // 送信中のコマンド番号
80+ UINT m_uRetry;
81+ // リトライカウンタ
82+};
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommDevice.cpp
@@ -0,0 +1,381 @@
1+//
2+// CAN/LIN Checker for RL78/F14
3+//
4+// Target: Win32(Visual Studio Express 2013 for Windows Desktop)
5+// Author: Yasushi Tanaka
6+//
7+// [ COMポートデバイス ]
8+//
9+
10+#include "StdAfx.h"
11+#include "CommDevice.h"
12+
13+//
14+// CommDevice()
15+// コンストラクタ(引数なし)
16+//
17+CommDevice::CommDevice()
18+{
19+ // メンバ初期化
20+ m_pFriendlyName = NULL;
21+ m_pPortName = NULL;
22+ m_hPort = INVALID_HANDLE_VALUE;
23+}
24+
25+//
26+// CommDevice()
27+// コンストラクタ(引数あり)
28+//
29+CommDevice::CommDevice(_TCHAR* pFriendly, _TCHAR* pPort)
30+{
31+ size_t nLen;
32+
33+ // メンバ初期化
34+ m_pFriendlyName = NULL;
35+ m_pPortName = NULL;
36+ m_hPort = INVALID_HANDLE_VALUE;
37+
38+ // フレンドリネーム
39+ if (pFriendly != NULL)
40+ {
41+ nLen = _tcslen(pFriendly);
42+ m_pFriendlyName = new _TCHAR[nLen + 1];
43+ _tcscpy_s(m_pFriendlyName, (size_t)(nLen + 1), pFriendly);
44+ }
45+
46+ // ポートネーム
47+ if (pPort != NULL)
48+ {
49+ nLen = _tcslen(pPort);
50+ m_pPortName = new _TCHAR[nLen + 1];
51+ _tcscpy_s(m_pPortName, (size_t)(nLen + 1), pPort);
52+ }
53+}
54+
55+//
56+// CommDevice()
57+// コピーコンストラクタ
58+//
59+CommDevice::CommDevice(const CommDevice& src)
60+{
61+ const _TCHAR *pName;
62+ size_t nLen;
63+
64+ // メンバ初期化
65+ m_pFriendlyName = NULL;
66+ m_pPortName = NULL;
67+ m_hPort = INVALID_HANDLE_VALUE;
68+
69+ // フレンドリネーム
70+ pName = src.GetFriendlyName();
71+ if (pName != NULL)
72+ {
73+ nLen = _tcslen(pName);
74+ m_pFriendlyName = new _TCHAR[nLen + 1];
75+ _tcscpy_s(m_pFriendlyName, (size_t)(nLen + 1), pName);
76+ }
77+
78+ // ポートネーム
79+ pName = src.GetPortName();
80+ if (pName != NULL)
81+ {
82+ nLen = _tcslen(pName);
83+ m_pPortName = new _TCHAR[nLen + 1];
84+ _tcscpy_s(m_pPortName, (size_t)(nLen + 1), pName);
85+ }
86+}
87+
88+//
89+// ~CommDevice()
90+// デストラクタ
91+//
92+CommDevice::~CommDevice()
93+{
94+ // 終了
95+ DeInit();
96+}
97+
98+//
99+// Init()
100+// 初期化
101+//
102+BOOL CommDevice::Init()
103+{
104+ return TRUE;
105+}
106+
107+//
108+// DeInit()
109+// 終了
110+//
111+void CommDevice::DeInit()
112+{
113+ // クローズ
114+ Close();
115+
116+ // メモリ解放
117+ if (m_pPortName != NULL)
118+ {
119+ delete[] m_pPortName;
120+ m_pPortName = NULL;
121+ }
122+
123+ if (m_pFriendlyName != NULL)
124+ {
125+ delete[] m_pFriendlyName;
126+ m_pFriendlyName = NULL;
127+ }
128+}
129+
130+//
131+// Open()
132+// オープン
133+//
134+BOOL CommDevice::Open()
135+{
136+ _TCHAR szPortName[32];
137+ DCB dcb;
138+ COMMTIMEOUTS cto;
139+
140+ _stprintf_s(szPortName, _countof(szPortName), _T("\\\\.\\%s"), m_pPortName);
141+
142+ // オープンを試みる
143+ m_hPort = CreateFile(
144+ szPortName,
145+ GENERIC_READ | GENERIC_WRITE,
146+ 0,
147+ NULL,
148+ OPEN_EXISTING,
149+ 0,
150+ NULL);
151+
152+ // DCBの取得
153+ if (m_hPort != INVALID_HANDLE_VALUE)
154+ {
155+ ZeroMemory(&dcb, sizeof(dcb));
156+ dcb.DCBlength = sizeof(dcb);
157+ if (GetCommState(m_hPort, &dcb) == FALSE)
158+ {
159+ // DCBの取得に失敗
160+ Close();
161+ }
162+ }
163+
164+ // DCBの設定
165+ if (m_hPort != INVALID_HANDLE_VALUE)
166+ {
167+ // ボーレート500kbps, 8ビット長, パリティなし, 1ストップビット
168+ dcb.BaudRate = 500000;
169+ dcb.fBinary = TRUE;
170+ dcb.fParity = FALSE;
171+ dcb.fOutxCtsFlow = FALSE;
172+ dcb.fOutxDsrFlow = FALSE;
173+ dcb.fDtrControl = DTR_CONTROL_ENABLE;
174+ dcb.fDsrSensitivity = FALSE;
175+ dcb.fTXContinueOnXoff = TRUE;
176+ dcb.fOutX = FALSE;
177+ dcb.fInX = FALSE;
178+ dcb.fErrorChar = FALSE;
179+ dcb.fNull = FALSE;
180+ dcb.fRtsControl = RTS_CONTROL_ENABLE;
181+ dcb.fAbortOnError = FALSE;
182+ dcb.ByteSize = 8;
183+ dcb.Parity = NOPARITY;
184+ dcb.StopBits = ONESTOPBIT;
185+
186+ if (SetCommState(m_hPort, &dcb) == FALSE)
187+ {
188+ // DCBの設定に失敗
189+ Close();
190+ }
191+ }
192+
193+ // タイムアウトの設定
194+ if (m_hPort != INVALID_HANDLE_VALUE)
195+ {
196+ // 1バイト間のタイムアウトは50ms、受信予定バイト数×25msだけ待つ
197+ cto.ReadIntervalTimeout = 50;
198+ cto.ReadTotalTimeoutConstant = 25;
199+ cto.ReadTotalTimeoutMultiplier = 1;
200+
201+ // 送信予定バイト数×25msだけ待つ
202+ cto.WriteTotalTimeoutConstant = 25;
203+ cto.WriteTotalTimeoutMultiplier = 1;
204+
205+ if (SetCommTimeouts(m_hPort, &cto) == FALSE)
206+ {
207+ // タイムアウトの設定に失敗
208+ Close();
209+ }
210+ }
211+
212+ // 入出力バッファサイズの設定
213+ if (m_hPort != INVALID_HANDLE_VALUE)
214+ {
215+ // 入力バッファを0x2000バイト、出力バッファを0x1000バイトに設定
216+ if (SetupComm(m_hPort, 0x2000, 0x1000) == 0)
217+ {
218+ // イベントマスクの設定に失敗
219+ Close();
220+ }
221+ }
222+
223+ // イベントマスクの設定
224+ if (m_hPort != INVALID_HANDLE_VALUE)
225+ {
226+ if (SetCommMask(m_hPort, 0) == 0)
227+ {
228+ // イベントマスクの設定に失敗
229+ Close();
230+ }
231+ }
232+
233+ // ブレーク状態の解除
234+ if (m_hPort != INVALID_HANDLE_VALUE)
235+ {
236+ if (ClearCommBreak(m_hPort) == FALSE)
237+ {
238+ // ブレーク状態の解除に失敗
239+ Close();
240+ }
241+ }
242+
243+ // 送受信バッファのクリア
244+ if (m_hPort != INVALID_HANDLE_VALUE)
245+ {
246+ if (PurgeComm(m_hPort, PURGE_RXCLEAR | PURGE_TXCLEAR) == FALSE)
247+ {
248+ // 送受信バッファのクリアに失敗
249+ Close();
250+ }
251+ }
252+
253+ // m_hPortがINVALID_HANDLE_VALUE以外であればオープンできている
254+ if (m_hPort != INVALID_HANDLE_VALUE)
255+ {
256+ return TRUE;
257+ }
258+ else
259+ {
260+ return FALSE;
261+ }
262+}
263+
264+//
265+// Close()
266+// クローズ
267+//
268+void CommDevice::Close()
269+{
270+ if (m_hPort != INVALID_HANDLE_VALUE)
271+ {
272+ CloseHandle(m_hPort);
273+ m_hPort = INVALID_HANDLE_VALUE;
274+ }
275+}
276+
277+//
278+// Read()
279+// 受信
280+//
281+DWORD CommDevice::Read(LPBYTE pData, DWORD dwMaxBytes)
282+{
283+ COMSTAT stat;
284+ DWORD dwError;
285+ DWORD dwBytes;
286+
287+ // dwBytesを初期化
288+ dwBytes = 0;
289+
290+ if (m_hPort != INVALID_HANDLE_VALUE)
291+ {
292+ // 現在の受信バッファ内のデータ数を得る
293+ dwError = 0;
294+ if (ClearCommError(m_hPort, &dwError, &stat) == TRUE)
295+ {
296+ // 受信数が0以上であれば受信
297+ if (stat.cbInQue > 0)
298+ {
299+ // dwMaxBytesかstat.cbInQueが、どちらか少ない方
300+ if (dwMaxBytes < stat.cbInQue)
301+ {
302+ stat.cbInQue = dwMaxBytes;
303+ }
304+
305+ // 受信
306+ if (ReadFile(
307+ m_hPort,
308+ pData,
309+ stat.cbInQue,
310+ &dwBytes,
311+ NULL) == FALSE)
312+ {
313+ // 受信失敗
314+ dwBytes = 0;
315+ }
316+ }
317+
318+ // フレーミングエラーまたはオーバーランエラーが発生していれば0
319+ if ((dwError & (CE_FRAME | CE_OVERRUN | CE_RXOVER)) != 0)
320+ {
321+ // エラー検出
322+ dwBytes = 0;
323+ }
324+ }
325+ }
326+
327+ return dwBytes;
328+}
329+
330+//
331+// Write()
332+// 送信
333+//
334+BOOL CommDevice::Write(const LPBYTE pData, DWORD dwBytes)
335+{
336+ DWORD dwWritten;
337+ BOOL bResult;
338+
339+ // bRseultをFALSEで初期化
340+ bResult = FALSE;
341+
342+ if (m_hPort != INVALID_HANDLE_VALUE)
343+ {
344+ bResult = WriteFile(
345+ m_hPort,
346+ pData,
347+ dwBytes,
348+ &dwWritten,
349+ NULL);
350+
351+ if (bResult == TRUE)
352+ {
353+ // dwBytesとdwWrittenを比較
354+ if (dwBytes != dwWritten)
355+ {
356+ // 予定していたバイト数を送信できなかった
357+ bResult = FALSE;
358+ }
359+ }
360+ }
361+
362+ return bResult;
363+}
364+
365+//
366+// GetFriendlyName()
367+// フレンドリネームのポインタを取得
368+//
369+const _TCHAR* CommDevice::GetFriendlyName() const
370+{
371+ return m_pFriendlyName;
372+}
373+
374+//
375+// GetPortName()
376+// ポートネームのポインタを取得
377+//
378+const _TCHAR* CommDevice::GetPortName() const
379+{
380+ return m_pPortName;
381+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommDevice.h
@@ -0,0 +1,54 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ COMデバイス ]
6+//
7+
8+#pragma once
9+
10+//
11+// コミュニケーションデバイス
12+//
13+class CommDevice
14+{
15+public:
16+ CommDevice();
17+ // コンストラクタ(引数なし)
18+ CommDevice(_TCHAR* pFriendly, _TCHAR* pPort);
19+ // コンストラクタ(引数あり)
20+ CommDevice(const CommDevice& src);
21+ // コピーコンストラクタ
22+ virtual ~CommDevice();
23+ // デストラクタ
24+ BOOL Init();
25+ // 初期化
26+ void DeInit();
27+ // 終了
28+
29+ // オープン・クローズ
30+ BOOL Open();
31+ // オープン
32+ void Close();
33+ // クローズ
34+
35+ // 受信・送信
36+ DWORD Read(LPBYTE pData, DWORD dwMaxBytes);
37+ // 受信
38+ BOOL Write(const LPBYTE pData, DWORD dwBytes);
39+ // 送信
40+
41+ // 取得
42+ const _TCHAR* GetFriendlyName() const;
43+ // フレンドリネームのポインタを取得
44+ const _TCHAR* GetPortName() const;
45+ // ポートネームのポインタを取得
46+
47+private:
48+ _TCHAR* m_pFriendlyName;
49+ // フレンドリネーム
50+ _TCHAR* m_pPortName;
51+ // ポートネーム
52+ HANDLE m_hPort;
53+ // ファイルハンドル
54+};
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommDeviceList.cpp
@@ -0,0 +1,407 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ COMデバイスリスト ]
6+//
7+
8+#include "StdAfx.h"
9+#include "CommDevice.h"
10+#include "CommDeviceList.h"
11+
12+//
13+// 定数定義
14+//
15+#define PORTS_CLASS_NAME _T("PORTS")
16+ // PORTSクラスの名称
17+#define PORT_REG_NAME _T("PortName")
18+ // ポート名称を表すレジストリネーム
19+#define COM_PREFIX_NAME _T("COM")
20+ // COMポートの先頭に現れる名称
21+
22+//
23+// CommDeviceList()
24+// コンストラクタ
25+//
26+CommDeviceList::CommDeviceList()
27+{
28+}
29+
30+//
31+// ~CommDeviceList()
32+// デストラクタ
33+//
34+CommDeviceList::~CommDeviceList()
35+{
36+ DeInit();
37+}
38+
39+//
40+// Init()
41+// 初期化
42+//
43+BOOL CommDeviceList::Init()
44+{
45+ // ベクタを初期化
46+ m_vector.clear();
47+
48+ // 現在オープン中のインデックスを初期化
49+ m_uCurrent = 0;
50+
51+ // 現在はオープンしていない
52+ m_bOpen = FALSE;
53+
54+ return TRUE;
55+}
56+
57+//
58+// DeInit()
59+// 終了
60+//
61+void CommDeviceList::DeInit()
62+{
63+ // 現在オープンしていれば、クローズ
64+ if (m_bOpen == TRUE)
65+ {
66+ Close();
67+ }
68+}
69+
70+//
71+// Open()
72+// オープン
73+//
74+BOOL CommDeviceList::Open(UINT uIndex)
75+{
76+ // オープンしていれば失敗
77+ if (m_bOpen == TRUE)
78+ {
79+ return FALSE;
80+ }
81+
82+ // カレントを変更
83+ m_uCurrent = uIndex;
84+
85+ // 結果をm_bOpenへ代入
86+ m_bOpen = m_vector[m_uCurrent].Open();
87+
88+ // 結果を返す
89+ return m_bOpen;
90+}
91+
92+//
93+// Close()
94+// クローズ
95+//
96+void CommDeviceList::Close()
97+{
98+ // オープンしていれば
99+ if (m_bOpen == TRUE)
100+ {
101+ // クローズ
102+ m_vector[m_uCurrent].Close();
103+
104+ // オープンしていない
105+ m_bOpen = FALSE;
106+ }
107+}
108+
109+//
110+// IsOpen()
111+// オープンしているか取得
112+//
113+BOOL CommDeviceList::IsOpen() const
114+{
115+ return m_bOpen;
116+}
117+
118+//
119+// GetCurrent()
120+// 現在オープンしているインデックスの取得
121+//
122+UINT CommDeviceList::GetCurrent() const
123+{
124+ return m_uCurrent;
125+}
126+
127+//
128+// Read()
129+// 受信
130+//
131+DWORD CommDeviceList::Read(LPBYTE pData, DWORD dwMaxBytes)
132+{
133+ if (m_bOpen == TRUE)
134+ {
135+ return m_vector[m_uCurrent].Read(pData, dwMaxBytes);
136+ }
137+ else
138+ {
139+ return 0;
140+ }
141+}
142+
143+//
144+// Write()
145+// 送信
146+//
147+BOOL CommDeviceList::Write(const LPBYTE pData, DWORD dwBytes)
148+{
149+ if (m_bOpen == TRUE)
150+ {
151+ return m_vector[m_uCurrent].Write(pData, dwBytes);
152+ }
153+ else
154+ {
155+ return FALSE;
156+ }
157+}
158+
159+
160+//
161+// Enum()
162+// 列挙
163+//
164+BOOL CommDeviceList::Enum()
165+{
166+ BOOL bRet;
167+ GUID PortsGUID;
168+ DWORD dwRequiredSize;
169+ HDEVINFO hDevInfo;
170+
171+ // ベクタをあらかじめクリア
172+ m_vector.clear();
173+
174+ // PORTSクラスに結び付けられたGUIDの実体を取得(GUIDの個数は常に1である)
175+ bRet = SetupDiClassGuidsFromName(PORTS_CLASS_NAME, &PortsGUID, 1, &dwRequiredSize);
176+ if (bRet == FALSE)
177+ {
178+ OutputDebugString(_T("CommDeviceList:SetupDiClassGuidsFromName(ClassGUIDList) returns FALSE\n"));
179+ return FALSE;
180+ }
181+ if (dwRequiredSize != 1)
182+ {
183+ OutputDebugString(_T("CommDeviceList:SetupDiClassGuidsFromName(ClassGUIDList) dwRequiredSize != 1\n"));
184+ return FALSE;
185+ }
186+
187+ // デバイス情報セットを取得
188+ hDevInfo = SetupDiGetClassDevs(&PortsGUID, NULL, NULL, DIGCF_PRESENT);
189+ if (hDevInfo == NULL)
190+ {
191+ OutputDebugString(_T("CommDeviceList:SetupDiClassDevs() returns NULL\n"));
192+ return FALSE;
193+ }
194+
195+ // サブ関数に任せる
196+ EnumSub(hDevInfo);
197+
198+ // デバイス情報セットの使用を終了
199+ bRet = SetupDiDestroyDeviceInfoList(hDevInfo);
200+ if (bRet == FALSE)
201+ {
202+ OutputDebugString(_T("CommDeviceList::SetupDiDestroyDeviceInfoList() returns FALSE\n"));
203+ return FALSE;
204+ }
205+
206+ // 成功
207+ return TRUE;
208+}
209+
210+//
211+// EnumSub()
212+// 列挙サブ
213+//
214+void CommDeviceList::EnumSub(HDEVINFO hDevInfo)
215+{
216+ SP_DEVINFO_DATA DeviceInfoData;
217+ DWORD dwMemberIndex;
218+ BOOL bRet;
219+
220+ // 初期化
221+ dwMemberIndex = 0;
222+ bRet = TRUE;
223+
224+ // whileループ
225+ while (bRet == TRUE)
226+ {
227+ // DeviceInfoDataを毎回初期化
228+ ZeroMemory(&DeviceInfoData, sizeof(DeviceInfoData));
229+ DeviceInfoData.cbSize = sizeof(DeviceInfoData);
230+
231+ // 個々のデバイスインスタンスを取得
232+ bRet = SetupDiEnumDeviceInfo(hDevInfo, dwMemberIndex, &DeviceInfoData);
233+ if (bRet == FALSE)
234+ {
235+ // すべての列挙が終了した
236+ break;
237+ }
238+
239+ // 単一デバイスの処理
240+ bRet = EnumOne(hDevInfo, &DeviceInfoData);
241+ if (bRet == FALSE)
242+ {
243+ // 単一デバイスの処理に失敗した
244+ break;
245+ }
246+
247+ // メンバインデックスを次へ進める
248+ dwMemberIndex++;
249+ }
250+}
251+
252+//
253+// EnumOne()
254+// 単一デバイスの処理
255+//
256+BOOL CommDeviceList::EnumOne(HDEVINFO hDevInfo, SP_DEVINFO_DATA* pDevInfoData)
257+{
258+ BOOL bRet;
259+ DWORD dwRequiredSize;
260+ _TCHAR* pFriendlyName;
261+ DWORD dwRegDataType;
262+ HKEY hKey;
263+ LONG lError;
264+ DWORD dwRegType;
265+ DWORD dwRegSize;
266+ _TCHAR* pPortName;
267+ int nRet;
268+
269+ // プラグ&プレイでのフレンドリネーム取得に必要なバッファサイズを得る
270+ dwRequiredSize = 0;
271+ SetupDiGetDeviceRegistryProperty(
272+ hDevInfo,
273+ pDevInfoData,
274+ SPDRP_FRIENDLYNAME,
275+ NULL,
276+ NULL,
277+ 0,
278+ &dwRequiredSize);
279+ if (dwRequiredSize == 0)
280+ {
281+ OutputDebugString(_T("CommDeviceList::SetupGetDeviceRegistryProperty(NULL) dwRequiredSize == 0\n"));
282+ return FALSE;
283+ }
284+
285+ // フレンドリネームバッファを確保
286+ pFriendlyName = new _TCHAR[dwRequiredSize];
287+
288+ // フレンドリネームを取得
289+ bRet = SetupDiGetDeviceRegistryProperty(
290+ hDevInfo,
291+ pDevInfoData,
292+ SPDRP_FRIENDLYNAME,
293+ &dwRegDataType,
294+ (PBYTE)pFriendlyName,
295+ sizeof(_TCHAR) * dwRequiredSize,
296+ &dwRequiredSize);
297+ if (bRet == FALSE)
298+ {
299+ OutputDebugString(_T("CommDeviceList::SetupGetDeviceRegistryProperty(pFriendlyName) returns FALSE\n"));
300+ delete[] pFriendlyName;
301+ return FALSE;
302+ }
303+
304+ // フレンドリネームが取得できたので、実際にCOMポートかどうか調べる
305+ hKey = SetupDiOpenDevRegKey(
306+ hDevInfo,
307+ pDevInfoData,
308+ DICS_FLAG_GLOBAL,
309+ 0,
310+ DIREG_DEV,
311+ KEY_QUERY_VALUE);
312+ if (hKey != INVALID_HANDLE_VALUE)
313+ {
314+ // レジストリの読み出しに必要なサイズを取得
315+ dwRegSize = 0;
316+ lError = RegQueryValueEx(
317+ hKey,
318+ PORT_REG_NAME,
319+ NULL,
320+ &dwRegType,
321+ NULL,
322+ &dwRegSize);
323+ if ((lError == ERROR_SUCCESS) && (dwRegType == REG_SZ))
324+ {
325+ // ポートネームバッファを確保
326+ pPortName = new _TCHAR[dwRegSize];
327+
328+ // 改めてレジストリを読み出す
329+ lError = RegQueryValueEx(
330+ hKey,
331+ PORT_REG_NAME,
332+ NULL,
333+ &dwRegType,
334+ (LPBYTE)pPortName,
335+ &dwRegSize);
336+
337+ // pPortNameが'COM'で始まっているか調べる
338+ nRet = _tcsnicmp(pPortName, COM_PREFIX_NAME, _tcslen(COM_PREFIX_NAME));
339+
340+ // 'COM'で始まっている場合に限って追加
341+ if (nRet == 0)
342+ {
343+ EnumAdd(pFriendlyName, pPortName);
344+ }
345+
346+ // ポートネームバッファを解放
347+ delete[] pPortName;
348+ }
349+
350+ // hKeyを閉じる
351+ RegCloseKey(hKey);
352+ }
353+
354+ // フレンドリネームバッファを解放
355+ delete[] pFriendlyName;
356+
357+ return TRUE;
358+}
359+
360+//
361+// EnumAdd()
362+// デバイスの追加
363+//
364+void CommDeviceList::EnumAdd(_TCHAR* pFriendlyName, _TCHAR* pPortName)
365+{
366+ // 新たなCommDeviceクラスを作成してベクタへ追加
367+ m_vector.push_back(CommDevice(pFriendlyName, pPortName));
368+}
369+
370+//
371+// GetCount()
372+// デバイス個数の取得
373+//
374+UINT CommDeviceList::GetCount() const
375+{
376+ std::vector <CommDevice>::size_type size;
377+
378+ // サイズを取得
379+ size = m_vector.size();
380+
381+ return (UINT)size;
382+}
383+
384+//
385+// GetFriendlyName()
386+/// フレンドリネームの取得
387+//
388+const _TCHAR* CommDeviceList::GetFriendlyName(UINT uIndex) const
389+{
390+ UINT uCount;
391+ const _TCHAR* pFriendlyName;
392+
393+ // 戻り値を初期化
394+ pFriendlyName = NULL;
395+
396+ // カウントを取得
397+ uCount = GetCount();
398+
399+ // カウントが範囲内であれば
400+ if (uIndex < uCount)
401+ {
402+ // ベクタからフレンドリネームを返す(実体は変更不可)
403+ pFriendlyName = m_vector[uIndex].GetFriendlyName();
404+ }
405+
406+ return pFriendlyName;
407+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/CommDeviceList.h
@@ -0,0 +1,70 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ COMデバイスリスト ]
6+//
7+
8+#pragma once
9+
10+class CommDevice;
11+
12+//
13+// COMデバイスリスト
14+//
15+class CommDeviceList
16+{
17+public:
18+ // 初期化および終了
19+ CommDeviceList();
20+ // コンストラクタ
21+ virtual ~CommDeviceList();
22+ // デストラクタ
23+ BOOL Init();
24+ // 初期化
25+ void DeInit();
26+ // 終了
27+
28+ // 列挙
29+ BOOL Enum();
30+ // 列挙
31+
32+ // 取得
33+ UINT GetCount() const;
34+ // デバイス個数の取得
35+ const _TCHAR* GetFriendlyName(UINT uIndex) const;
36+ // フレンドリネームの取得
37+ _TCHAR* GetPortName(UINT uIndex) const;
38+ // ポートネームの取得
39+
40+ // オープン・クローズ
41+ BOOL Open(UINT uIndex);
42+ // オープン
43+ void Close();
44+ // クローズ
45+ BOOL IsOpen() const;
46+ // オープンしているか取得
47+ UINT GetCurrent() const;
48+ // 現在オープンしているインデックスの取得
49+
50+ // 受信・送信
51+ DWORD Read(LPBYTE pData, DWORD dwMaxBytes);
52+ // 受信
53+ BOOL Write(const LPBYTE pData, DWORD dwBytes);
54+ // 送信
55+
56+private:
57+ void EnumSub(HDEVINFO hDevInfo);
58+ // 列挙サブ
59+ BOOL EnumOne(HDEVINFO hDevInfo, SP_DEVINFO_DATA* pDevInfoData);
60+ // 単一デバイスの処理
61+ void EnumAdd(_TCHAR* pFriendlyName, _TCHAR* pPortName);
62+ // デバイスの追加
63+
64+ std::vector<CommDevice> m_vector;
65+ // コミュニケーションデバイスのベクタ
66+ UINT m_uCurrent;
67+ // 現在オープンしているインデックス
68+ BOOL m_bOpen;
69+ // 現在オープンしているか
70+};
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/Helper.h
@@ -0,0 +1,87 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ ヘルパ ]
6+//
7+
8+#pragma once
9+
10+#ifdef __cplusplus
11+extern "C" {
12+#endif // __cplusplus
13+
14+typedef unsigned char u1;
15+typedef unsigned short u2;
16+typedef unsigned int u4;
17+
18+//
19+// Command()
20+// コマンド実行
21+//
22+void Command(u4 cmd);
23+
24+//
25+// Read8bit()
26+// 8bit読み込み
27+//
28+u1 Read8bit(u2 addr);
29+
30+//
31+// Write8bit()
32+// 8bit書き込み
33+//
34+void Write8bit(u2 addr, u1 data);
35+
36+//
37+// Read16bit()
38+// 16bit読み込み
39+//
40+u2 Read16bit(u2 addr);
41+
42+//
43+// Write16bit()
44+// 16bit書き込み
45+//
46+void Write16bit(u2 addr, u2 data);
47+
48+
49+//
50+// Read32bit()
51+// 32bit読み込み
52+//
53+u4 Read32bit(u2 addr);
54+
55+//
56+// Write32bit()
57+// 32bit書き込み
58+//
59+void Write32bit(u2 addr, u4 data);
60+
61+//
62+// LogMsg()
63+// ログ出力
64+//
65+void LogMsg(const char *msg);
66+
67+//
68+// Log8bit()
69+// ログ出力(8bitデータ付)
70+//
71+void Log8bit(const char *msg, u1 data);
72+
73+//
74+// Log16bit()
75+// ログ出力(16bitデータ付)
76+//
77+void Log16bit(const char *msg, u2 data);
78+
79+//
80+// Log32it()
81+// ログ出力(32bitデータ付)
82+//
83+void Log32bit(const char *msg, u4 data);
84+
85+#ifdef __cplusplus
86+}
87+#endif // __cplusplus
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/LogListBox.cpp
@@ -0,0 +1,157 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ ログリストボックス ]
6+//
7+
8+#include "StdAfx.h"
9+#include "LogListBox.h"
10+
11+//
12+// LogListBox()
13+// コンストラクタ
14+//
15+LogListBox::LogListBox()
16+{
17+ // メンバ変数を初期化
18+ m_hInstance = NULL;
19+ m_hWnd = NULL;
20+}
21+
22+//
23+// ~LogListBox()
24+// デストラクタ
25+//
26+LogListBox::~LogListBox()
27+{
28+ DeInit();
29+}
30+
31+//
32+// Init()
33+// 初期化
34+//
35+BOOL LogListBox::Init(HINSTANCE hInstance, HWND hWnd)
36+{
37+ // インスタンスとウィンドウハンドルをチェック
38+ if ((hInstance == NULL) || (hWnd == NULL))
39+ {
40+ return FALSE;
41+ }
42+
43+ // インスタンスを記憶
44+ m_hInstance = hInstance;
45+
46+ // ウィンドウハンドルを記憶
47+ m_hWnd = hWnd;
48+
49+ // リストボックスの内容をクリア
50+ SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0);
51+
52+ return TRUE;
53+}
54+
55+//
56+// DeInit()
57+// 終了
58+void LogListBox::DeInit()
59+{
60+}
61+
62+//
63+// LogRes()
64+// 文字列リソースからログを出力
65+//
66+void LogListBox::LogRes(UINT uID)
67+{
68+ int nRet;
69+
70+ // インスタンスをチェック
71+ if (m_hInstance == NULL)
72+ {
73+ return;
74+ }
75+
76+ // 文字列リソースをロード
77+ nRet = LoadString(m_hInstance, uID, m_szRes, _countof(m_szRes));
78+ if (nRet == 0)
79+ {
80+ OutputDebugString(_T("LogListBox:LoadString() returns 0\n"));
81+ return;
82+ }
83+
84+ // ログ出力
85+ LogOut();
86+}
87+
88+//
89+// LogMsg()
90+// メッセージからログを出力
91+//
92+void LogListBox::LogMsg(const _TCHAR* pszMsg)
93+{
94+ // 文字列をコピー
95+ _tcscpy_s(m_szRes, _countof(m_szRes), pszMsg);
96+
97+ // ログ出力
98+ LogOut();
99+}
100+
101+//
102+// LogUint()
103+// メッセージと数値からログ出力
104+//
105+void LogListBox::LogUint(const _TCHAR* pszMsg, UINT uValue)
106+{
107+ // 文字列をフォーマット
108+ _stprintf_s(m_szRes, _countof(m_szRes), _T("%s%u"), pszMsg, uValue);
109+
110+ // ログ出力
111+ LogOut();
112+}
113+
114+//
115+// LogOut()
116+// ログ出力
117+//
118+void LogListBox::LogOut()
119+{
120+ SYSTEMTIME st;
121+ LRESULT result;
122+
123+ // ウィンドウハンドルをチェック
124+ if (m_hWnd == NULL)
125+ {
126+ return;
127+ }
128+
129+ // ローカル時間を取得
130+ GetLocalTime(&st);
131+
132+ // 日付および時刻をフォーマット
133+ _stprintf_s(
134+ m_szLog,
135+ _countof(m_szLog),
136+ _T("[%02d:%02d:%02d.%03d] "),
137+ st.wHour,
138+ st.wMinute,
139+ st.wSecond,
140+ st.wMilliseconds);
141+
142+ // リソース文字列を連結
143+ _tcscat_s(m_szLog, _countof(m_szLog), m_szRes);
144+
145+ // リストボックスへ追加
146+ result = SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)m_szLog);
147+
148+ if (result != LB_ERR)
149+ {
150+ // 自動スクロールさせる
151+ SendMessage(m_hWnd, LB_SETTOPINDEX, (WPARAM)result, 0);
152+ }
153+
154+ // Windowsログコンソールへも出力
155+ _tcscat_s(m_szLog, _countof(m_szLog), _T("\n"));
156+ OutputDebugString(m_szLog);
157+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/LogListBox.h
@@ -0,0 +1,44 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ ログリストボックス ]
6+//
7+
8+#pragma once
9+
10+class LogListBox
11+{
12+public:
13+ // 初期化および終了
14+ LogListBox();
15+ // コンストラクタ
16+ virtual ~LogListBox();
17+ // デストラクタ
18+ BOOL Init(HINSTANCE hInstance, HWND hWnd);
19+ // 初期化
20+ void DeInit();
21+ // 終了
22+
23+ // ログ出力
24+ void LogRes(UINT uID);
25+ // 文字列リソースからログ出力
26+ void LogMsg(const _TCHAR* pszMsg);
27+ // メッセージからログ出力
28+ void LogUint(const _TCHAR* pszMsg, UINT uValue);
29+ // メッセージと数値からログ出力
30+
31+private:
32+ void LogOut();
33+ // ログ出力
34+
35+ HINSTANCE m_hInstance;
36+ // インスタンス
37+ HWND m_hWnd;
38+ // ウィンドウハンドル
39+ _TCHAR m_szRes[_MAX_PATH];
40+ // リソースから得た文字列
41+ _TCHAR m_szLog[_MAX_PATH * 2];
42+ // ログとして出力する文字列
43+
44+};
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/SampleApp.c
@@ -0,0 +1,58 @@
1+/*
2+ * CAN Target Simulator
3+ * for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+ *
5+ * [ サンプルアプリ]
6+ */
7+
8+#include "Helper.h"
9+
10+/*
11+ * SFR定義
12+ */
13+#define C0CTLR (0xD7C0)
14+#define C0STR (0xD7C2)
15+#define C0BCR (0xD7C4)
16+
17+/*
18+ * コマンド実行
19+ */
20+void Command(u4 cmd)
21+{
22+ u1 data8;
23+ u2 data16;
24+
25+ switch (cmd)
26+ {
27+ /* コマンド0:ステータスレジスタ読み出し */
28+ case 0:
29+ data16 = Read16bit(C0STR);
30+ Log16bit("C0STRレジスタ", data16);
31+ break;
32+
33+ /* コマンド1: スリープモード解除 */
34+ case 1:
35+ /* AND処理でSLPMビットを落とす */
36+ data16 = Read16bit(C0CTLR);
37+ data16 &= ~0x0004;
38+ Write16bit(C0CTLR, data16);
39+
40+ /* ステータスレジスタのSLPSTが0になるまで待つ */
41+ for (;;)
42+ {
43+ data8 = Read8bit(C0STR);
44+ if ((data8 & 0x04) == 0)
45+ {
46+ break;
47+ }
48+ }
49+ LogMsg("スリープモード解除完了");
50+ break;
51+
52+ /* コマンド2:クロック選択およびビットコンフィギュレーション */
53+ case 2:
54+ Write32bit(C0BCR, 0x0003A003);
55+ Log32bit("C0BCR+C0CLKR", Read32bit(C0BCR));
56+ break;
57+ }
58+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/StdAfx.h
@@ -0,0 +1,35 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ プリコンパイル済みヘッダ ]
6+//
7+
8+#pragma once
9+
10+//
11+// ターゲットWindowsバージョン
12+// (Windows Vista以降)
13+//
14+#ifndef _WIN32_WINNT
15+#define _WIN32_WINNT 0x0600
16+#endif
17+
18+//
19+// Windowsヘッダーファイル
20+//
21+#include <Windows.h>
22+#include <SetupAPI.h>
23+
24+//
25+// Cランタイムライブラリ
26+//
27+#include <stdio.h>
28+#include <tchar.h>
29+
30+//
31+// C++ランタイムライブラリ
32+//
33+#include <cstdlib>
34+#include <cstring>
35+#include <vector>
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/WinMain.cpp
@@ -0,0 +1,564 @@
1+//
2+// CAN Target Simulator
3+// for Windows(x86) + Visual Studio Express 2013 for Windows Desktop
4+//
5+// [ WinMain ]
6+//
7+
8+#include "StdAfx.h"
9+#include "resource.h"
10+
11+#include "CommDevice.h"
12+#include "CommDeviceList.h"
13+#include "LogListBox.h"
14+#include "CommCommand.h"
15+#include "Helper.h"
16+
17+//
18+// インスタンス変数
19+//
20+static HINSTANCE g_hInstance;
21+ // インスタンス
22+static CommDeviceList* g_pCommDeviceList;
23+ // コミュニケーションデバイスのリスト
24+static LogListBox* g_pLogListBox;
25+ // ログリストボックス
26+static CommCommand* g_pCommCommand;
27+ // コマンド
28+
29+//
30+// Read8bit()
31+// 8bit読み込み
32+//
33+u1 Read8bit(u2 addr)
34+{
35+ BYTE data;
36+ BOOL bRet;
37+
38+ // コマンド実行
39+ bRet = g_pCommCommand->Read8bit((WORD)addr, &data);
40+
41+ // bRet == FALSEであれば、戻り値を0とする
42+ if (bRet == FALSE)
43+ {
44+ g_pLogListBox->LogMsg(_T("Read8bit() Failed!"));
45+ data = 0;
46+ }
47+
48+ return data;
49+}
50+
51+//
52+// Writed8bit()
53+// 8bit書き込み
54+//
55+void Write8bit(u2 addr, u1 data)
56+{
57+ // コマンド実行
58+ if (g_pCommCommand->Write8bit((WORD)addr, (BYTE)data) == FALSE)
59+ {
60+ g_pLogListBox->LogMsg(_T("Write8bit() Failed!"));
61+ }
62+}
63+
64+//
65+// Read16bit()
66+// 16bit読み込み
67+//
68+u2 Read16bit(u2 addr)
69+{
70+ WORD data;
71+ BOOL bRet;
72+
73+ // コマンド実行
74+ bRet = g_pCommCommand->Read16bit((WORD)addr, &data);
75+
76+ // bRet == FALSEであれば、戻り値を0とする
77+ if (bRet == FALSE)
78+ {
79+ g_pLogListBox->LogMsg(_T("Read16bit() Failed!"));
80+ data = 0;
81+ }
82+
83+ return data;
84+}
85+
86+//
87+// Writed16bit()
88+// 16bit書き込み
89+//
90+void Write16bit(u2 addr, u2 data)
91+{
92+ // コマンド実行
93+ if (g_pCommCommand->Write16bit((WORD)addr, (WORD)data) == FALSE)
94+ {
95+ g_pLogListBox->LogMsg(_T("Write16bit() Failed!"));
96+ }
97+}
98+
99+//
100+// Read32bit()
101+// 32bit読み込み
102+//
103+u4 Read32bit(u2 addr)
104+{
105+ DWORD data;
106+ BOOL bRet;
107+
108+ // コマンド実行
109+ bRet = g_pCommCommand->Read32bit((WORD)addr, &data);
110+
111+ // bRet == FALSEであれば、戻り値を0とする
112+ if (bRet == FALSE)
113+ {
114+ g_pLogListBox->LogMsg(_T("Read32bit() Failed!"));
115+ data = 0;
116+ }
117+
118+ return data;
119+}
120+
121+//
122+// Write32bit()
123+// 32bit書き込み
124+//
125+void Write32bit(u2 addr, u4 data)
126+{
127+ // コマンド実行
128+ if (g_pCommCommand->Write32bit((WORD)addr, (DWORD)data) == FALSE)
129+ {
130+ g_pLogListBox->LogMsg(_T("Write32bit() Failed!"));
131+ }
132+}
133+
134+//
135+// LogMsg()
136+// ログ出力
137+//
138+void LogMsg(const char *msg)
139+{
140+#ifdef _UNICODE
141+ _TCHAR szLog[_MAX_PATH];
142+#endif // _UNICODE
143+
144+#ifdef _UNICODE
145+ // UNICODEへ変換
146+ MultiByteToWideChar(
147+ 932,
148+ MB_PRECOMPOSED,
149+ msg,
150+ -1,
151+ szLog,
152+ _countof(szLog)
153+ );
154+
155+ // UNICODEで出力
156+ g_pLogListBox->LogMsg(szLog);
157+#else
158+ // そのまま出力
159+ g_pLogListBox->LogMsg(szAnsi);
160+#endif // _UNICODE
161+}
162+
163+//
164+// Log8bit()
165+// ログ出力(8bitデータ付)
166+//
167+void Log8bit(const char *msg, u1 data)
168+{
169+ char szAnsi[_MAX_PATH];
170+
171+ // ANSIでフォーマット
172+ sprintf_s(szAnsi, _countof(szAnsi), "%s(HEX=0x%02X, DEC=%d)", msg, data, data);
173+
174+ // ログ出力
175+ LogMsg(szAnsi);
176+}
177+
178+//
179+// Log16bit()
180+// ログ出力(16bitデータ付)
181+//
182+void Log16bit(const char *msg, u2 data)
183+{
184+ char szAnsi[_MAX_PATH];
185+
186+ // ANSIでフォーマット
187+ sprintf_s(szAnsi, _countof(szAnsi), "%s(HEX=0x%04X, DEC=%d)", msg, data, data);
188+
189+ // ログ出力
190+ LogMsg(szAnsi);
191+}
192+
193+//
194+// Log32bit()
195+// ログ出力(32bitデータ付)
196+//
197+void Log32bit(const char *msg, u4 data)
198+{
199+ char szAnsi[_MAX_PATH];
200+
201+ // ANSIでフォーマット
202+ sprintf_s(szAnsi, _countof(szAnsi), "%s(HEX=0x%08X, DEC=%d)", msg, data, data);
203+
204+ // ログ出力
205+ LogMsg(szAnsi);
206+}
207+
208+//
209+// MainDialogInit()
210+// メインダイアログの初期化
211+//
212+static void MainDialogInit(HWND hWnd)
213+{
214+ HWND hListBox;
215+ HWND hComboBox;
216+ UINT uCount;
217+ const _TCHAR* pFriendlyName;
218+ BOOL bResult;
219+
220+ // ログリストボックスを初期化
221+ hListBox = GetDlgItem(hWnd, ID_MAINDLG_LOGLIST);
222+ if (hListBox != NULL)
223+ {
224+ g_pLogListBox->Init(g_hInstance, hListBox);
225+ }
226+
227+ // コミュニケーションデバイスリストを更新
228+ g_pCommDeviceList->Enum();
229+ g_pLogListBox->LogRes(IDS_PORT_ENUM);
230+
231+ // COMポート選択コンボボックス
232+ hComboBox = GetDlgItem(hWnd, ID_MAINDLG_COMCOMBO);
233+ if (hComboBox != NULL)
234+ {
235+ // コミュニケーションデバイスの個数を取得
236+ uCount = g_pCommDeviceList->GetCount();
237+
238+ // コミュニケーションデバイスだけループし、フレンドリネームを追加
239+ for (UINT uLoop = 0; uLoop < uCount; uLoop++)
240+ {
241+ pFriendlyName = g_pCommDeviceList->GetFriendlyName(uLoop);
242+ if (pFriendlyName != NULL)
243+ {
244+ // リストボックスへ追加
245+ SendMessage(hComboBox, CB_INSERTSTRING, uLoop, (LPARAM)pFriendlyName);
246+
247+ // ログリストボックス
248+ g_pLogListBox->LogMsg(pFriendlyName);
249+ }
250+ }
251+
252+ // uCountによって分ける
253+ if (uCount > 0)
254+ {
255+ // 最初の文字列を選択
256+ SendMessage(hComboBox, CB_SETCURSEL, 0, 0);
257+
258+ // 最初のポートをオープン
259+ bResult = g_pCommDeviceList->Open(0);
260+ if (bResult == TRUE)
261+ {
262+ g_pLogListBox->LogRes(IDS_PORT_OPEN);
263+ }
264+ else
265+ {
266+ g_pLogListBox->LogRes(IDS_PORT_OPENERR);
267+ }
268+ g_pLogListBox->LogMsg(g_pCommDeviceList->GetFriendlyName(0));
269+ }
270+ else
271+ {
272+ // COMポートが見つからなかった
273+ g_pLogListBox->LogRes(IDS_PORT_EMPTY);
274+ }
275+ }
276+
277+ // コマンド入力エディットコントロール
278+ SetDlgItemText(hWnd, ID_MAINDLG_CMDEDIT, _T("0"));
279+}
280+
281+//
282+// OnCbnSelChange()
283+// コンボボックス変更
284+//
285+static void OnCbnSelChange(UINT uCurSel)
286+{
287+ UINT uCurrent;
288+ BOOL bResult;
289+
290+ // 現在オープンしていれば
291+ if (g_pCommDeviceList->IsOpen() == TRUE)
292+ {
293+ // 現在のポートをクローズ
294+ uCurrent = g_pCommDeviceList->GetCurrent();
295+ g_pCommDeviceList->Close();
296+
297+ g_pLogListBox->LogRes(IDS_PORT_CLOSE);
298+ g_pLogListBox->LogMsg(g_pCommDeviceList->GetFriendlyName(uCurrent));
299+ }
300+
301+ // 選択されたポートをオープン
302+ bResult = g_pCommDeviceList->Open(uCurSel);
303+ if (bResult == TRUE)
304+ {
305+ g_pLogListBox->LogRes(IDS_PORT_OPEN);
306+ }
307+ else
308+ {
309+ g_pLogListBox->LogRes(IDS_PORT_OPENERR);
310+ }
311+ g_pLogListBox->LogMsg(g_pCommDeviceList->GetFriendlyName(uCurSel));
312+}
313+
314+//
315+// OnExec()
316+// コマンド実行
317+//
318+static void OnExec(HWND hWnd)
319+{
320+ HWND hEditCtrl;
321+ TCHAR szEdit[32];
322+ UINT uCount;
323+ UINT uCommand;
324+
325+ // エディットコントロールのウィンドウハンドルを取得
326+ hEditCtrl = GetDlgItem(hWnd, ID_MAINDLG_CMDEDIT);
327+
328+ // エディットコントロールの文字列を取得
329+ ZeroMemory(szEdit, sizeof(szEdit));
330+ szEdit[0] = _countof(szEdit);
331+ uCount = SendMessage(hEditCtrl, EM_GETLINE, (WPARAM)0, (LPARAM)szEdit);
332+
333+ // 文字列が存在した場合のみ
334+ if (uCount > 0)
335+ {
336+ // オープン中の場合のみ
337+ if (g_pCommDeviceList->IsOpen() == TRUE)
338+ {
339+ uCommand = _tcstoul(szEdit, NULL, 10);
340+ g_pLogListBox->LogUint(_T("コマンド "), uCommand);
341+
342+ // サンプルアプリを呼び出す
343+ Command((u4)uCommand);
344+ }
345+ }
346+}
347+
348+//
349+// OnTest()
350+// 通信テスト
351+//
352+static void OnTest()
353+{
354+ WORD wVersion;
355+ BOOL bRet;
356+
357+ // オープン中の場合のみ
358+ if (g_pCommDeviceList->IsOpen() == TRUE)
359+ {
360+ // 通信テスト
361+ g_pLogListBox->LogMsg(_T("通信テスト:"));
362+
363+ // コマンド0:プロトコルバージョン取得
364+ bRet = g_pCommCommand->GetVersion(&wVersion);
365+ if (bRet == TRUE)
366+ {
367+ if (wVersion == 0x0001)
368+ {
369+ g_pLogListBox->LogMsg(_T("結果OK"));
370+ }
371+ else
372+ {
373+ g_pLogListBox->LogMsg(_T("結果NG(プロトコルバージョンエラー)"));
374+ }
375+ }
376+ else
377+ {
378+ g_pLogListBox->LogMsg(_T("結果NG(タイムアウト)"));
379+ }
380+ }
381+}
382+
383+//
384+// OnCommand()
385+// WM_COMMANDメッセージハンドラ
386+//
387+static void OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
388+{
389+ UINT uID;
390+ UINT uNotify;
391+ HWND hCtrlWnd;
392+ UINT uCurSel;
393+
394+ uNotify = HIWORD(wParam);
395+ uID = LOWORD(wParam);
396+ hCtrlWnd = (HWND)lParam;
397+
398+ switch (uID)
399+ {
400+ // [ENTER]
401+ case IDOK:
402+ // コマンド実行
403+ OnExec(hWnd);
404+ break;
405+
406+ // [ESC]または閉じるボタン
407+ case IDCANCEL:
408+ EndDialog(hWnd, IDCANCEL);
409+ break;
410+
411+ // ポートコンボボックス
412+ case ID_MAINDLG_COMCOMBO:
413+ // コンボボックスがユーザによって変更されたか
414+ if (uNotify == CBN_SELCHANGE)
415+ {
416+ // 現在の選択位置を取得
417+ uCurSel = (UINT)SendMessage(hCtrlWnd, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
418+
419+ // 変更
420+ OnCbnSelChange(uCurSel);
421+ }
422+ break;
423+
424+ // 実行ボタン
425+ case ID_MAINDLG_EXECBTN:
426+ // ボタンが押されたか
427+ if (uNotify == BN_CLICKED)
428+ {
429+ // 実行
430+ OnExec(hWnd);
431+ }
432+ break;
433+
434+ // 通信テストボタン
435+ case ID_MAINDLG_CMDTEST:
436+ // ボタンが押されたか
437+ if (uNotify == BN_CLICKED)
438+ {
439+ // 通信テスト
440+ OnTest();
441+ }
442+ break;
443+
444+ default:
445+ break;
446+ }
447+}
448+
449+//
450+// MainDialogProc()
451+// メインダイアログプロシージャ
452+//
453+BOOL CALLBACK MainDialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
454+{
455+ switch (msg)
456+ {
457+ // ダイアログの初期化
458+ case WM_INITDIALOG:
459+ MainDialogInit(hWnd);
460+ return TRUE;
461+
462+ // コマンド
463+ case WM_COMMAND:
464+ OnCommand(hWnd, wParam, lParam);
465+ return TRUE;
466+
467+ // ウィンドウのクローズ要求
468+ case WM_CLOSE:
469+ EndDialog(hWnd, IDOK);
470+ return TRUE;
471+ }
472+
473+ return FALSE;
474+}
475+
476+//
477+// Init()
478+// オブジェクトインスタンスの作成
479+//
480+static BOOL Init(HINSTANCE hInstance)
481+{
482+ BOOL bRet;
483+
484+ // インスタンスを記憶
485+ g_hInstance = hInstance;
486+
487+ // コミュニケーションデバイスのリスト
488+ g_pCommDeviceList = new CommDeviceList;
489+ bRet = g_pCommDeviceList->Init();
490+ if (bRet == FALSE)
491+ {
492+ return FALSE;
493+ }
494+
495+ // ログリストボックス(Initは行わない)
496+ g_pLogListBox = new LogListBox;
497+
498+ // コマンド
499+ g_pCommCommand = new CommCommand(g_pCommDeviceList);
500+ bRet = g_pCommCommand->Init();
501+ if (bRet == FALSE)
502+ {
503+ return FALSE;
504+ }
505+
506+ return TRUE;
507+}
508+
509+//
510+// DeInit()
511+// オブジェクトインスタンスの削除
512+//
513+static void DeInit(void)
514+{
515+ // コマンド
516+ if (g_pCommCommand != NULL)
517+ {
518+ delete g_pCommCommand;
519+ g_pCommCommand = NULL;
520+ }
521+
522+ // ログリストボックス
523+ if (g_pLogListBox != NULL)
524+ {
525+ delete g_pLogListBox;
526+ g_pLogListBox = NULL;
527+ }
528+
529+ // コミュニケーションデバイスのリスト
530+ if (g_pCommDeviceList != NULL)
531+ {
532+ g_pCommDeviceList->DeInit();
533+ delete g_pCommDeviceList;
534+ g_pCommDeviceList = NULL;
535+ }
536+}
537+
538+//
539+// WinMain()
540+// プログラムのエントリポイント
541+//
542+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
543+{
544+ BOOL bRet;
545+
546+ UNREFERENCED_PARAMETER(hPrevInstance);
547+ UNREFERENCED_PARAMETER(lpCmdLine);
548+ UNREFERENCED_PARAMETER(nCmdShow);
549+
550+ // インスタンスの作成
551+ bRet = Init(hInstance);
552+ if (bRet == FALSE)
553+ {
554+ return 0;
555+ }
556+
557+ // モーダルダイアログボックスの表示
558+ DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAINDIALOG), NULL, MainDialogProc);
559+
560+ // インスタンスの終了
561+ DeInit();
562+
563+ return 0;
564+}
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/resource.h
@@ -0,0 +1,20 @@
1+#ifndef IDC_STATIC
2+#define IDC_STATIC (-1)
3+#endif
4+
5+#define IDD_MAINDIALOG 101
6+#define IDS_PORT_ENUM 40000
7+#define ID_MAINDLG_COMSTATIC 40000
8+#define IDS_PORT_EMPTY 40001
9+#define ID_MAINDLG_COMCOMBO 40001
10+#define IDS_PORT_OPEN 40002
11+#define ID_MAINDLG_LOGLIST 40002
12+#define IDS_PORT_OPENERR 40003
13+#define ID_MAINDLG_CMDSTATIC 40003
14+#define IDS_PORT_CLOSE 40004
15+#define ID_MAINDLG_CMDEDIT 40004
16+#define ID_MAINDLG_EXECBTN 40005
17+#define ID_MAINDLG_COMGROUP 40006
18+#define ID_MAINDLG_CMDGROUP 40007
19+#define ID_MAINDLG_CMDTEST 40008
20+#define ID_MAINDLG_LOGGROUP 40009
--- /dev/null
+++ b/VS2013/CANTarget5M/CANTarget5M/Source/resource.rc
@@ -0,0 +1,48 @@
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+// Dialog resources
15+//
16+LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
17+IDD_MAINDIALOG DIALOG 0, 0, 336, 330
18+STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
19+CAPTION "CANTarget5M"
20+FONT 8, "Ms Shell Dlg"
21+{
22+ GROUPBOX "コマンド", ID_MAINDLG_CMDGROUP, 12, 71, 312, 54, 0, WS_EX_LEFT
23+ LTEXT "コマンド番号入力(&N)", ID_MAINDLG_CMDSTATIC, 22, 89, 59, 9, SS_LEFT, WS_EX_LEFT
24+ EDITTEXT ID_MAINDLG_CMDEDIT, 22, 100, 69, 14, ES_AUTOHSCROLL | ES_NUMBER, WS_EX_LEFT
25+ PUSHBUTTON "コマンド実行(&X)", ID_MAINDLG_EXECBTN, 102, 90, 60, 24, 0, WS_EX_LEFT
26+ PUSHBUTTON "通信テスト(&T)", ID_MAINDLG_CMDTEST, 264, 90, 48, 24, 0, WS_EX_LEFT
27+ GROUPBOX "COMポート", ID_MAINDLG_COMGROUP, 12, 12, 312, 46, 0, WS_EX_LEFT
28+ LTEXT "COMポート選択(&P)", ID_MAINDLG_COMSTATIC, 22, 24, 56, 9, SS_LEFT, WS_EX_LEFT
29+ COMBOBOX ID_MAINDLG_COMCOMBO, 22, 39, 292, 78, CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_LEFT
30+ GROUPBOX "ログ", ID_MAINDLG_LOGGROUP, 12, 139, 312, 153, 0, WS_EX_LEFT
31+ LISTBOX ID_MAINDLG_LOGLIST, 22, 152, 292, 128, WS_TABSTOP | WS_VSCROLL | LBS_NOINTEGRALHEIGHT | LBS_NOSEL | LBS_NOTIFY, WS_EX_LEFT
32+ PUSHBUTTON "閉じる(&C)", IDCANCEL, 143, 300, 50, 22, 0, WS_EX_LEFT
33+}
34+
35+
36+
37+//
38+// String Table resources
39+//
40+LANGUAGE LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN
41+STRINGTABLE
42+{
43+ IDS_PORT_ENUM "COMポートを検出しています:"
44+ IDS_PORT_EMPTY "有効なCOMポートが見つかりません"
45+ IDS_PORT_OPEN "COMポートのオープンに成功しました:"
46+ IDS_PORT_OPENERR "COMポートのオープンに失敗しました:"
47+ IDS_PORT_CLOSE "COMポートをクローズしました:"
48+}