Develop and Download Open Source Software

Browse Subversion Repository

Contents of /gyroscopic/Tds01vCtrl.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 379 - (show annotations) (download) (as text)
Mon Apr 19 19:53:12 2010 UTC (13 years, 11 months ago) by satofumi
File MIME type: text/x-c++src
File size: 5174 byte(s)
コンパイルエラーを修正
1 /*!
2 \file
3 \brief HŒŽ‚Ě TDS01V ‚̐§Œä
4
5 \author Satofumi KAMIMURA
6
7 $Id$
8 */
9
10 #include "Tds01vCtrl.h"
11 #include "SerialCtrl.h"
12 #include "Delay.h"
13 #include <cstdlib>
14
15 using namespace beego;
16
17
18 struct Tds01vCtrl::pImpl {
19 enum {
20 Baudrate = 9600,
21 Timeout = 100,
22 MagnetismResetTimes = 4,
23 };
24 std::string error_message;
25 SerialCtrl con;
26 int recv_times;
27 double direction_offset;
28
29 pImpl(void)
30 : error_message("no error."), recv_times(0), direction_offset(0.0) {
31 }
32
33 ~pImpl(void) {
34 stop();
35 }
36
37 // ACK ‚̏ˆ—
38 bool sendTag(const char* command, size_t size) {
39
40 enum { MaxByte = 7 };
41 char send_buffer[(MaxByte * 2) + 2];
42 for (size_t i = 0; i < size; ++i) {
43 sprintf(&send_buffer[i * 2], "%02X\r\n",
44 static_cast<unsigned char>(command[i]));
45 }
46 size_t send_size = (size * 2) + 2;
47 int n = con.send(send_buffer, send_size);
48 #if 0
49 fprintf(stderr, "send size: %d\n", n);
50 for (size_t i = 0; i < send_size-2; ++i) {
51 fprintf(stderr, "%c ", send_buffer[i]);
52 }
53 fprintf(stderr, "\n");
54 #endif
55 if (n < static_cast<int>(send_size)) {
56 return false;
57 }
58
59 enum { RecvSize = 4 };
60 char recv_buffer[RecvSize];
61 n = con.recv(recv_buffer, RecvSize, Timeout);
62 #if 0
63 fprintf(stderr, "recv size : %d\n", n);
64 for (int i = 0; i < n-2; ++i) {
65 fprintf(stderr, "%c ", recv_buffer[i]);
66 }
67 fprintf(stderr, "\n");
68 #endif
69 recv_buffer[RecvSize -1] = '\0';
70 char reply = strtol(recv_buffer, NULL, 16);
71
72 if (reply != ~command[0]) {
73 return false;
74 }
75 return true;
76 }
77
78 bool initializeDevice(void) {
79
80 // ƒ\ƒtƒgƒEƒFƒAƒŠƒZƒbƒg‚đs‚¤
81 char reset_message[] = { 0x0f };
82 if (! sendTag(reset_message, sizeof(reset_message))) {
83 error_message = "fail reset command.";
84 return false;
85 }
86 delay(250 + 50); // ƒŠƒZƒbƒg‚É‚ć‚č’ʐM‚Ş•s’ʂɂȂ鎞ŠÔ
87
88 // Œv‘ŞđŒÝ’č
89 char init_message[] = { 0x05,
90 0x01, // ‘Ş’čŽüŠú 100 [msec]
91 10000 >> 8, 10000 & 0xff, // 1000 [hpa]
92 0000 >> 8, 0000 & 0xff }; // 0.0 [deg]
93 if (! sendTag(init_message, sizeof(init_message))) {
94 error_message = "in measure initialize command sending...";
95 return false;
96 }
97
98 // ƒZƒ“ƒTî•ń€–ڐݒč
99 char measure_message[] = { 0x0d,
100 0x84 }; // •űˆĘŠpî•ń
101 if (! sendTag(measure_message, sizeof(measure_message))) {
102 error_message = "in measure type command sending...";
103 return false;
104 }
105
106 if (! initializeMagnetism()) {
107 return false;
108 }
109
110 // Œv‘ŞŠJŽn
111 char start_message[] = { 0x21 };
112 if (! sendTag(start_message, sizeof(start_message))) {
113 error_message = "in start command sending...";
114 return false;
115 }
116 delay(100); // Ĺ‰‚Ě‘Ş’č‚ŞI‚í‚é‚Ě‚đ‘Ň‚Â
117 // !!! –{—ˆ‚́uó‘Ô—v‹v‚Ĺ‘Îˆ‚ˇ‚ׂŤ
118
119 return true;
120 }
121
122 bool initializeMagnetism(void) {
123 // ’nŽĽ‹CƒZƒ“ƒT‰Šú‰ť
124 char magnetism_command[] = { 0x27 };
125 if (! sendTag(magnetism_command, sizeof(magnetism_command))) {
126 error_message = "magnetism initialize command.";
127 return false;
128 }
129 return true;
130 }
131
132 void stop(void) {
133 // Œv‘Ş’âŽ~
134 char start_message[] = { 0x23 };
135 if (! sendTag(start_message, sizeof(start_message))) {
136 error_message = "start command.";
137 }
138 }
139 };
140
141
142 Tds01vCtrl::Tds01vCtrl(void) : pimpl(new pImpl) {
143 }
144
145
146 Tds01vCtrl::~Tds01vCtrl(void) {
147 }
148
149
150 const char* Tds01vCtrl::what(void) {
151 return pimpl->error_message.c_str();
152 }
153
154
155 bool Tds01vCtrl::connect(const char* device) {
156
157 if (! pimpl->con.connect(device, pImpl::Baudrate)) {
158 pimpl->error_message = pimpl->con.what();
159 return false;
160 }
161 pimpl->con.skip(10);
162 return pimpl->initializeDevice();
163 }
164
165
166 void Tds01vCtrl::disconnect(void) {
167 pimpl->con.disconnect();
168 }
169
170
171 bool Tds01vCtrl::isConnected(void) {
172 return pimpl->con.isConnected();
173 }
174
175
176 double Tds01vCtrl::getDirection(void) {
177
178 // ŽžXA’nŽĽ‹CƒZƒ“ƒT‰Šú‰ť—v‹‚đŒÄ‚яo‚ˇ
179 ++pimpl->recv_times;
180 if (pimpl->recv_times > pImpl::MagnetismResetTimes) {
181 pimpl->initializeMagnetism();
182 pimpl->recv_times = 0;
183 }
184
185 // ó‘Ô—v‹
186 // !!!
187 // Œv‘ރf[ƒ^XVĎ‚݁A‚đŠú‘Ň
188 // ‚Ƃ肠‚Ś‚¸Č—Ş
189
190 // Œv‘ŞŒ‹‰Ę‚̎擞
191 enum { SendSize = 4 };
192 char send_buffer[SendSize];
193 sprintf(send_buffer, "%02X\r\n", 0x29);
194 int n = pimpl->con.send(send_buffer, SendSize);
195 if (n < SendSize) {
196 pimpl->error_message = "require command send.";
197 return -1.0;
198 }
199
200 // !!! ‚Ƃ肠‚Ś‚¸A•űˆĘŠp‚ɑΉž
201 enum { RecvSize = 6 };
202 char recv_buffer[RecvSize];
203 n = pimpl->con.recv(recv_buffer, RecvSize, pImpl::Timeout);
204
205 #if 0
206 fprintf(stderr, "data size : %d\n", n);
207 for (int i = 0; i < n-2; ++i) {
208 fprintf(stderr, "%c ", recv_buffer[i]);
209 }
210 fprintf(stderr, "\n");
211 #endif
212
213 if (n < RecvSize) {
214 pimpl->error_message = "require command recv.";
215 return -1.0;
216 }
217 recv_buffer[RecvSize -1] = '\0';
218 int degree_value = strtol(recv_buffer, NULL, 16);
219
220 return 360.0 -degree_value / 10.0;
221 }
222
223
224 void Tds01vCtrl::setDirectionOffset(double direction_offset) {
225 pimpl->direction_offset = direction_offset;
226 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26