source: anotherchoice/tags/jsp-1.4.4-full-UTF8/windev/devicecontrol/devicecontrol.cpp@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 6.3 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: devicecontrol.cpp,v 1.4 2003/12/20 09:19:59 takayuki Exp $
51 */
52
53#include "stdafx.h"
54#include "device.h"
55#include "devicecontrol.h"
56
57/////////////////////////////////////////////////////////////////////////////
58// CDeviceControl
59
60const CLSID CLSID_Device = {0xFEE2A68B,0x7F98,0x40E0,{0x98,0x53,0x18,0x3E,0xE6,0x8B,0xC7,0xF8}};
61
62STDMETHODIMP CDeviceControl::Connect()
63{
64 if(!FAILED(manager.CoCreateInstance(CLSID_Device)) && !FAILED(manager.Advise((_IDeviceEvents *)this,__uuidof(_IDeviceEvents),&cookie))) {
65 STARTUPINFO info;
66
67 info.cb = sizeof(info);
68 GetStartupInfo(&info);
69
70 devname.Empty();
71 devname.Append(info.lpTitle);
72 manager->SetDeviceName(devname);
73
74 return S_OK;
75 }
76
77 if(! !manager)
78 manager.Release();
79
80 return E_FAIL;
81}
82
83STDMETHODIMP CDeviceControl::Close()
84{
85 if(!manager)
86 return E_FAIL;
87
88 AtlUnadvise(manager,__uuidof(_IDeviceEvents),cookie);
89 manager.Release();
90 cookie = 0;
91 return S_OK;
92}
93
94STDMETHODIMP CDeviceControl::get_Valid(BOOL *pVal)
95{
96 *pVal = !manager ? FALSE : ~0;
97 return S_OK;
98}
99
100STDMETHODIMP CDeviceControl::RaiseInterrupt(long inhno)
101{
102 if(!manager)
103 return E_FAIL;
104
105 return manager->RaiseInterrupt(inhno);
106}
107
108STDMETHODIMP CDeviceControl::Map(long address, long size)
109{
110 if(!manager)
111 return E_FAIL;
112
113 return manager->Map(address, size);
114}
115
116STDMETHODIMP CDeviceControl::Unmap(long address)
117{
118 if(!manager)
119 return E_FAIL;
120
121 return manager->Unmap(address);
122}
123
124
125STDMETHODIMP CDeviceControl::get_IsKernelStarted(BOOL *pVal)
126{
127 *pVal = KernelStarted ? ~0 : 0;
128 return S_OK;
129}
130
131STDMETHODIMP CDeviceControl::get_Offset(long *pVal)
132{
133 *pVal = Offset;
134 return S_OK;
135}
136
137STDMETHODIMP CDeviceControl::put_Offset(long newVal)
138{
139 if(newVal >= Limitation)
140 return E_FAIL;
141
142 Offset = newVal;
143
144 return S_OK;
145}
146
147STDMETHODIMP CDeviceControl::get_AccessSize(short *pVal)
148{
149 *pVal = AccessSize;
150 return S_OK;
151}
152
153STDMETHODIMP CDeviceControl::put_AccessSize(short newVal)
154{
155 switch(newVal)
156 {
157 case 1: case 2: case 4:
158 break;
159 default:
160 return E_FAIL;
161 }
162
163 AccessSize = newVal;
164 return S_OK;
165}
166
167STDMETHODIMP CDeviceControl::get_Value(long *pVal)
168{
169 if(DataPointer == 0)
170 return E_FAIL;
171
172 *pVal = 0;
173 CopyMemory(pVal, DataPointer + Offset, AccessSize);
174
175 Offset += AccessSize;
176 if(Offset >= Limitation)
177 Offset = Limitation -1;
178
179 return S_OK;
180}
181
182STDMETHODIMP CDeviceControl::put_Value(long newVal)
183{
184 if(DataPointer == 0)
185 return E_FAIL;
186
187 CopyMemory(DataPointer + Offset, &newVal, AccessSize);
188
189 Offset += AccessSize;
190 if(Offset >= Limitation)
191 Offset = Limitation -1;
192
193 return S_OK;
194}
195
196STDMETHODIMP CDeviceControl::OnRead(long address,long sz,byte __RPC_FAR data[])
197{
198 if(!KernelStarted)
199 this->OnKernelStart();
200
201 DataPointer = (unsigned char *)data;
202 Limitation = sz;
203 Offset = 0;
204
205 Fire_OnRead(address, sz);
206
207 DataPointer = 0;
208 return S_OK;
209}
210
211STDMETHODIMP CDeviceControl::OnWrite(long address,long sz,byte __RPC_FAR data[])
212{
213 if(!KernelStarted)
214 this->OnKernelStart();
215
216 DataPointer = (unsigned char *)data;
217 Limitation = sz;
218 Offset = 0;
219 Fire_OnWrite(address,sz);
220 DataPointer = 0;
221 return S_OK;
222}
223
224STDMETHODIMP CDeviceControl::OnKernelStart()
225{
226 KernelStarted = true;
227 Fire_OnKernelStart();
228 return S_OK;
229}
230
231STDMETHODIMP CDeviceControl::OnKernelExit()
232{
233 KernelStarted = false;
234 Fire_OnKernelExit();
235 return S_OK;
236}
237
238STDMETHODIMP CDeviceControl::get_DeviceName(BSTR* pVal)
239{
240 if(!manager)
241 return E_FAIL;
242
243 devname.CopyTo(pVal);
244 return S_OK;
245}
246
247STDMETHODIMP CDeviceControl::put_DeviceName(BSTR newVal)
248{
249 if(!manager)
250 return E_FAIL;
251
252 devname = newVal;
253 manager->SetDeviceName(devname);
254 return S_OK;
255}
Note: See TracBrowser for help on using the repository browser.