Oliver Fabel 1 rok temu
rodzic
commit
15ee45b225

+ 0 - 5
genhdr/moduledefs.h

@@ -1,9 +1,5 @@
 // Automatically generated by makemoduledefs.py.
 
-extern const struct _mp_obj_module_t mp_module_io;
-#undef MODULE_DEF_IO
-#define MODULE_DEF_IO { MP_ROM_QSTR(MP_QSTR_io), MP_ROM_PTR(&mp_module_io) },
-
 extern const struct _mp_obj_module_t mp_module_random;
 #undef MODULE_DEF_RANDOM
 #define MODULE_DEF_RANDOM { MP_ROM_QSTR(MP_QSTR_random), MP_ROM_PTR(&mp_module_random) },
@@ -32,7 +28,6 @@ extern const struct _mp_obj_module_t flipperzero_module;
 // MICROPY_REGISTERED_MODULES
 
 #define MICROPY_REGISTERED_EXTENSIBLE_MODULES \
-    MODULE_DEF_IO \
     MODULE_DEF_RANDOM \
     MODULE_DEF_TIME \
 // MICROPY_REGISTERED_EXTENSIBLE_MODULES

+ 1 - 1
genhdr/mpversion.h

@@ -1,4 +1,4 @@
 // This file was generated by py/makeversionhdr.py
 #define MICROPY_GIT_TAG "v1.23.0"
 #define MICROPY_GIT_HASH "a61c446c0"
-#define MICROPY_BUILD_DATE "2024-09-29"
+#define MICROPY_BUILD_DATE "2024-09-30"

+ 3 - 6
genhdr/qstrdefs.generated.h

@@ -180,6 +180,7 @@ QDEF1(MP_QSTR_CANVAS_BLACK, 213, 12, "CANVAS_BLACK")
 QDEF1(MP_QSTR_CANVAS_WHITE, 53, 12, "CANVAS_WHITE")
 QDEF1(MP_QSTR_FONT_PRIMARY, 133, 12, "FONT_PRIMARY")
 QDEF1(MP_QSTR_FONT_SECONDARY, 51, 14, "FONT_SECONDARY")
+QDEF1(MP_QSTR_FileIO, 197, 6, "FileIO")
 QDEF1(MP_QSTR_GPIO_MODE_ANALOG, 29, 16, "GPIO_MODE_ANALOG")
 QDEF1(MP_QSTR_GPIO_MODE_INPUT, 97, 15, "GPIO_MODE_INPUT")
 QDEF1(MP_QSTR_GPIO_MODE_INTERRUPT_FALL, 40, 24, "GPIO_MODE_INTERRUPT_FALL")
@@ -326,7 +327,6 @@ QDEF1(MP_QSTR_SPEAKER_NOTE_GS7, 13, 16, "SPEAKER_NOTE_GS7")
 QDEF1(MP_QSTR_SPEAKER_NOTE_GS8, 2, 16, "SPEAKER_NOTE_GS8")
 QDEF1(MP_QSTR_SPEAKER_VOLUME_MAX, 66, 18, "SPEAKER_VOLUME_MAX")
 QDEF1(MP_QSTR_SPEAKER_VOLUME_MIN, 92, 18, "SPEAKER_VOLUME_MIN")
-QDEF1(MP_QSTR_StringIO, 118, 8, "StringIO")
 QDEF0(MP_QSTR___add__, 196, 7, "__add__")
 QDEF1(MP_QSTR___bases__, 3, 9, "__bases__")
 QDEF0(MP_QSTR___bool__, 43, 8, "__bool__")
@@ -391,11 +391,9 @@ QDEF1(MP_QSTR_errno, 193, 5, "errno")
 QDEF1(MP_QSTR_filter, 37, 6, "filter")
 QDEF1(MP_QSTR_flipperzero, 179, 11, "flipperzero")
 QDEF1(MP_QSTR_float, 53, 5, "float")
-QDEF1(MP_QSTR_flush, 97, 5, "flush")
 QDEF1(MP_QSTR_function, 39, 8, "function")
 QDEF1(MP_QSTR_generator, 150, 9, "generator")
 QDEF1(MP_QSTR_getrandbits, 102, 11, "getrandbits")
