M16C/5Mマイコンを使用したCAN動作チェッカー
Revision | de3126571c9e91b128130c541b3db9ca9751937f (tree) |
---|---|
Time | 2017-01-09 18:00:32 |
Author | Yasushi Tanaka <tanaka_yasushi2008@yaho...> |
Commiter | Yasushi Tanaka |
新規作成
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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 | +} |
@@ -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 | +}; |
@@ -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 | +} |
@@ -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 | +}; |
@@ -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 | +} |
@@ -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 | +}; |
@@ -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 |
@@ -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 | +} |
@@ -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 | +}; |
@@ -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 | +} |
@@ -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> |
@@ -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 | +} |
@@ -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 |
@@ -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 | +} |