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

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

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
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/* distfilename: コピー先ファイル名*/
102/**/
103/* 戻り値*/
104/* 成功: 1, 失敗: 0*/
105/******************************************************/
106mrb_value mrb_sdcard_copy(mrb_state *mrb, mrb_value self)
107{
108 mrb_value value1, value2;
109 char *str1;
110 char *str2;
111 int ret = 0;
112 int v;
113 unsigned char chr[1];
114
115 mrb_get_args(mrb, "SS", &value1, &value2);
116
117 str1 = RSTRING_PTR(value1);
118 str2 = RSTRING_PTR(value2);
119
120 if (SD_exists(str2) == true) {
121 SD_remove(str2);
122 }
123
124 /*既存のファイルをコピーする*/
125 File *s = &Fp[0];
126 File *d = &Fp[1];
127
128 if (SD_open(s, str1, FILE_READ)) {
129 if (SD_open(d, str2, FILE_WRITE)) {
130 v = file_read(s);
131 while (v >= 0) {
132 chr[0] = (unsigned char)v;
133 file_write(d, chr, 1);
134 v = file_read(s);
135 }
136 ret = 1;
137 file_flush(d);
138 file_close(d);
139 }
140 file_close(s);
141 }
142
143 return mrb_fixnum_value(ret);
144}
145
146/******************************************************/
147/* ディレクトリを削除する: SD_rmdir*/
148/* SD_rmdir( dirname )*/
149/* dirname: 削除するディレクトリ名*/
150/**/
151/* 戻り値*/
152/* 成功: 1, 失敗: 0*/
153/******************************************************/
154mrb_value mrb_sdcard_rmdir(mrb_state *mrb, mrb_value self)
155{
156 mrb_value value;
157 char *str;
158 int ret = 0;
159
160 mrb_get_args(mrb, "S", &value);
161
162 str = RSTRING_PTR(value);
163
164 if (SD_rmdir(str) == true) {
165 ret = 1;
166 }
167
168 return mrb_fixnum_value(ret);
169}
170
171/******************************************************/
172/* ファイルをオープンします: SD_open*/
173/* SD_open( number, filename[, mode] )*/
174/* number: ファイル番号 0 または 1*/
175/* filename: ファイル名(8.3形式)*/
176/* mode: 0:Read, 1:Append, 2:New Create*/
177/* 戻り値*/
178/* 成功: 番号, 失敗: -1*/
179/******************************************************/
180mrb_value mrb_sdcard_open(mrb_state *mrb, mrb_value self)
181{
182 int num;
183 int mode;
184 mrb_value value;
185 char *str;
186
187 int n = mrb_get_args(mrb, "iS|i", &num, &value, &mode);
188
189 str = RSTRING_PTR(value);
190
191 if (n < 3) {
192 mode = 0;
193 }
194
195 if (mode == 2) {
196 /*新規書き込み*/
197 if (SD_exists(str) == true) {
198 SD_remove(str);
199 }
200 }
201
202 int ret = -1;
203 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
204
205 if (mode == 1 || mode == 2) {
206 if (SD_open(&Fp[num], str, FILE_WRITE)) {
207 file_seek(&Fp[num], file_size(&Fp[num]));
208 ret = num;
209 }
210 }
211 else {
212 if (SD_open(&Fp[num], str, FILE_READ)) {
213 ret = num;
214 }
215 }
216
217 return mrb_fixnum_value(ret);
218}
219
220/******************************************************/
221/* openしたファイルをクローズします: SD_close*/
222/* SD_close( number )*/
223/* number: ファイル番号 0 または 1*/
224/******************************************************/
225mrb_value mrb_sdcard_close(mrb_state *mrb, mrb_value self)
226{
227 int num;
228
229 mrb_get_args(mrb, "i", &num);
230
231 if (num >= 0 && num < 2) {
232 file_close(&Fp[num]);
233 }
234
235 return mrb_nil_value(); /*戻り値は無しですよ。*/
236}
237
238/******************************************************/
239/* openしたファイルから1バイト読み込みます: SD_read*/
240/* SD_read( number )*/
241/* number: ファイル番号 0 または 1*/
242/* 戻り値*/
243/* 0x00~0xFFが返る。ファイルの最後だったら-1が返る。*/
244/******************************************************/
245mrb_value mrb_sdcard_read(mrb_state *mrb, mrb_value self)
246{
247 int num;
248
249 mrb_get_args(mrb, "i", &num);
250
251 int dat = -1;
252 if (num < 0 || num > 1) { return mrb_fixnum_value(dat); }
253
254 dat = file_read(&Fp[num]);
255
256 return mrb_fixnum_value(dat);
257}
258
259/******************************************************/
260/* openしたファイルの読み出し位置を移動する: SD_seek*/
261/* SD_seek( number, byte )*/
262/* number: ファイル番号 0 または 1*/
263/* byte: seekするバイト数(-1)でファイルの最後に移動する*/
264/* 戻り値*/
265/* 成功: 1, 失敗: 0*/
266/******************************************************/
267mrb_value mrb_sdcard_seek(mrb_state *mrb, mrb_value self)
268{
269 int num;
270 int size;
271 int ret = 0;
272
273 mrb_get_args(mrb, "ii", &num, &size);
274
275 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
276
277 if (size == -1) {
278 if (file_seek(&Fp[num], file_size(&Fp[num]))) {
279 ret = 1;
280 }
281 }
282 else {
283 if (file_seek(&Fp[num], size)) {
284 ret = 1;
285 }
286 }
287 return mrb_fixnum_value(ret);
288}
289
290/******************************************************/
291/* openしたファイルにバイナリデータを書き込む: SD_write*/
292/* SD_write( number, buf, len )*/
293/* number: ファイル番号 0 または 1*/
294/* buf: 書き込むデータ*/
295/* len: 書き込むデータサイズ*/
296/* 戻り値*/
297/* 実際に書いたバイト数*/
298/******************************************************/
299mrb_value mrb_sdcard_write(mrb_state *mrb, mrb_value self)
300{
301 int num, len;
302 mrb_value value;
303 char *str;
304
305 mrb_get_args(mrb, "iSi", &num, &value, &len);
306
307 str = RSTRING_PTR(value);
308
309 int ret = 0;
310 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
311
312 ret = file_write(&Fp[num], (unsigned char*)str, len);
313
314 return mrb_fixnum_value(ret);
315}
316
317/******************************************************/
318/* openしたファイルの書き込みをフラッシュします: SD_flush*/
319/* SD_flush( number )*/
320/* number: ファイル番号 0 または 1*/
321/******************************************************/
322mrb_value mrb_sdcard_flush(mrb_state *mrb, mrb_value self)
323{
324 int num;
325
326 mrb_get_args(mrb, "i", &num);
327
328 if (num >= 0 && num < 2) {
329 file_flush(&Fp[num]);
330 }
331
332 return mrb_nil_value(); /*戻り値は無しですよ。*/
333}
334
335/******************************************************/
336/* openしたファイルのサイズを取得します: SD_size*/
337/* SD_size( number )*/
338/* number: ファイル番号 0 または 1*/
339/**/
340/* 戻り値*/
341/* ファイルサイズ*/
342/******************************************************/
343mrb_value mrb_sdcard_size(mrb_state *mrb, mrb_value self)
344{
345 int num;
346 mrb_int ret = 0;
347
348 mrb_get_args(mrb, "i", &num);
349
350 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
351
352 ret = file_size(&Fp[num]);
353
354 return mrb_fixnum_value(ret);
355}
356
357/******************************************************/
358/* openしたファイルのseek位置を取得します: SD_position*/
359/* SD_position( number )*/
360/* number: ファイル番号 0 または 1*/
361/**/
362/* 戻り値*/
363/* シーク位置*/
364/******************************************************/
365mrb_value mrb_sdcard_position(mrb_state *mrb, mrb_value self)
366{
367 int num;
368 mrb_int ret = 0;
369
370 mrb_get_args(mrb, "i", &num);
371
372 if (num < 0 || num > 1) { return mrb_fixnum_value(ret); }
373
374 ret = file_position(&Fp[num]);
375
376 return mrb_fixnum_value(ret);
377}
378
379/******************************************************/
380/* ライブラリを定義します*/
381/******************************************************/
382int sdcard_Init(mrb_state *mrb)
383{
384 /*日付と時刻を返す関数を登録*/
385 /*SdFile::dateTimeCallback( &SD_DateTime );*/
386
387 struct RClass *sdcardModule = mrb_define_module(mrb, "SD");
388
389 mrb_define_module_function(mrb, sdcardModule, "exists", mrb_sdcard_exists, MRB_ARGS_REQ(1));
390 mrb_define_module_function(mrb, sdcardModule, "mkdir", mrb_sdcard_mkdir, MRB_ARGS_REQ(1));
391 mrb_define_module_function(mrb, sdcardModule, "remove", mrb_sdcard_remove, MRB_ARGS_REQ(1));
392 mrb_define_module_function(mrb, sdcardModule, "rename", mrb_sdcard_copy, MRB_ARGS_REQ(2));
393 mrb_define_module_function(mrb, sdcardModule, "rmdir", mrb_sdcard_rmdir, MRB_ARGS_REQ(1));
394 mrb_define_module_function(mrb, sdcardModule, "open", mrb_sdcard_open, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
395
396 mrb_define_module_function(mrb, sdcardModule, "close", mrb_sdcard_close, MRB_ARGS_REQ(1));
397 mrb_define_module_function(mrb, sdcardModule, "read", mrb_sdcard_read, MRB_ARGS_REQ(1));
398 mrb_define_module_function(mrb, sdcardModule, "seek", mrb_sdcard_seek, MRB_ARGS_REQ(2));
399 mrb_define_module_function(mrb, sdcardModule, "write", mrb_sdcard_write, MRB_ARGS_REQ(3));
400 mrb_define_module_function(mrb, sdcardModule, "flush", mrb_sdcard_flush, MRB_ARGS_REQ(1));
401 mrb_define_module_function(mrb, sdcardModule, "size", mrb_sdcard_size, MRB_ARGS_REQ(1));
402 mrb_define_module_function(mrb, sdcardModule, "position", mrb_sdcard_position, MRB_ARGS_REQ(1));
403
404 return 1;
405}
406
407/******************************************************/
408/* 日付と時刻を返すコールバック関数*/
409/******************************************************/
410void SD_DateTime(uint16_t *date, uint16_t *time)
411{
412 uint16_t year = 2000;
413 uint8_t month = 1, day = 1, hour = 0, minute = 0, second = 0;
414 time_t timertc;
415 struct tm *tm;
416
417 timertc = rtc_read();
418 tm = localtime(&timertc);
419
420 year = tm->tm_year + 1900;
421 month = tm->tm_mon;
422 day = tm->tm_mday;
423 hour = tm->tm_hour;
424 minute = tm->tm_min;
425 second = tm->tm_sec;
426
427 /* FAT_DATEマクロでフィールドを埋めて日付を返す*/
428 *date = (year - 1980) << 9 | month << 5 | day;
429
430 /* FAT_TIMEマクロでフィールドを埋めて時間を返す*/
431 *time = hour << 11 | minute << 5 | second >> 1;
432}
Note: See TracBrowser for help on using the repository browser.