-QDEF1(MP_QSTR_getvalue, 120, 8, "getvalue")
 QDEF1(MP_QSTR_gpio_deinit_pin, 120, 15, "gpio_deinit_pin")
 QDEF1(MP_QSTR_gpio_get_pin, 85, 12, "gpio_get_pin")
 QDEF1(MP_QSTR_gpio_init_pin, 185, 13, "gpio_init_pin")
@@ -406,7 +404,6 @@ QDEF1(MP_QSTR_infrared_receive, 112, 16, "infrared_receive")
 QDEF1(MP_QSTR_infrared_transmit, 81, 17, "infrared_transmit")
 QDEF1(MP_QSTR_intersection, 40, 12, "intersection")
 QDEF1(MP_QSTR_intersection_update, 6, 19, "intersection_update")
-QDEF1(MP_QSTR_io, 35, 2, "io")
 QDEF1(MP_QSTR_isdisjoint, 247, 10, "isdisjoint")
 QDEF1(MP_QSTR_issubset, 185, 8, "issubset")
 QDEF1(MP_QSTR_issuperset, 252, 10, "issuperset")
@@ -419,6 +416,7 @@ QDEF1(MP_QSTR_max, 177, 3, "max")
 QDEF1(MP_QSTR_maximum_space_recursion_space_depth_space_exceeded, 115, 32, "maximum recursion depth exceeded")
 QDEF1(MP_QSTR_min, 175, 3, "min")
 QDEF1(MP_QSTR_module, 191, 6, "module")
+QDEF1(MP_QSTR_name, 162, 4, "name")
 QDEF1(MP_QSTR_oct, 253, 3, "oct")
 QDEF1(MP_QSTR_on_gpio, 106, 7, "on_gpio")
 QDEF1(MP_QSTR_on_input, 141, 8, "on_input")
@@ -429,7 +427,6 @@ QDEF1(MP_QSTR_random, 190, 6, "random")
 QDEF1(MP_QSTR_rb, 213, 2, "rb")
 QDEF1(MP_QSTR_reversed, 161, 8, "reversed")
 QDEF1(MP_QSTR_seed, 146, 4, "seed")
-QDEF1(MP_QSTR_seek, 157, 4, "seek")
 QDEF1(MP_QSTR_sleep, 234, 5, "sleep")
 QDEF1(MP_QSTR_sleep_ms, 11, 8, "sleep_ms")
 QDEF1(MP_QSTR_sleep_us, 19, 8, "sleep_us")
@@ -438,7 +435,6 @@ QDEF1(MP_QSTR_speaker_start, 1, 13, "speaker_start")
 QDEF1(MP_QSTR_speaker_stop, 153, 12, "speaker_stop")
 QDEF1(MP_QSTR_symmetric_difference, 206, 20, "symmetric_difference")
 QDEF1(MP_QSTR_symmetric_difference_update, 96, 27, "symmetric_difference_update")
-QDEF1(MP_QSTR_tell, 20, 4, "tell")
 QDEF1(MP_QSTR_ticks_add, 157, 9, "ticks_add")
 QDEF1(MP_QSTR_ticks_cpu, 26, 9, "ticks_cpu")
 QDEF1(MP_QSTR_ticks_diff, 177, 10, "ticks_diff")
@@ -448,6 +444,7 @@ QDEF1(MP_QSTR_time, 240, 4, "time")
 QDEF1(MP_QSTR_time_ns, 114, 7, "time_ns")
 QDEF1(MP_QSTR_union, 246, 5, "union")
 QDEF1(MP_QSTR_vibro_set, 216, 9, "vibro_set")
+QDEF1(MP_QSTR_writable, 247, 8, "writable")
 QDEF1(MP_QSTR__brace_open__colon__hash_b_brace_close_, 88, 5, "{:#b}")
 QDEF1(MP_QSTR__brace_open__colon__hash_o_brace_close_, 245, 5, "{:#o}")
 QDEF1(MP_QSTR__brace_open__colon__hash_x_brace_close_, 2, 5, "{:#x}")

+ 1 - 0
mp_flipper_file_reader.c

@@ -1,4 +1,5 @@
 #include "py/reader.h"
+#include "py/qstr.h"
 
 #include "mp_flipper_file_reader.h"
 

