source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sMem.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: 6.6 KB
Line 
1/*
2 * ファイル関連
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 <eepfile.h>*/
12
13#include <mruby.h>
14#include <mruby/string.h>
15
16#include "../llbruby.h"
17
18FILEEEP Fpj0;
19FILEEEP *Fp0 = &Fpj0; /*コマンド用*/
20FILEEEP Fpj1;
21FILEEEP *Fp1 = &Fpj1; /*コマンド用*/
22
23/******************************************************/
24/* openしたファイルから1バイト読み込みます: MemFile.read*/
25/* MemFile.read( number )*/
26/* number: ファイル番号 0 または 1*/
27/* 戻り値*/
28/* 0x00~0xFFが返る。ファイルの最後だったら-1が返る。*/
29/******************************************************/
30mrb_value mrb_mem_read(mrb_state *mrb, mrb_value self)
31{
32 int num;
33
34 mrb_get_args(mrb, "i", &num);
35
36 int dat = -1;
37 if (num == 0) {
38 dat = EEP_fread(Fp0);
39 }
40 else if (num == 1) {
41 dat = EEP_fread(Fp1);
42 }
43
44 return mrb_fixnum_value(dat);
45}
46
47/******************************************************/
48/* openしたファイルバイナリデータを書き込む: MemFile.write*/
49/* MemFile.write( number, buf, len )*/
50/* number: ファイル番号 0 または 1*/
51/* buf: 書き込むデータ*/
52/* len: 書き込むデータサイズ*/
53/* 戻り値*/
54/* 実際に書いたバイト数*/
55/******************************************************/
56mrb_value mrb_mem_write(mrb_state *mrb, mrb_value self)
57{
58 int num, len;
59 mrb_value value;
60 char *str;
61
62 mrb_get_args(mrb, "iSi", &num, &value, &len);
63
64 str = RSTRING_PTR(value);
65
66 int ret = 0;
67 if (num == 0) {
68 EEP_fwrite(Fp0, str, &len);
69 ret = len;
70 }
71 else if (num == 1) {
72 EEP_fwrite(Fp1, str, &len);
73 ret = len;
74 }
75
76 return mrb_fixnum_value(ret);
77}
78
79/******************************************************/
80/* ファイルをオープンします: MemFile.open*/
81/* MemFile.open( number, filename[, mode] )*/
82/* number: ファイル番号 0 または 1*/
83/* filename: ファイル名(8.3形式)*/
84/* mode: 0:Read, 1:Append, 2:New Create*/
85/* 戻り値*/
86/* 成功: 番号, 失敗: -1*/
87/******************************************************/
88mrb_value mrb_mem_open(mrb_state *mrb, mrb_value self)
89{
90 int num;
91 int mode;
92 mrb_value value;
93 char *str;
94
95 int n = mrb_get_args(mrb, "iS|i", &num, &value, &mode);
96
97 str = RSTRING_PTR(value);
98
99 if (n < 3) {
100 mode = 0;
101 }
102
103 int ret = -1;
104 if (num == 0) {
105 if (mode == 1) {
106 if (EEP_fopen(Fp0, str, EEP_APPEND) != -1) {
107 ret = num;
108 }
109 }
110 else if (mode == 2) {
111 if (EEP_fopen(Fp0, str, EEP_WRITE) != -1) {
112 ret = num;
113 }
114 }
115 else {
116 if (EEP_fopen(Fp0, str, EEP_READ) != -1) {
117 ret = num;
118 }
119 }
120 }
121 else if (num == 1) {
122 if (mode == 1) {
123 if (EEP_fopen(Fp1, str, EEP_APPEND) != -1) {
124 ret = num;
125 }
126 }
127 else if (mode == 2) {
128 if (EEP_fopen(Fp1, str, EEP_WRITE) != -1) {
129 ret = num;
130 }
131 }
132 else {
133 if (EEP_fopen(Fp1, str, EEP_READ) != -1) {
134 ret = num;
135 }
136 }
137 }
138
139 return mrb_fixnum_value(ret);
140}
141
142
143/******************************************************/
144/* ファイルをクローズします: MemFile.close( number )*/
145/* MemFile.close( number )*/
146/* number: ファイル番号 0 または 1*/
147/******************************************************/
148mrb_value mrb_mem_close(mrb_state *mrb, mrb_value self)
149{
150 int num;
151
152 mrb_get_args(mrb, "i", &num);
153
154 if (num == 0) {
155 EEP_fclose(Fp0);
156 }
157 else if (num == 1) {
158 EEP_fclose(Fp1);
159 }
160
161 return mrb_nil_value(); /*戻り値は無しですよ。*/
162}
163
164/******************************************************/
165/* openしたファイルの読み出し位置を移動する: MemFile.seek*/
166/* MemFile.seek( number, byte )*/
167/* number: ファイル番号 0 または 1*/
168/* byte: seekするバイト数(-1)でファイルの最後に移動する*/
169/* 戻り値*/
170/* 成功: 1, 失敗: 0*/
171/******************************************************/
172mrb_value mrb_mem_seek(mrb_state *mrb, mrb_value self)
173{
174 int num;
175 int size;
176 int ret = 0;
177
178 mrb_get_args(mrb, "ii", &num, &size);
179
180 if (num == 0) {
181 if (size == -1) {
182 if (EEP_fseek(Fp0, 0, EEP_SEEKEND)) {
183 ret = 1;
184 }
185 }
186 else {
187 if (EEP_fseek(Fp0, size, EEP_SEEKTOP)) {
188 ret = 1;
189 }
190 }
191 }
192 else if (num == 1) {
193 if (size == -1) {
194 if (EEP_fseek(Fp1, 0, EEP_SEEKEND)) {
195 ret = 1;
196 }
197 }
198 else {
199 if (EEP_fseek(Fp1, size, EEP_SEEKTOP)) {
200 ret = 1;
201 }
202 }
203 }
204 return mrb_fixnum_value(ret);
205}
206
207/******************************************************/
208/* ファイルをコピーします: MemFile.cp*/
209/* MemFile.cp( srcFilename, dstFilename[, mode] )*/
210/* srcFilename: コピーå…
211ƒãƒ•ã‚¡ã‚¤ãƒ«å*/
212/* dstFilename: コピーå…
213ˆãƒ•ã‚¡ã‚¤ãƒ«å*/
214/* mode: 0上書きしない, 1:上書きする*/
215/* 戻り値*/
216/* 成功: 1, 失敗: 0*/
217/******************************************************/
218mrb_value mrb_mem_cp(mrb_state *mrb, mrb_value self)
219{
220 mrb_value src, dst;
221 int mode;
222 int ret = 1;
223
224 int n = mrb_get_args(mrb, "SS|i", &src, &dst, &mode);
225
226 /*DEBUG_PRINT("MemFile.copy", n);*/
227
228 if (n < 3) {
229 mode = 0;
230 }
231
232 if (mode == 0) {
233 if (!EEP_fexist(RSTRING_PTR(dst))) {
234 mode = 1;
235 }
236 }
237
238 /*DEBUG_PRINT("mode", mode);*/
239
240 if (mode == 1) {
241 if (EEP_fcopy(RSTRING_PTR(src), RSTRING_PTR(dst)) == -1) {
242 ret = 0;
243 }
244 }
245 return mrb_fixnum_value(ret);
246}
247
248/******************************************************/
249/* ファイルを削除します: MemFile.rm*/
250/* MemFile.rm( Filename )*/
251/* Filename: 削除するファイル名*/
252/* 戻り値*/
253/* 成功: 1, 失敗: 0*/
254/******************************************************/
255mrb_value mrb_mem_rm(mrb_state *mrb, mrb_value self)
256{
257 mrb_value src;
258 int ret = 1;
259
260 mrb_get_args(mrb, "S", &src);
261
262 if (EEP_fdelete(RSTRING_PTR(src)) == -1) {
263 ret = 0;
264 }
265 return mrb_fixnum_value(ret);
266}
267
268/******************************************************/
269/* ライブラリを定義します*/
270/******************************************************/
271void mem_Init(mrb_state *mrb)
272{
273 struct RClass *memdModule = mrb_define_module(mrb, "MemFile");
274
275 mrb_define_module_function(mrb, memdModule, "read", mrb_mem_read, MRB_ARGS_REQ(1));
276
277 mrb_define_module_function(mrb, memdModule, "seek", mrb_mem_seek, MRB_ARGS_REQ(2));
278
279 mrb_define_module_function(mrb, memdModule, "write", mrb_mem_write, MRB_ARGS_REQ(3));
280
281 mrb_define_module_function(mrb, memdModule, "open", mrb_mem_open, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
282
283 mrb_define_module_function(mrb, memdModule, "close", mrb_mem_close, MRB_ARGS_REQ(1));
284
285 mrb_define_module_function(mrb, memdModule, "cp", mrb_mem_cp, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
286
287 mrb_define_module_function(mrb, memdModule, "rm", mrb_mem_rm, MRB_ARGS_REQ(1));
288}
Note: See TracBrowser for help on using the repository browser.