source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sSdCard.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 10.8 KB
Line 
1/*
2 * SDカード関連
3 *
4 * Copyright (c) 2016 Wakayama.rb Ruby Board developers
5 *
6 * This software is released under the MIT License.
7 * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
8 *
9 */
10#include <arduino.h>
11/*#include <SD.h>*/
12/*#include <RTC.h>*/
13
14#include "mruby.h"
15#include "mruby/string.h"
16
17#include "../llbruby.h"
18#include "sSdCard.h"
19
20File Fp[2];
21
22/******************************************************/
23/*ファイルが存在するかどうか調べる: SD_exists*/
24/* SD_exists( filename )*/
25/* filename: 調べるファイル名*/
26/**/
27/* 戻り値*/
28/* 存在する: 1, 存在しない: 0*/
29/******************************************************/
30mrb_value mrb_sdcard_exists(mrb_state *mrb, mrb_value self)
31{
32 mrb_value value;
33 char *str;
34 int ret = 0;
35
36 mrb_get_args(mrb, "S", &value);
37
38 str = RSTRING_PTR(value);
39
40 if (SD_exists(str) == true) {
41 ret = 1;
42 }
43
44 return mrb_fixnum_value(ret);
45}
46
47/******************************************************/
48/* ディレクトリを作成する: SD_mkdir*/
49/* SD_mkdir( dirname )*/
50/* dirname: 作成するディレクトリ名*/
51/**/
52/* 戻り値*/
53/* 成功: 1, 失敗: 0*/
54/******************************************************/
55mrb_value mrb_sdcard_mkdir(mrb_state *mrb, mrb_value self)
56{
57 mrb_value value;
58 char *str;
59 int ret = 0;
60
61 mrb_get_args(mrb, "S", &value);
62
63 str = RSTRING_PTR(value);
64
65 if (SD_mkdir(str) == true) {
66 ret = 1;
67 }
68
69 return mrb_fixnum_value(ret);
70}
71
72/******************************************************/
73/* ファイルを削除する: SD_remove*/
74/* SD_remove( filename )*/
75/* filename: 削除するファイル名*/
76/**/
77/* 戻り値*/
78/* 成功: 1, 失敗: 0*/
79/******************************************************/
80mrb_value mrb_sdcard_remove(mrb_state *mrb, mrb_value self)
81{
82 mrb_value value;
83 char *str;
84 int ret = 0;
85
86 mrb_get_args(mrb, "S", &value);
87
88 str = RSTRING_PTR(value);
89
90 if (SD_remove(str) == true) {
91 ret = 1;
92 }
93
94 return mrb_fixnum_value(ret);
95}
96
97/******************************************************/
98/* ファイルをコピーする: SD_copy*/
99/* SD_copy( srcfilename, distfilename )*/
100/* srcfilename: コピーå…
101ƒãƒ•ã‚¡ã‚¤ãƒ«å*/
102/* distfilename: コピーå…
103ˆãƒ•ã‚¡ã‚¤ãƒ«å*/
104/**/
105/* 戻り値*/
106/* 成功: 1, 失敗: 0*/
107/******************************************************/
108mrb_value mrb_sdcard_copy(mrb_state *mrb, mrb_value self)
109{
110 mrb_value value1, value2;
111 char *str1;
112 char *str2;
113 int ret = 0;
114 int v;
115 unsigned char chr[1];
116
117 mrb_get_args(mrb, "SS", &value1, &value2);
118
119 str1 = RSTRING_PTR(value1);
120 str2 = RSTRING_PTR(value2);
121
122 if (SD_exists(str2) == true) {
123 SD_remove(str2);
124 }
125
126 /*既存のファイルをコピーする*/
127 File *s = &Fp[0];
128 File *d = &Fp[1];
129
130 if (SD_open(s, str1, FILE_READ)) {
131 if (SD_open(d, str2, FILE_WRITE)) {
132 v = file_read(s);
133 while (v >= 0) {
134 chr[0] = (unsigned char)v;
135 file_write(d, chr, 1);
136 v = file_read(s);
137 }
138 ret = 1;
139 file_flush(d);
140 file_close(d);
141 }
142 file_close(s);
143 }
144
145 return mrb_fixnum_value(ret);
146}
147
148/******************************************************/
149/* ディレクトリを削除する: SD_rmdir*/
150/* SD_rmdir( dirname )*/
151/* dirname: 削除するディレクトリ名*/
152/**/
153/* 戻り値*/
154/* 成功: 1, 失敗: 0*/
155/******************************************************/
156mrb_value mrb_sdcard_rmdir(mrb_state *mrb, mrb_value self)
157{
158 mrb_value value;
159 char *str;
160 int ret = 0;
161
162 mrb_get_args(mrb, "S", &value);
163
164 str = RSTRING_PTR(value);
165
166 if (SD_rmdir(str) == true) {
167 ret = 1;
168 }
169
170 return mrb_fixnum_value(ret);
171}
172
173/******************************************************/
174/* ファイルをオープンします: SD_open*/
175/* SD_open( number, filename[, mode] )*/
176/* number: ファイル番号 0 または 1*/
177/* filename: ファイル名(8.3形式)*/
178/* mode: 0:Read, 1:Append, 2:New Create*/
179/* 戻り値*/
180/* 成功: 番号, 失敗: -1*/
181/******************************************************/
182mrb_value mrb_sdcard_open(mrb_state *mrb, mrb_value self)
183{
184 int num;
185 int mode;
186 mrb_value value;
187 char *str;
188
189 int n = mrb_get_args(mrb, "iS|i", &num, &value, &mode);
190
191 str = RSTRING_PTR(value);
192
193 if (n < 3) {
194 mode = 0;
195 }
196
197 if (mode == 2) {
198 /*新規書き込み*/
199 if (SD_exists(str) == true) {
200 SD_remove(str);
201 }
202 }
203
204 int ret = -1;
205 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
206
207 if (mode == 1 || mode == 2) {
208 if (SD_open(&Fp[num], str, FILE_WRITE)) {
209 file_seek(&Fp[num], file_size(&Fp[num]));
210 ret = num;
211 }
212 }
213 else {
214 if (SD_open(&Fp[num], str, FILE_READ)) {
215 ret = num;
216 }
217 }
218
219 return mrb_fixnum_value(ret);
220}
221
222/******************************************************/
223/* openしたファイルをクローズします: SD_close*/
224/* SD_close( number )*/
225/* number: ファイル番号 0 または 1*/
226/******************************************************/
227mrb_value mrb_sdcard_close(mrb_state *mrb, mrb_value self)
228{
229 int num;
230
231 mrb_get_args(mrb, "i", &num);
232
233 if (num >= 0 && num < 2) {
234 file_close(&Fp[num]);
235 }
236
237 return mrb_nil_value(); /*戻り値は無しですよ。*/
238}
239
240/******************************************************/
241/* openしたファイルから1バイト読み込みます: SD_read*/
242/* SD_read( number )*/
243/* number: ファイル番号 0 または 1*/
244/* 戻り値*/
245/* 0x00~0xFFが返る。ファイルの最後だったら-1が返る。*/
246/******************************************************/
247mrb_value mrb_sdcard_read(mrb_state *mrb, mrb_value self)
248{
249 int num;
250
251 mrb_get_args(mrb, "i", &num);
252
253 int dat = -1;
254 if (num < 0 || num > 1) { return mrb_fixnum_value(dat); }
255
256 dat = file_read(&Fp[num]);
257
258 return mrb_fixnum_value(dat);
259}
260
261/******************************************************/
262/* openしたファイルの読み出し位置を移動する: SD_seek*/
263/* SD_seek( number, byte )*/
264/* number: ファイル番号 0 または 1*/
265/* byte: seekするバイト数(-1)でファイルの最後に移動する*/
266/* 戻り値*/
267/* 成功: 1, 失敗: 0*/
268/******************************************************/
269mrb_value mrb_sdcard_seek(mrb_state *mrb, mrb_value self)
270{
271 int num;
272 int size;
273 int ret = 0;
274
275 mrb_get_args(mrb, "ii", &num, &size);
276
277 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
278
279 if (size == -1) {
280 if (file_seek(&Fp[num], file_size(&Fp[num]))) {
281 ret = 1;
282 }
283 }
284 else {
285 if (file_seek(&Fp[num], size)) {
286 ret = 1;
287 }
288 }
289 return mrb_fixnum_value(ret);
290}
291
292/******************************************************/
293/* openしたファイルにバイナリデータを書き込む: SD_write*/
294/* SD_write( number, buf, len )*/
295/* number: ファイル番号 0 または 1*/
296/* buf: 書き込むデータ*/
297/* len: 書き込むデータサイズ*/
298/* 戻り値*/
299/* 実際に書いたバイト数*/
300/******************************************************/
301mrb_value mrb_sdcard_write(mrb_state *mrb, mrb_value self)
302{
303 int num, len;
304 mrb_value value;
305 char *str;
306
307 mrb_get_args(mrb, "iSi", &num, &value, &len);
308
309 str = RSTRING_PTR(value);
310
311 int ret = 0;
312 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
313
314 ret = file_write(&Fp[num], (unsigned char*)str, len);
315
316 return mrb_fixnum_value(ret);
317}
318
319/******************************************************/
320/* openしたファイルの書き込みをフラッシュします: SD_flush*/
321/* SD_flush( number )*/
322/* number: ファイル番号 0 または 1*/
323/******************************************************/
324mrb_value mrb_sdcard_flush(mrb_state *mrb, mrb_value self)
325{
326 int num;
327
328 mrb_get_args(mrb, "i", &num);
329
330 if (num >= 0 && num < 2) {
331 file_flush(&Fp[num]);
332 }
333
334 return mrb_nil_value(); /*戻り値は無しですよ。*/
335}
336
337/******************************************************/
338/* openしたファイルのサイズを取得します: SD_size*/
339/* SD_size( number )*/
340/* number: ファイル番号 0 または 1*/
341/**/
342/* 戻り値*/
343/* ファイルサイズ*/
344/******************************************************/
345mrb_value mrb_sdcard_size(mrb_state *mrb, mrb_value self)
346{
347 int num;
348 mrb_int ret = 0;
349
350 mrb_get_args(mrb, "i", &num);
351
352 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
353
354 ret = file_size(&Fp[num]);
355
356 return mrb_fixnum_value(ret);
357}
358
359/******************************************************/
360/* openしたファイルのseek位置を取得します: SD_position*/
361/* SD_position( number )*/
362/* number: ファイル番号 0 または 1*/
363/**/
364/* 戻り値*/
365/* シーク位置*/
366/******************************************************/
367mrb_value mrb_sdcard_position(mrb_state *mrb, mrb_value self)
368{
369 int num;
370 mrb_int ret = 0;
371
372 mrb_get_args(mrb, "i", &num);
373
374 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
375
376 ret = file_position(&Fp[num]);
377
378 return mrb_fixnum_value(ret);
379}
380
381/******************************************************/
382/* ライブラリを定義します*/
383/******************************************************/
384int sdcard_Init(mrb_state *mrb)
385{
386 /*日付と時刻を返す関数を登録*/
387 /*SdFile::dateTimeCallback( &SD_DateTime );*/
388
389 struct RClass *sdcardModule = mrb_define_module(mrb, "SD");
390
391 mrb_define_module_function(mrb, sdcardModule, "exists", mrb_sdcard_exists, MRB_ARGS_REQ(1));
392 mrb_define_module_function(mrb, sdcardModule, "mkdir", mrb_sdcard_mkdir, MRB_ARGS_REQ(1));
393 mrb_define_module_function(mrb, sdcardModule, "remove", mrb_sdcard_remove, MRB_ARGS_REQ(1));
394 mrb_define_module_function(mrb, sdcardModule, "rename", mrb_sdcard_copy, MRB_ARGS_REQ(2));
395 mrb_define_module_function(mrb, sdcardModule, "rmdir", mrb_sdcard_rmdir, MRB_ARGS_REQ(1));
396 mrb_define_module_function(mrb, sdcardModule, "open", mrb_sdcard_open, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
397
398 mrb_define_module_function(mrb, sdcardModule, "close", mrb_sdcard_close, MRB_ARGS_REQ(1));
399 mrb_define_module_function(mrb, sdcardModule, "read", mrb_sdcard_read, MRB_ARGS_REQ(1));
400 mrb_define_module_function(mrb, sdcardModule, "seek", mrb_sdcard_seek, MRB_ARGS_REQ(2));
401 mrb_define_module_function(mrb, sdcardModule, "write", mrb_sdcard_write, MRB_ARGS_REQ(3));
402 mrb_define_module_function(mrb, sdcardModule, "flush", mrb_sdcard_flush, MRB_ARGS_REQ(1));
403 mrb_define_module_function(mrb, sdcardModule, "size", mrb_sdcard_size, MRB_ARGS_REQ(1));
404 mrb_define_module_function(mrb, sdcardModule, "position", mrb_sdcard_position, MRB_ARGS_REQ(1));
405
406 return 1;
407}
408
409/******************************************************/
410/* 日付と時刻を返すコールバック関数*/
411/******************************************************/
412void SD_DateTime(uint16_t *date, uint16_t *time)
413{
414 uint16_t year = 2000;
415 uint8_t month = 1, day = 1, hour = 0, minute = 0, second = 0;
416 time_t timertc;
417 struct tm *tm;
418
419 timertc = rtc_read();
420 tm = localtime(&timertc);
421
422 year = tm->tm_year + 1900;
423 month = tm->tm_mon;
424 day = tm->tm_mday;
425 hour = tm->tm_hour;
426 minute = tm->tm_min;
427 second = tm->tm_sec;
428
429 /* FAT_DATEマクロでフィールドを埋めて日付を返す*/
430 *date = (year - 1980) << 9 | month << 5 | day;
431
432 /* FAT_TIMEマクロでフィールドを埋めて時間を返す*/
433 *time = hour << 11 | minute << 5 | second >> 1;
434}
Note: See TracBrowser for help on using the repository browser.