+ 107 - 0
mp_flipper_fileio.c

@@ -0,0 +1,107 @@
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "mp_flipper_fileio.h"
+#include "py/obj.h"
+#include "py/stream.h"
+#include "py/runtime.h"
+
+extern const mp_obj_type_t mp_flipper_fileio_type;
+
+typedef struct _mp_flipper_fileio_file_descriptor_t {
+    mp_obj_base_t base;
+    void* name;
+    void* handle;
+    size_t offset;
+    mp_flipper_file_access_mode_t access_mode;
+    mp_flipper_file_open_mode_t open_mode;
+} mp_flipper_fileio_file_descriptor_t;
+
+void* mp_flipper_file_new_file_descriptor(
+    void* name,
+    void* handle,
+    size_t offset,
+    mp_flipper_file_access_mode_t access_mode,
+    mp_flipper_file_open_mode_t open_mode) {
+    mp_flipper_fileio_file_descriptor_t* fd = mp_obj_malloc(mp_flipper_fileio_file_descriptor_t, &mp_flipper_fileio_type);
+
+    fd->name = name;
+    fd->handle = handle;
+    fd->offset = offset;
+    fd->access_mode = access_mode;
+    fd->open_mode = open_mode;
+
+    return fd;
+}
+
+static mp_uint_t mp_flipper_fileio_read(mp_obj_t self, void* buf, mp_uint_t size, int* errcode) {
+    mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
+
+    return mp_flipper_file_read(fd->handle, buf, size, errcode);
+}
+
+static mp_uint_t mp_flipper_fileio_write(mp_obj_t self, const void* buf, mp_uint_t size, int* errcode) {
+    mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
+
+    return mp_flipper_file_write(fd->handle, buf, size, errcode);
+}
+
+static mp_obj_t mp_flipper_fileio_close(mp_obj_t self) {
+    mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
+
+    int errorno = mp_flipper_file_close(fd->handle, fd->name);
+
+    if(errorno != 0) {
+        mp_raise_OSError(errorno);
+    }
+
+    return mp_const_none;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_close_obj, mp_flipper_fileio_close);
+
+static mp_obj_t mp_flipper_fileio_name(mp_obj_t self) {
+    mp_flipper_fileio_file_descriptor_t* fd = (mp_flipper_fileio_file_descriptor_t*)self;
+    size_t size = 0;
+
+    char* name = mp_flipper_file_name(fd->name, &size);
+
+    return mp_obj_new_str(name, size);
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_name_obj, mp_flipper_fileio_name);
+
+static mp_obj_t mp_flipper_fileio___exit___(size_t n_args, const mp_obj_t* args) {
+    return mp_flipper_fileio_close(args[0]);
+}
+static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_flipper_fileio___exit___obj, 4, 4, mp_flipper_fileio___exit___);
+
+static mp_obj_t mp_flipper_fileio_writable(mp_obj_t self) {
+    return mp_flipper_file_writable((void*)self) ? mp_const_true : mp_const_false;
+}
+static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_writable_obj, mp_flipper_fileio_writable);
+
+static const mp_map_elem_t mp_flipper_file_locals_dict_table[] = {
+    {MP_OBJ_NEW_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_flipper_fileio_close_obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_name), MP_ROM_PTR(&mp_flipper_fileio_name_obj)},
+    {MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj)},
+    {MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&mp_flipper_fileio___exit___obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_writable), MP_ROM_PTR(&mp_flipper_fileio_writable_obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj)},
+};
+static MP_DEFINE_CONST_DICT(mp_flipper_file_locals_dict, mp_flipper_file_locals_dict_table);
+
+static const mp_stream_p_t mp_flipper_fileio_stream_p = {
+    .read = mp_flipper_fileio_read,
+    .write = mp_flipper_fileio_write,
+};
+
+MP_DEFINE_CONST_OBJ_TYPE(
+    mp_flipper_fileio_type,
+    MP_QSTR_FileIO,
+    MP_TYPE_FLAG_NONE,
+    protocol,
+    &mp_flipper_fileio_stream_p,
+    locals_dict,
+    &mp_flipper_file_locals_dict);

+ 33 - 0
mp_flipper_fileio.h

