This is sample program for Nucleo L152RE (and F401RE & F411RE) mbed-rtos. You need to modify mbed-src and mbed-rtos before compile it.

Dependencies:   mbed-rtos mbed-src SetRTC

Fork of GR-PEACH_test_on_rtos_works_well by Kenji Arai

Please refer below link.
/users/kenjiArai/notebook/necleo-l152re-rtos-sample-also-for-f401re--f411re-/

Committer:
kenjiArai
Date:
Sun Dec 14 09:17:01 2014 +0000
Revision:
4:76b3113c79ff
Child:
5:dccdaaa1e57b
Check rtos functions on GR-PEACH. Does NOT work on GR-PEACH but does work on LPC1768, F401RE and L152RE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 4:76b3113c79ff 1 /*
kenjiArai 4:76b3113c79ff 2 * mbed Application program
kenjiArai 4:76b3113c79ff 3 *
kenjiArai 4:76b3113c79ff 4 * Copyright (c) 2010-2014 Kenji Arai / JH1PJL
kenjiArai 4:76b3113c79ff 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 4:76b3113c79ff 6 * http://mbed.org/users/kenjiArai/
kenjiArai 4:76b3113c79ff 7 * Created: May 15th, 2010
kenjiArai 4:76b3113c79ff 8 * Spareted: June 25th, 2014 mon() & mon_hw()
kenjiArai 4:76b3113c79ff 9 * Ported: July 12th, 2014 from L152RE
kenjiArai 4:76b3113c79ff 10 * Revised: December 14th, 2014
kenjiArai 4:76b3113c79ff 11 *
kenjiArai 4:76b3113c79ff 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
kenjiArai 4:76b3113c79ff 13 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
kenjiArai 4:76b3113c79ff 14 * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kenjiArai 4:76b3113c79ff 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kenjiArai 4:76b3113c79ff 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kenjiArai 4:76b3113c79ff 17 */
kenjiArai 4:76b3113c79ff 18
kenjiArai 4:76b3113c79ff 19 #if 0
kenjiArai 4:76b3113c79ff 20 // Include ---------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 21 #include "mbed.h"
kenjiArai 4:76b3113c79ff 22 #include "rtos.h"
kenjiArai 4:76b3113c79ff 23
kenjiArai 4:76b3113c79ff 24 // Object ----------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 25 Serial pc(USBTX, USBRX);
kenjiArai 4:76b3113c79ff 26
kenjiArai 4:76b3113c79ff 27 // Definition ------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 28 #define BAUD(x) pc.baud(x)
kenjiArai 4:76b3113c79ff 29 #define GETC(x) pc.getc(x)
kenjiArai 4:76b3113c79ff 30 #define PUTC(x) pc.putc(x)
kenjiArai 4:76b3113c79ff 31 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 4:76b3113c79ff 32 #define READABLE(x) pc.readable(x)
kenjiArai 4:76b3113c79ff 33
kenjiArai 4:76b3113c79ff 34 // RAM -------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 35 char linebuf[64];
kenjiArai 4:76b3113c79ff 36 int buf_size = sizeof(linebuf);
kenjiArai 4:76b3113c79ff 37
kenjiArai 4:76b3113c79ff 38 extern float fa[3]; // Acc 0:X, 1:Y, 2:Z
kenjiArai 4:76b3113c79ff 39 extern float fg[3]; // Gyro 0:X, 1:Y, 2:Z
kenjiArai 4:76b3113c79ff 40 extern float stp;
kenjiArai 4:76b3113c79ff 41 extern float angle;
kenjiArai 4:76b3113c79ff 42 extern uint8_t show_flag;
kenjiArai 4:76b3113c79ff 43
kenjiArai 4:76b3113c79ff 44 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 45 static char *const mon_msg = "Monitor for mbed system, created on "__DATE__"";
kenjiArai 4:76b3113c79ff 46
kenjiArai 4:76b3113c79ff 47 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 48 extern void debug_interface(void);
kenjiArai 4:76b3113c79ff 49 extern int read_sw(uint8_t n);
kenjiArai 4:76b3113c79ff 50
kenjiArai 4:76b3113c79ff 51 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 52 // Control Program
kenjiArai 4:76b3113c79ff 53 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 54 // Put \r\n
kenjiArai 4:76b3113c79ff 55 void put_rn ( void ){
kenjiArai 4:76b3113c79ff 56 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 57 PUTC('\r');
kenjiArai 4:76b3113c79ff 58 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 59 PUTC('\n');
kenjiArai 4:76b3113c79ff 60 }
kenjiArai 4:76b3113c79ff 61
kenjiArai 4:76b3113c79ff 62 // Put \r
kenjiArai 4:76b3113c79ff 63 void put_r ( void ){
kenjiArai 4:76b3113c79ff 64 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 65 PUTC('\r');
kenjiArai 4:76b3113c79ff 66 }
kenjiArai 4:76b3113c79ff 67
kenjiArai 4:76b3113c79ff 68 // Put ", "
kenjiArai 4:76b3113c79ff 69 void put_lin ( void ){
kenjiArai 4:76b3113c79ff 70 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 71 PRINTF(", ");
kenjiArai 4:76b3113c79ff 72 }
kenjiArai 4:76b3113c79ff 73
kenjiArai 4:76b3113c79ff 74 // Put space n
kenjiArai 4:76b3113c79ff 75 void put_spc( uint8_t n){
kenjiArai 4:76b3113c79ff 76 for(;n > 0; n--){
kenjiArai 4:76b3113c79ff 77 PUTC(' ');
kenjiArai 4:76b3113c79ff 78 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 79 }
kenjiArai 4:76b3113c79ff 80 }
kenjiArai 4:76b3113c79ff 81
kenjiArai 4:76b3113c79ff 82 // Change string -> integer
kenjiArai 4:76b3113c79ff 83 //int xatoi (char **str, unsigned long *res){
kenjiArai 4:76b3113c79ff 84 int xatoi (char **str, int32_t *res){
kenjiArai 4:76b3113c79ff 85 unsigned long val;
kenjiArai 4:76b3113c79ff 86 unsigned char c, radix, s = 0;
kenjiArai 4:76b3113c79ff 87
kenjiArai 4:76b3113c79ff 88 while ((c = **str) == ' ') (*str)++;
kenjiArai 4:76b3113c79ff 89 if (c == '-') {
kenjiArai 4:76b3113c79ff 90 s = 1;
kenjiArai 4:76b3113c79ff 91 c = *(++(*str));
kenjiArai 4:76b3113c79ff 92 }
kenjiArai 4:76b3113c79ff 93 if (c == '0') {
kenjiArai 4:76b3113c79ff 94 c = *(++(*str));
kenjiArai 4:76b3113c79ff 95 if (c <= ' ') { *res = 0; return 1; }
kenjiArai 4:76b3113c79ff 96 if (c == 'x') {
kenjiArai 4:76b3113c79ff 97 radix = 16;
kenjiArai 4:76b3113c79ff 98 c = *(++(*str));
kenjiArai 4:76b3113c79ff 99 } else {
kenjiArai 4:76b3113c79ff 100 if (c == 'b') {
kenjiArai 4:76b3113c79ff 101 radix = 2;
kenjiArai 4:76b3113c79ff 102 c = *(++(*str));
kenjiArai 4:76b3113c79ff 103 } else {
kenjiArai 4:76b3113c79ff 104 if ((c >= '0')&&(c <= '9')){ radix = 8;
kenjiArai 4:76b3113c79ff 105 } else { return 0;}
kenjiArai 4:76b3113c79ff 106 }
kenjiArai 4:76b3113c79ff 107 }
kenjiArai 4:76b3113c79ff 108 } else {
kenjiArai 4:76b3113c79ff 109 if ((c < '1')||(c > '9')){ return 0;}
kenjiArai 4:76b3113c79ff 110 radix = 10;
kenjiArai 4:76b3113c79ff 111 }
kenjiArai 4:76b3113c79ff 112 val = 0;
kenjiArai 4:76b3113c79ff 113 while (c > ' ') {
kenjiArai 4:76b3113c79ff 114 if (c >= 'a') c -= 0x20;
kenjiArai 4:76b3113c79ff 115 c -= '0';
kenjiArai 4:76b3113c79ff 116 if (c >= 17) {
kenjiArai 4:76b3113c79ff 117 c -= 7;
kenjiArai 4:76b3113c79ff 118 if (c <= 9) return 0;
kenjiArai 4:76b3113c79ff 119 }
kenjiArai 4:76b3113c79ff 120 if (c >= radix) return 0;
kenjiArai 4:76b3113c79ff 121 val = val * radix + c;
kenjiArai 4:76b3113c79ff 122 c = *(++(*str));
kenjiArai 4:76b3113c79ff 123 }
kenjiArai 4:76b3113c79ff 124 if (s) val = -val;
kenjiArai 4:76b3113c79ff 125 *res = val;
kenjiArai 4:76b3113c79ff 126 return 1;
kenjiArai 4:76b3113c79ff 127 }
kenjiArai 4:76b3113c79ff 128
kenjiArai 4:76b3113c79ff 129 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 130 // Monitor
kenjiArai 4:76b3113c79ff 131 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 132 // Help Massage
kenjiArai 4:76b3113c79ff 133 void msg_hlp (void){
kenjiArai 4:76b3113c79ff 134 PRINTF(mon_msg); put_rn();
kenjiArai 4:76b3113c79ff 135 PRINTF("d - Show control data"); put_rn();
kenjiArai 4:76b3113c79ff 136 PRINTF("m - Show mail data"); put_rn();
kenjiArai 4:76b3113c79ff 137 PRINTF("s - Show USER Button"); put_rn();
kenjiArai 4:76b3113c79ff 138 PRINTF("t - Check and set RTC"); put_rn();
kenjiArai 4:76b3113c79ff 139 PRINTF("x - Goto HW monitor"); put_rn();
kenjiArai 4:76b3113c79ff 140 PRINTF("q - Return to main"); put_rn();
kenjiArai 4:76b3113c79ff 141 }
kenjiArai 4:76b3113c79ff 142
kenjiArai 4:76b3113c79ff 143 // Get key input data
kenjiArai 4:76b3113c79ff 144 void get_line (char *buff, int len){
kenjiArai 4:76b3113c79ff 145 char c;
kenjiArai 4:76b3113c79ff 146 int idx = 0;
kenjiArai 4:76b3113c79ff 147
kenjiArai 4:76b3113c79ff 148 for (;;) {
kenjiArai 4:76b3113c79ff 149 c = GETC();
kenjiArai 4:76b3113c79ff 150 // Added by Kenji Arai / JH1PJL May 9th, 2010
kenjiArai 4:76b3113c79ff 151 if (c == '\r') {
kenjiArai 4:76b3113c79ff 152 buff[idx++] = c;
kenjiArai 4:76b3113c79ff 153 break;
kenjiArai 4:76b3113c79ff 154 }
kenjiArai 4:76b3113c79ff 155 if ((c == '\b') && idx) {
kenjiArai 4:76b3113c79ff 156 idx--;
kenjiArai 4:76b3113c79ff 157 PUTC(c);
kenjiArai 4:76b3113c79ff 158 PUTC(' ');
kenjiArai 4:76b3113c79ff 159 PUTC(c);
kenjiArai 4:76b3113c79ff 160 }
kenjiArai 4:76b3113c79ff 161 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 4:76b3113c79ff 162 buff[idx++] = c;
kenjiArai 4:76b3113c79ff 163 PUTC(c);
kenjiArai 4:76b3113c79ff 164 }
kenjiArai 4:76b3113c79ff 165 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 166 Thread::wait(10); // Wait 10mS
kenjiArai 4:76b3113c79ff 167 }
kenjiArai 4:76b3113c79ff 168 buff[idx] = 0;
kenjiArai 4:76b3113c79ff 169 PUTC('\n');
kenjiArai 4:76b3113c79ff 170 }
kenjiArai 4:76b3113c79ff 171
kenjiArai 4:76b3113c79ff 172 // RTC related subroutines
kenjiArai 4:76b3113c79ff 173 void chk_and_set_time(char *ptr){
kenjiArai 4:76b3113c79ff 174 //unsigned long p1;
kenjiArai 4:76b3113c79ff 175 int32_t p1;
kenjiArai 4:76b3113c79ff 176 struct tm t;
kenjiArai 4:76b3113c79ff 177 time_t seconds;
kenjiArai 4:76b3113c79ff 178 char buf[40];
kenjiArai 4:76b3113c79ff 179
kenjiArai 4:76b3113c79ff 180 if (xatoi(&ptr, &p1)){
kenjiArai 4:76b3113c79ff 181 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 4:76b3113c79ff 182 PRINTF("Year:%d ",p1);
kenjiArai 4:76b3113c79ff 183 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 184 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 4:76b3113c79ff 185 PRINTF("Month:%d ",p1);
kenjiArai 4:76b3113c79ff 186 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 187 t.tm_mday = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 188 PRINTF("Day:%d ",p1);
kenjiArai 4:76b3113c79ff 189 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 190 t.tm_hour = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 191 PRINTF("Hour:%d ",p1);
kenjiArai 4:76b3113c79ff 192 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 193 t.tm_min = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 194 PRINTF("Min:%d ",p1);
kenjiArai 4:76b3113c79ff 195 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 196 t.tm_sec = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 197 PRINTF("Sec: %d \r\n",p1);
kenjiArai 4:76b3113c79ff 198 seconds = mktime(&t);
kenjiArai 4:76b3113c79ff 199 set_time(seconds);
kenjiArai 4:76b3113c79ff 200 }
kenjiArai 4:76b3113c79ff 201 seconds = time(NULL);
kenjiArai 4:76b3113c79ff 202 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 4:76b3113c79ff 203 PRINTF("Date: %s\r\n", buf);
kenjiArai 4:76b3113c79ff 204 }
kenjiArai 4:76b3113c79ff 205
kenjiArai 4:76b3113c79ff 206 // ---------- Program starts here! ---------------------------------------------------------------
kenjiArai 4:76b3113c79ff 207 int mon(void) {
kenjiArai 4:76b3113c79ff 208 char *ptr;
kenjiArai 4:76b3113c79ff 209
kenjiArai 4:76b3113c79ff 210 BAUD(9600);
kenjiArai 4:76b3113c79ff 211 put_rn();
kenjiArai 4:76b3113c79ff 212 put_rn();
kenjiArai 4:76b3113c79ff 213 PRINTF("%s [Help:'?' key]", mon_msg);
kenjiArai 4:76b3113c79ff 214 put_rn();
kenjiArai 4:76b3113c79ff 215 for (;;) {
kenjiArai 4:76b3113c79ff 216 put_r();
kenjiArai 4:76b3113c79ff 217 PUTC('>');
kenjiArai 4:76b3113c79ff 218 ptr = linebuf;
kenjiArai 4:76b3113c79ff 219 get_line(ptr, sizeof(linebuf));
kenjiArai 4:76b3113c79ff 220 switch (*ptr++) {
kenjiArai 4:76b3113c79ff 221 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 222 // Check control data
kenjiArai 4:76b3113c79ff 223 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 224 case 'd' :
kenjiArai 4:76b3113c79ff 225 while(true) {
kenjiArai 4:76b3113c79ff 226 put_r();
kenjiArai 4:76b3113c79ff 227 PRINTF("Deg:%+6.1f S:%+6.1f ", angle, stp);
kenjiArai 4:76b3113c79ff 228 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 229 PRINTF("G:%+6.1f,%+6.1f,%+6.1f ", fg[0], fg[1], fg[2]);
kenjiArai 4:76b3113c79ff 230 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 231 PRINTF("A:%+6.1f,%+6.1f,%+6.1f ", fa[0], fa[1], fa[2]);
kenjiArai 4:76b3113c79ff 232 put_rn();
kenjiArai 4:76b3113c79ff 233 if ( READABLE() ) {
kenjiArai 4:76b3113c79ff 234 break;
kenjiArai 4:76b3113c79ff 235 }
kenjiArai 4:76b3113c79ff 236 Thread::wait(200); // Wait 200mS
kenjiArai 4:76b3113c79ff 237 }
kenjiArai 4:76b3113c79ff 238 break;
kenjiArai 4:76b3113c79ff 239 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 240 // Show Mail data
kenjiArai 4:76b3113c79ff 241 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 242 case 'm' :
kenjiArai 4:76b3113c79ff 243 put_rn();
kenjiArai 4:76b3113c79ff 244 while(true) {
kenjiArai 4:76b3113c79ff 245 show_flag = 1;
kenjiArai 4:76b3113c79ff 246 if ( READABLE() ) {
kenjiArai 4:76b3113c79ff 247 break;
kenjiArai 4:76b3113c79ff 248 }
kenjiArai 4:76b3113c79ff 249 Thread::wait(100); // Wait 100mS
kenjiArai 4:76b3113c79ff 250 }
kenjiArai 4:76b3113c79ff 251 show_flag = 0;
kenjiArai 4:76b3113c79ff 252 break;
kenjiArai 4:76b3113c79ff 253 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 254 // Show switch status
kenjiArai 4:76b3113c79ff 255 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 256 case 's' :
kenjiArai 4:76b3113c79ff 257 put_r();
kenjiArai 4:76b3113c79ff 258 PRINTF("Show USER_Button status");
kenjiArai 4:76b3113c79ff 259 put_rn();
kenjiArai 4:76b3113c79ff 260 PRINTF("every 500mS - hit any key for stop");
kenjiArai 4:76b3113c79ff 261 put_rn();
kenjiArai 4:76b3113c79ff 262 while (true){
kenjiArai 4:76b3113c79ff 263 PRINTF("SW0 = ");
kenjiArai 4:76b3113c79ff 264 if (read_sw(0) == 1) { PRINTF("ON ");
kenjiArai 4:76b3113c79ff 265 } else { PRINTF("OFF");
kenjiArai 4:76b3113c79ff 266 }
kenjiArai 4:76b3113c79ff 267 PRINTF(", SW1 = ");
kenjiArai 4:76b3113c79ff 268 if (read_sw(1) == 1) { PRINTF("ON");
kenjiArai 4:76b3113c79ff 269 } else { PRINTF("OFF");
kenjiArai 4:76b3113c79ff 270 }
kenjiArai 4:76b3113c79ff 271 put_rn();
kenjiArai 4:76b3113c79ff 272 if (READABLE()){ GETC(); break;}
kenjiArai 4:76b3113c79ff 273 wait(0.5);
kenjiArai 4:76b3113c79ff 274 }
kenjiArai 4:76b3113c79ff 275 break;
kenjiArai 4:76b3113c79ff 276 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 277 // check and set RTC
kenjiArai 4:76b3113c79ff 278 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 279 case 't' :
kenjiArai 4:76b3113c79ff 280 put_r();
kenjiArai 4:76b3113c79ff 281 chk_and_set_time(ptr);
kenjiArai 4:76b3113c79ff 282 break;
kenjiArai 4:76b3113c79ff 283 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 284 // help
kenjiArai 4:76b3113c79ff 285 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 286 case '?' :
kenjiArai 4:76b3113c79ff 287 put_r();
kenjiArai 4:76b3113c79ff 288 msg_hlp();
kenjiArai 4:76b3113c79ff 289 break;
kenjiArai 4:76b3113c79ff 290 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 291 // Go to special command
kenjiArai 4:76b3113c79ff 292 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 293 case 'x' :
kenjiArai 4:76b3113c79ff 294 #if defined(TARGET_RZ_A1H)
kenjiArai 4:76b3113c79ff 295 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 296 #elif defined(TARGET_LPC1114)
kenjiArai 4:76b3113c79ff 297 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 298 #elif defined(TARGET_NUCLEO_F411RE) || defined(TARGET_STM32F401RE)
kenjiArai 4:76b3113c79ff 299 debug_interface();
kenjiArai 4:76b3113c79ff 300 #elif defined(TARGET_LPC1768)
kenjiArai 4:76b3113c79ff 301 debug_interface();
kenjiArai 4:76b3113c79ff 302 #elif defined(TARGET_K64F)
kenjiArai 4:76b3113c79ff 303 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 304 #endif
kenjiArai 4:76b3113c79ff 305 PRINTF("->Came back monitor\r\n");
kenjiArai 4:76b3113c79ff 306 break;
kenjiArai 4:76b3113c79ff 307 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 308 // Go back to main()
kenjiArai 4:76b3113c79ff 309 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 310 case 'q' : // Quit
kenjiArai 4:76b3113c79ff 311 PRINTF("\rReturn to main\r\n");
kenjiArai 4:76b3113c79ff 312 PRINTF("cannot control anymore from here\r\n");
kenjiArai 4:76b3113c79ff 313 return 0;
kenjiArai 4:76b3113c79ff 314 }
kenjiArai 4:76b3113c79ff 315 }
kenjiArai 4:76b3113c79ff 316 }
kenjiArai 4:76b3113c79ff 317 #endif
kenjiArai 4:76b3113c79ff 318
kenjiArai 4:76b3113c79ff 319 #if 1
kenjiArai 4:76b3113c79ff 320
kenjiArai 4:76b3113c79ff 321 // Include ---------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 322 #include "mbed.h"
kenjiArai 4:76b3113c79ff 323 #include "rtos.h"
kenjiArai 4:76b3113c79ff 324
kenjiArai 4:76b3113c79ff 325 // Object ----------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 326 Serial pc(USBTX, USBRX);
kenjiArai 4:76b3113c79ff 327
kenjiArai 4:76b3113c79ff 328 // Definition ------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 329 #define BAUD(x) pc.baud(x)
kenjiArai 4:76b3113c79ff 330 #define GETC(x) pc.getc(x)
kenjiArai 4:76b3113c79ff 331 #define PUTC(x) pc.putc(x)
kenjiArai 4:76b3113c79ff 332 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 4:76b3113c79ff 333 #define READABLE(x) pc.readable(x)
kenjiArai 4:76b3113c79ff 334
kenjiArai 4:76b3113c79ff 335 // RAM -------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 336 static char linebuf[64];
kenjiArai 4:76b3113c79ff 337 static int buf_size = sizeof(linebuf);
kenjiArai 4:76b3113c79ff 338
kenjiArai 4:76b3113c79ff 339 extern float fa[3]; // Acc 0:X, 1:Y, 2:Z
kenjiArai 4:76b3113c79ff 340 extern float fg[3]; // Gyro 0:X, 1:Y, 2:Z
kenjiArai 4:76b3113c79ff 341 extern float stp;
kenjiArai 4:76b3113c79ff 342 extern float angle;
kenjiArai 4:76b3113c79ff 343 extern uint8_t show_flag;
kenjiArai 4:76b3113c79ff 344
kenjiArai 4:76b3113c79ff 345 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 346 static char *const mon_msg = "Monitor for mbed system, created on "__DATE__"";
kenjiArai 4:76b3113c79ff 347
kenjiArai 4:76b3113c79ff 348 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 349 extern void debug_interface(void);
kenjiArai 4:76b3113c79ff 350 extern int read_sw(uint8_t n);
kenjiArai 4:76b3113c79ff 351
kenjiArai 4:76b3113c79ff 352 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 353 // Control Program
kenjiArai 4:76b3113c79ff 354 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 355 #if 0
kenjiArai 4:76b3113c79ff 356 // Put \r\n
kenjiArai 4:76b3113c79ff 357 extern void put_rn ( void );
kenjiArai 4:76b3113c79ff 358 // Put \r
kenjiArai 4:76b3113c79ff 359 extern void put_r ( void );
kenjiArai 4:76b3113c79ff 360 // Put ", "
kenjiArai 4:76b3113c79ff 361 extern void put_lin ( void );
kenjiArai 4:76b3113c79ff 362 // Put space n
kenjiArai 4:76b3113c79ff 363 extern void put_spc( uint8_t n);
kenjiArai 4:76b3113c79ff 364 // Change string -> integer
kenjiArai 4:76b3113c79ff 365 //int xatoi (char **str, unsigned long *res){
kenjiArai 4:76b3113c79ff 366 extern int xatoi (char **str, int32_t *res);
kenjiArai 4:76b3113c79ff 367
kenjiArai 4:76b3113c79ff 368 #else
kenjiArai 4:76b3113c79ff 369 // Put \r\n
kenjiArai 4:76b3113c79ff 370 static void put_rn ( void ){
kenjiArai 4:76b3113c79ff 371 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 372 PUTC('\r');
kenjiArai 4:76b3113c79ff 373 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 374 PUTC('\n');
kenjiArai 4:76b3113c79ff 375 }
kenjiArai 4:76b3113c79ff 376
kenjiArai 4:76b3113c79ff 377 // Put \r
kenjiArai 4:76b3113c79ff 378 static void put_r ( void ){
kenjiArai 4:76b3113c79ff 379 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 380 PUTC('\r');
kenjiArai 4:76b3113c79ff 381 }
kenjiArai 4:76b3113c79ff 382
kenjiArai 4:76b3113c79ff 383 // Put ", "
kenjiArai 4:76b3113c79ff 384 static void put_lin ( void ){
kenjiArai 4:76b3113c79ff 385 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 386 PRINTF(", ");
kenjiArai 4:76b3113c79ff 387 }
kenjiArai 4:76b3113c79ff 388
kenjiArai 4:76b3113c79ff 389 // Put space n
kenjiArai 4:76b3113c79ff 390 static void put_spc( uint8_t n){
kenjiArai 4:76b3113c79ff 391 for(;n > 0; n--){
kenjiArai 4:76b3113c79ff 392 PUTC(' ');
kenjiArai 4:76b3113c79ff 393 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 394 }
kenjiArai 4:76b3113c79ff 395 }
kenjiArai 4:76b3113c79ff 396
kenjiArai 4:76b3113c79ff 397 // Change string -> integer
kenjiArai 4:76b3113c79ff 398 //int xatoi (char **str, unsigned long *res){
kenjiArai 4:76b3113c79ff 399 static int xatoi (char **str, int32_t *res){
kenjiArai 4:76b3113c79ff 400 unsigned long val;
kenjiArai 4:76b3113c79ff 401 unsigned char c, radix, s = 0;
kenjiArai 4:76b3113c79ff 402
kenjiArai 4:76b3113c79ff 403 while ((c = **str) == ' ') (*str)++;
kenjiArai 4:76b3113c79ff 404 if (c == '-') {
kenjiArai 4:76b3113c79ff 405 s = 1;
kenjiArai 4:76b3113c79ff 406 c = *(++(*str));
kenjiArai 4:76b3113c79ff 407 }
kenjiArai 4:76b3113c79ff 408 if (c == '0') {
kenjiArai 4:76b3113c79ff 409 c = *(++(*str));
kenjiArai 4:76b3113c79ff 410 if (c <= ' ') { *res = 0; return 1; }
kenjiArai 4:76b3113c79ff 411 if (c == 'x') {
kenjiArai 4:76b3113c79ff 412 radix = 16;
kenjiArai 4:76b3113c79ff 413 c = *(++(*str));
kenjiArai 4:76b3113c79ff 414 } else {
kenjiArai 4:76b3113c79ff 415 if (c == 'b') {
kenjiArai 4:76b3113c79ff 416 radix = 2;
kenjiArai 4:76b3113c79ff 417 c = *(++(*str));
kenjiArai 4:76b3113c79ff 418 } else {
kenjiArai 4:76b3113c79ff 419 if ((c >= '0')&&(c <= '9')){ radix = 8;
kenjiArai 4:76b3113c79ff 420 } else { return 0;}
kenjiArai 4:76b3113c79ff 421 }
kenjiArai 4:76b3113c79ff 422 }
kenjiArai 4:76b3113c79ff 423 } else {
kenjiArai 4:76b3113c79ff 424 if ((c < '1')||(c > '9')){ return 0;}
kenjiArai 4:76b3113c79ff 425 radix = 10;
kenjiArai 4:76b3113c79ff 426 }
kenjiArai 4:76b3113c79ff 427 val = 0;
kenjiArai 4:76b3113c79ff 428 while (c > ' ') {
kenjiArai 4:76b3113c79ff 429 if (c >= 'a') c -= 0x20;
kenjiArai 4:76b3113c79ff 430 c -= '0';
kenjiArai 4:76b3113c79ff 431 if (c >= 17) {
kenjiArai 4:76b3113c79ff 432 c -= 7;
kenjiArai 4:76b3113c79ff 433 if (c <= 9) return 0;
kenjiArai 4:76b3113c79ff 434 }
kenjiArai 4:76b3113c79ff 435 if (c >= radix) return 0;
kenjiArai 4:76b3113c79ff 436 val = val * radix + c;
kenjiArai 4:76b3113c79ff 437 c = *(++(*str));
kenjiArai 4:76b3113c79ff 438 }
kenjiArai 4:76b3113c79ff 439 if (s) val = -val;
kenjiArai 4:76b3113c79ff 440 *res = val;
kenjiArai 4:76b3113c79ff 441 return 1;
kenjiArai 4:76b3113c79ff 442 }
kenjiArai 4:76b3113c79ff 443 #endif
kenjiArai 4:76b3113c79ff 444
kenjiArai 4:76b3113c79ff 445 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 446 // Monitor
kenjiArai 4:76b3113c79ff 447 //-------------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 448 // Help Massage
kenjiArai 4:76b3113c79ff 449 static void msg_hlp (void){
kenjiArai 4:76b3113c79ff 450 PRINTF(mon_msg); put_rn();
kenjiArai 4:76b3113c79ff 451 PRINTF("d - Show control data"); put_rn();
kenjiArai 4:76b3113c79ff 452 PRINTF("m - Show mail data"); put_rn();
kenjiArai 4:76b3113c79ff 453 PRINTF("s - Show USER Button"); put_rn();
kenjiArai 4:76b3113c79ff 454 PRINTF("t - Check and set RTC"); put_rn();
kenjiArai 4:76b3113c79ff 455 PRINTF("x - Goto HW monitor"); put_rn();
kenjiArai 4:76b3113c79ff 456 PRINTF("q - Return to main"); put_rn();
kenjiArai 4:76b3113c79ff 457 }
kenjiArai 4:76b3113c79ff 458
kenjiArai 4:76b3113c79ff 459 #if 0
kenjiArai 4:76b3113c79ff 460 extern void get_line (char *buff, int len);
kenjiArai 4:76b3113c79ff 461
kenjiArai 4:76b3113c79ff 462 // RTC related subroutines
kenjiArai 4:76b3113c79ff 463 extern void chk_and_set_time(char *ptr);
kenjiArai 4:76b3113c79ff 464
kenjiArai 4:76b3113c79ff 465 #else
kenjiArai 4:76b3113c79ff 466 // Get key input data
kenjiArai 4:76b3113c79ff 467 static void get_line (char *buff, int len){
kenjiArai 4:76b3113c79ff 468 char c;
kenjiArai 4:76b3113c79ff 469 int idx = 0;
kenjiArai 4:76b3113c79ff 470
kenjiArai 4:76b3113c79ff 471 for (;;) {
kenjiArai 4:76b3113c79ff 472 c = GETC();
kenjiArai 4:76b3113c79ff 473 // Added by Kenji Arai / JH1PJL May 9th, 2010
kenjiArai 4:76b3113c79ff 474 if (c == '\r') {
kenjiArai 4:76b3113c79ff 475 buff[idx++] = c;
kenjiArai 4:76b3113c79ff 476 break;
kenjiArai 4:76b3113c79ff 477 }
kenjiArai 4:76b3113c79ff 478 if ((c == '\b') && idx) {
kenjiArai 4:76b3113c79ff 479 idx--;
kenjiArai 4:76b3113c79ff 480 PUTC(c);
kenjiArai 4:76b3113c79ff 481 PUTC(' ');
kenjiArai 4:76b3113c79ff 482 PUTC(c);
kenjiArai 4:76b3113c79ff 483 }
kenjiArai 4:76b3113c79ff 484 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 4:76b3113c79ff 485 buff[idx++] = c;
kenjiArai 4:76b3113c79ff 486 PUTC(c);
kenjiArai 4:76b3113c79ff 487 }
kenjiArai 4:76b3113c79ff 488 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 489 Thread::wait(10); // Wait 10mS
kenjiArai 4:76b3113c79ff 490 }
kenjiArai 4:76b3113c79ff 491 buff[idx] = 0;
kenjiArai 4:76b3113c79ff 492 PUTC('\n');
kenjiArai 4:76b3113c79ff 493 }
kenjiArai 4:76b3113c79ff 494
kenjiArai 4:76b3113c79ff 495 // RTC related subroutines
kenjiArai 4:76b3113c79ff 496 static void chk_and_set_time(char *ptr){
kenjiArai 4:76b3113c79ff 497 //unsigned long p1;
kenjiArai 4:76b3113c79ff 498 int32_t p1;
kenjiArai 4:76b3113c79ff 499 struct tm t;
kenjiArai 4:76b3113c79ff 500 time_t seconds;
kenjiArai 4:76b3113c79ff 501 char buf[40];
kenjiArai 4:76b3113c79ff 502
kenjiArai 4:76b3113c79ff 503 if (xatoi(&ptr, &p1)){
kenjiArai 4:76b3113c79ff 504 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 4:76b3113c79ff 505 PRINTF("Year:%d ",p1);
kenjiArai 4:76b3113c79ff 506 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 507 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 4:76b3113c79ff 508 PRINTF("Month:%d ",p1);
kenjiArai 4:76b3113c79ff 509 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 510 t.tm_mday = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 511 PRINTF("Day:%d ",p1);
kenjiArai 4:76b3113c79ff 512 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 513 t.tm_hour = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 514 PRINTF("Hour:%d ",p1);
kenjiArai 4:76b3113c79ff 515 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 516 t.tm_min = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 517 PRINTF("Min:%d ",p1);
kenjiArai 4:76b3113c79ff 518 xatoi( &ptr, &p1 );
kenjiArai 4:76b3113c79ff 519 t.tm_sec = (uint8_t)p1;
kenjiArai 4:76b3113c79ff 520 PRINTF("Sec: %d \r\n",p1);
kenjiArai 4:76b3113c79ff 521 seconds = mktime(&t);
kenjiArai 4:76b3113c79ff 522 set_time(seconds);
kenjiArai 4:76b3113c79ff 523 }
kenjiArai 4:76b3113c79ff 524 seconds = time(NULL);
kenjiArai 4:76b3113c79ff 525 strftime(buf, 40, "%B %d,'%y, %H:%M:%S", localtime(&seconds));
kenjiArai 4:76b3113c79ff 526 PRINTF("Date: %s\r\n", buf);
kenjiArai 4:76b3113c79ff 527 }
kenjiArai 4:76b3113c79ff 528 #endif
kenjiArai 4:76b3113c79ff 529
kenjiArai 4:76b3113c79ff 530 // ---------- Program starts here! ---------------------------------------------------------------
kenjiArai 4:76b3113c79ff 531 int mon(void) {
kenjiArai 4:76b3113c79ff 532 char *ptr;
kenjiArai 4:76b3113c79ff 533
kenjiArai 4:76b3113c79ff 534 BAUD(9600);
kenjiArai 4:76b3113c79ff 535 put_rn();
kenjiArai 4:76b3113c79ff 536 put_rn();
kenjiArai 4:76b3113c79ff 537 PRINTF("%s [Help:'?' key]", mon_msg);
kenjiArai 4:76b3113c79ff 538 put_rn();
kenjiArai 4:76b3113c79ff 539 for (;;) {
kenjiArai 4:76b3113c79ff 540 put_r();
kenjiArai 4:76b3113c79ff 541 PUTC('>');
kenjiArai 4:76b3113c79ff 542 ptr = linebuf;
kenjiArai 4:76b3113c79ff 543 get_line(ptr, sizeof(linebuf));
kenjiArai 4:76b3113c79ff 544 switch (*ptr++) {
kenjiArai 4:76b3113c79ff 545 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 546 // Check control data
kenjiArai 4:76b3113c79ff 547 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 548 case 'd' :
kenjiArai 4:76b3113c79ff 549 while(true) {
kenjiArai 4:76b3113c79ff 550 put_r();
kenjiArai 4:76b3113c79ff 551 PRINTF("Deg:%+6.1f S:%+6.1f ", angle, stp);
kenjiArai 4:76b3113c79ff 552 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 553 PRINTF("G:%+6.1f,%+6.1f,%+6.1f ", fg[0], fg[1], fg[2]);
kenjiArai 4:76b3113c79ff 554 Thread::yield(); // change thread
kenjiArai 4:76b3113c79ff 555 PRINTF("A:%+6.1f,%+6.1f,%+6.1f ", fa[0], fa[1], fa[2]);
kenjiArai 4:76b3113c79ff 556 put_rn();
kenjiArai 4:76b3113c79ff 557 if ( READABLE() ) {
kenjiArai 4:76b3113c79ff 558 break;
kenjiArai 4:76b3113c79ff 559 }
kenjiArai 4:76b3113c79ff 560 Thread::wait(200); // Wait 200mS
kenjiArai 4:76b3113c79ff 561 }
kenjiArai 4:76b3113c79ff 562 break;
kenjiArai 4:76b3113c79ff 563 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 564 // Show Mail data
kenjiArai 4:76b3113c79ff 565 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 566 case 'm' :
kenjiArai 4:76b3113c79ff 567 put_rn();
kenjiArai 4:76b3113c79ff 568 while(true) {
kenjiArai 4:76b3113c79ff 569 show_flag = 1;
kenjiArai 4:76b3113c79ff 570 if ( READABLE() ) {
kenjiArai 4:76b3113c79ff 571 break;
kenjiArai 4:76b3113c79ff 572 }
kenjiArai 4:76b3113c79ff 573 Thread::wait(100); // Wait 100mS
kenjiArai 4:76b3113c79ff 574 }
kenjiArai 4:76b3113c79ff 575 show_flag = 0;
kenjiArai 4:76b3113c79ff 576 break;
kenjiArai 4:76b3113c79ff 577 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 578 // Show switch status
kenjiArai 4:76b3113c79ff 579 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 580 case 's' :
kenjiArai 4:76b3113c79ff 581 put_r();
kenjiArai 4:76b3113c79ff 582 PRINTF("Show USER_Button status");
kenjiArai 4:76b3113c79ff 583 put_rn();
kenjiArai 4:76b3113c79ff 584 PRINTF("every 500mS - hit any key for stop");
kenjiArai 4:76b3113c79ff 585 put_rn();
kenjiArai 4:76b3113c79ff 586 while (true){
kenjiArai 4:76b3113c79ff 587 PRINTF("SW0 = ");
kenjiArai 4:76b3113c79ff 588 if (read_sw(0) == 1) { PRINTF("ON ");
kenjiArai 4:76b3113c79ff 589 } else { PRINTF("OFF");
kenjiArai 4:76b3113c79ff 590 }
kenjiArai 4:76b3113c79ff 591 PRINTF(", SW1 = ");
kenjiArai 4:76b3113c79ff 592 if (read_sw(1) == 1) { PRINTF("ON");
kenjiArai 4:76b3113c79ff 593 } else { PRINTF("OFF");
kenjiArai 4:76b3113c79ff 594 }
kenjiArai 4:76b3113c79ff 595 put_rn();
kenjiArai 4:76b3113c79ff 596 if (READABLE()){ GETC(); break;}
kenjiArai 4:76b3113c79ff 597 wait(0.5);
kenjiArai 4:76b3113c79ff 598 }
kenjiArai 4:76b3113c79ff 599 break;
kenjiArai 4:76b3113c79ff 600 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 601 // check and set RTC
kenjiArai 4:76b3113c79ff 602 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 603 case 't' :
kenjiArai 4:76b3113c79ff 604 put_r();
kenjiArai 4:76b3113c79ff 605 chk_and_set_time(ptr);
kenjiArai 4:76b3113c79ff 606 break;
kenjiArai 4:76b3113c79ff 607 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 608 // help
kenjiArai 4:76b3113c79ff 609 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 610 case '?' :
kenjiArai 4:76b3113c79ff 611 put_r();
kenjiArai 4:76b3113c79ff 612 msg_hlp();
kenjiArai 4:76b3113c79ff 613 break;
kenjiArai 4:76b3113c79ff 614 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 615 // Go to special command
kenjiArai 4:76b3113c79ff 616 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 617 case 'x' :
kenjiArai 4:76b3113c79ff 618 #if defined(TARGET_RZ_A1H)
kenjiArai 4:76b3113c79ff 619 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 620 #elif defined(TARGET_LPC1114)
kenjiArai 4:76b3113c79ff 621 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 622 #elif defined(TARGET_NUCLEO_F411RE) || defined(TARGET_STM32F401RE)
kenjiArai 4:76b3113c79ff 623 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 624 #elif defined(TARGET_LPC1768)
kenjiArai 4:76b3113c79ff 625 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 626 #elif defined(TARGET_K64F)
kenjiArai 4:76b3113c79ff 627 PRINTF("Not implement yet\r\n");
kenjiArai 4:76b3113c79ff 628 #endif
kenjiArai 4:76b3113c79ff 629 PRINTF("->Came back monitor\r\n");
kenjiArai 4:76b3113c79ff 630 break;
kenjiArai 4:76b3113c79ff 631 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 632 // Go back to main()
kenjiArai 4:76b3113c79ff 633 //---------------------------------------------------------------------------------------------
kenjiArai 4:76b3113c79ff 634 case 'q' : // Quit
kenjiArai 4:76b3113c79ff 635 PRINTF("\rReturn to main\r\n");
kenjiArai 4:76b3113c79ff 636 PRINTF("cannot control anymore from here\r\n");
kenjiArai 4:76b3113c79ff 637 return 0;
kenjiArai 4:76b3113c79ff 638 }
kenjiArai 4:76b3113c79ff 639 }
kenjiArai 4:76b3113c79ff 640 }
kenjiArai 4:76b3113c79ff 641
kenjiArai 4:76b3113c79ff 642 #endif
kenjiArai 4:76b3113c79ff 643