@@ -0,0 +1,33 @@
+#pragma once
+
+#include <stdio.h>
+
+typedef enum {
+    MP_FLIPPER_FILE_ACCESS_MODE_READ = (1 << 0),
+    MP_FLIPPER_FILE_ACCESS_MODE_WRITE = (1 << 1),
+} mp_flipper_file_access_mode_t;
+
+typedef enum {
+    MP_FLIPPER_FILE_OPEN_MODE_OPEN_EXIST = (1 << 0),
+    MP_FLIPPER_FILE_OPEN_MODE_OPEN_ALWAYS = (1 << 1),
+    MP_FLIPPER_FILE_OPEN_MODE_OPEN_APPEND = (1 << 2),
+    MP_FLIPPER_FILE_OPEN_MODE_CREATE_NEW = (1 << 3),
+    MP_FLIPPER_FILE_OPEN_MODE_CREATE_ALWAYS = (1 << 4),
+} mp_flipper_file_open_mode_t;
+
+void* mp_flipper_file_open(
+    const char* name,
+    mp_flipper_file_access_mode_t access_mode,
+    mp_flipper_file_open_mode_t open_mode,
+    size_t* offset);
+void* mp_flipper_file_new_file_descriptor(
+    void* name,
+    void* handle,
+    size_t offset,
+    mp_flipper_file_access_mode_t access_mode,
+    mp_flipper_file_open_mode_t open_mode);
+int mp_flipper_file_close(void* handle, void* name);
+char* mp_flipper_file_name(void* name, size_t* size);
+bool mp_flipper_file_writable(void* handle);
+size_t mp_flipper_file_read(void* handle, void* buffer, size_t size, int* errcode);
+size_t mp_flipper_file_write(void* handle, const void* buffer, size_t size, int* errcode);

+ 41 - 1
mp_flipper_halport.c

@@ -1,12 +1,52 @@
+#include "py/obj.h"
 #include <stdio.h>
 
 #include "py/mphal.h"
 #include "py/builtin.h"
 
 #include "mp_flipper_halport.h"
+#include "mp_flipper_fileio.h"
 
 mp_obj_t mp_builtin_open(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
-    return mp_const_none;
+    const char* file_name = mp_obj_str_get_str(args[0]);
+
+    mp_flipper_file_access_mode_t access_mode = MP_FLIPPER_FILE_ACCESS_MODE_READ;
+    mp_flipper_file_open_mode_t open_mode = MP_FLIPPER_FILE_OPEN_MODE_OPEN_EXIST;
+
+    if(n_args > 1) {
+        size_t len;
+
+        const char* mode = mp_obj_str_get_data(args[1], &len);
+
+        for(size_t i = 0; i < len; i++) {
+            if(i == 0 && mode[i] == 'r') {
+                access_mode = MP_FLIPPER_FILE_ACCESS_MODE_READ;
+                open_mode = MP_FLIPPER_FILE_OPEN_MODE_OPEN_EXIST;
+
+                continue;
+            }
+
+            if(i == 0 && mode[i] == 'w') {
+                access_mode = MP_FLIPPER_FILE_ACCESS_MODE_WRITE;
+                open_mode = MP_FLIPPER_FILE_OPEN_MODE_CREATE_ALWAYS;
+
+                continue;
+            }
+
+            if(i == 1 && mode[i] == '+') {
+                access_mode = MP_FLIPPER_FILE_ACCESS_MODE_READ | MP_FLIPPER_FILE_ACCESS_MODE_WRITE;
+                open_mode = MP_FLIPPER_FILE_OPEN_MODE_OPEN_APPEND;
+
+                continue;
+            }
+        }
+    }
+
+    size_t offset;
+
+    void* handle = mp_flipper_file_open(file_name, access_mode, open_mode, &offset);
+
+    return (mp_obj_t)mp_flipper_file_new_file_descriptor(file_name, handle, offset, access_mode, open_mode);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);

+ 1 - 1
mpconfigport.h

@@ -149,7 +149,7 @@ typedef long mp_off_t;
 
 #define MICROPY_PY_MATH (0)
 
-#define MICROPY_PY_IO (1)
+#define MICROPY_PY_IO (0)
 #define MICROPY_PY_IO_BYTESIO (0)
 
 #define MICROPY_PY_JSON (0)