Browse Source

library update

Oliver Fabel 1 year ago
parent
commit
09eeab2881
5 changed files with 124 additions and 58 deletions
  1. 1 1
      genhdr/mpversion.h
  2. 3 0
      genhdr/qstrdefs.generated.h
  3. 100 31
      mp_flipper_fileio.c
  4. 16 23
      mp_flipper_fileio.h
  5. 4 3
      mp_flipper_halport.c

+ 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-30"
+#define MICROPY_BUILD_DATE "2024-10-01"

+ 3 - 0
genhdr/qstrdefs.generated.h

@@ -329,11 +329,13 @@ 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")
+QDEF1(MP_QSTR_TextIO, 30, 6, "TextIO")
 QDEF0(MP_QSTR___add__, 196, 7, "__add__")
 QDEF1(MP_QSTR___bases__, 3, 9, "__bases__")
 QDEF0(MP_QSTR___bool__, 43, 8, "__bool__")
 QDEF1(MP_QSTR___build_class__, 66, 15, "__build_class__")
 QDEF0(MP_QSTR___contains__, 198, 12, "__contains__")
+QDEF1(MP_QSTR___del__, 104, 7, "__del__")
 QDEF1(MP_QSTR___dict__, 127, 8, "__dict__")
 QDEF0(MP_QSTR___eq__, 113, 6, "__eq__")
 QDEF1(MP_QSTR___file__, 3, 8, "__file__")
@@ -429,6 +431,7 @@ QDEF1(MP_QSTR_pwm_start, 240, 9, "pwm_start")
 QDEF1(MP_QSTR_pwm_stop, 200, 8, "pwm_stop")
 QDEF1(MP_QSTR_random, 190, 6, "random")
 QDEF1(MP_QSTR_rb, 213, 2, "rb")
+QDEF1(MP_QSTR_readlines, 106, 9, "readlines")
 QDEF1(MP_QSTR_reversed, 161, 8, "reversed")
 QDEF1(MP_QSTR_seed, 146, 4, "seed")
 QDEF1(MP_QSTR_seek, 157, 4, "seek")

+ 100 - 31
mp_flipper_fileio.c

@@ -1,27 +1,28 @@
+#include <stdio.h>
 #include <stdbool.h>
 #include <stdint.h>
 
-#include "mp_flipper_fileio.h"
 #include "py/obj.h"
 #include "py/stream.h"
 #include "py/runtime.h"
+#include "py/mperrno.h"
+
+#include "mp_flipper_fileio.h"
 
 extern const mp_obj_type_t mp_flipper_fileio_type;
+extern const mp_obj_type_t mp_flipper_textio_type;
 
 typedef struct _mp_flipper_fileio_file_descriptor_t {
     mp_obj_base_t base;
     void* handle;
     size_t offset;
-    mp_flipper_file_access_mode_t access_mode;
-    mp_flipper_file_open_mode_t open_mode;
+    uint8_t access_mode;
+    uint8_t open_mode;
 } mp_flipper_fileio_file_descriptor_t;
 
-void* mp_flipper_file_new_file_descriptor(
-    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);
+void* mp_flipper_file_new_file_descriptor(void* handle, size_t offset, uint8_t access_mode, uint8_t open_mode, bool is_text) {
+    mp_obj_type_t type = is_text ? mp_flipper_textio_type : mp_flipper_fileio_type;
+    mp_flipper_fileio_file_descriptor_t* fd = mp_obj_malloc_with_finaliser(mp_flipper_fileio_file_descriptor_t, &type);
 
     fd->handle = handle;
     fd->offset = offset;
@@ -32,62 +33,130 @@ void* mp_flipper_file_new_file_descriptor(
 }
 
 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;
+    mp_flipper_fileio_file_descriptor_t* fd = MP_OBJ_TO_PTR(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;
+    mp_flipper_fileio_file_descriptor_t* fd = MP_OBJ_TO_PTR(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;
+static mp_uint_t mp_flipper_fileio_ioctl(mp_obj_t self, mp_uint_t request, uintptr_t arg, int* errcode) {
+    mp_flipper_fileio_file_descriptor_t* fd = MP_OBJ_TO_PTR(self);
+
+    if(request == MP_STREAM_SEEK) {
+        struct mp_stream_seek_t* seek = (struct mp_stream_seek_t*)(uintptr_t)arg;
+        size_t position;
+        bool success;
+
+        switch(seek->whence) {
+        case MP_SEEK_SET:
+            mp_flipper_file_seek(fd->handle, seek->offset);
+
+            break;
+
+        case MP_SEEK_CUR:
+            position = mp_flipper_file_tell(fd->handle);
+
+            mp_flipper_file_seek(fd->handle, position + seek->offset);
 
-    int errorno = mp_flipper_file_close(fd->handle);
+            break;
 
-    if(errorno != 0) {
-        mp_raise_OSError(errorno);
+        case MP_SEEK_END:
+            position = mp_flipper_file_size(fd->handle);
+
+            mp_flipper_file_seek(fd->handle, position + seek->offset);
+
+            break;
+        }
+
+        seek->offset = mp_flipper_file_tell(fd->handle);
+
+        return 0;
     }
 
-    return mp_const_none;
-}
-static MP_DEFINE_CONST_FUN_OBJ_1(mp_flipper_fileio_close_obj, mp_flipper_fileio_close);
+    if(request == MP_STREAM_FLUSH) {
+        if(!mp_flipper_file_sync(fd->handle)) {
+            *errcode = MP_EIO;
+
+            return MP_STREAM_ERROR;
+        }
+
+        return 0;
+    }
 
-static mp_obj_t mp_flipper_fileio___exit___(size_t n_args, const mp_obj_t* args) {
-    return mp_flipper_fileio_close(args[0]);
+    if(request == MP_STREAM_CLOSE) {
+        if(fd->handle != NULL) {
+            if(!mp_flipper_file_close(fd->handle)) {
+                *errcode = MP_EIO;
+
+                return MP_STREAM_ERROR;
+            }
+        }
+
+        return 0;
+    }
+
+    *errcode = MP_EINVAL;
+
+    return MP_STREAM_ERROR;
 }
-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;
+    mp_flipper_fileio_file_descriptor_t* fd = MP_OBJ_TO_PTR(self);
+
+    return (fd->access_mode & MP_FLIPPER_FILE_ACCESS_MODE_WRITE) ? 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_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_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj)},
+    {MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj)},
+    {MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj)},
+    {MP_ROM_QSTR(MP_QSTR_readlines), MP_ROM_PTR(&mp_stream_unbuffered_readlines_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)},
+    {MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj)},
+    {MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&mp_stream_flush_obj)},
+    {MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj)},
+    {MP_ROM_QSTR(MP_QSTR_seek), MP_ROM_PTR(&mp_stream_seek_obj)},
+    {MP_ROM_QSTR(MP_QSTR_tell), MP_ROM_PTR(&mp_stream_tell_obj)},
+    {MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj)},
+    {MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj)},
+    {MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&mp_stream___exit___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,
+    .ioctl = mp_flipper_fileio_ioctl,
+    .is_text = false,
 };
 
 MP_DEFINE_CONST_OBJ_TYPE(
     mp_flipper_fileio_type,
     MP_QSTR_FileIO,
-    MP_TYPE_FLAG_NONE,
+    MP_TYPE_FLAG_ITER_IS_STREAM,
     protocol,
     &mp_flipper_fileio_stream_p,
     locals_dict,
+    &mp_flipper_file_locals_dict);
+
+static const mp_stream_p_t mp_flipper_textio_stream_p = {
+    .read = mp_flipper_fileio_read,
+    .write = mp_flipper_fileio_write,
+    .ioctl = mp_flipper_fileio_ioctl,
+    .is_text = true,
+};
+
+MP_DEFINE_CONST_OBJ_TYPE(
+    mp_flipper_textio_type,
+    MP_QSTR_TextIO,
+    MP_TYPE_FLAG_ITER_IS_STREAM,
+    protocol,
+    &mp_flipper_textio_stream_p,
+    locals_dict,
     &mp_flipper_file_locals_dict);

+ 16 - 23
mp_flipper_fileio.h

@@ -1,32 +1,25 @@
 #pragma once
 
 #include <stdio.h>
+#include <stdint.h>
 #include <stdbool.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;
+extern uint8_t MP_FLIPPER_FILE_ACCESS_MODE_READ;
+extern uint8_t MP_FLIPPER_FILE_ACCESS_MODE_WRITE;
 
-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;
+extern uint8_t MP_FLIPPER_FILE_OPEN_MODE_OPEN_EXIST;
+extern uint8_t MP_FLIPPER_FILE_OPEN_MODE_OPEN_ALWAYS;
+extern uint8_t MP_FLIPPER_FILE_OPEN_MODE_OPEN_APPEND;
+extern uint8_t MP_FLIPPER_FILE_OPEN_MODE_CREATE_NEW;
+extern uint8_t MP_FLIPPER_FILE_OPEN_MODE_CREATE_ALWAYS;
 
-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* 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);
-bool mp_flipper_file_writable(void* handle);
+void* mp_flipper_file_open(const char* name, uint8_t access_mode, uint8_t open_mode, size_t* offset);
+void* mp_flipper_file_new_file_descriptor(void* handle, size_t offset, uint8_t access_mode, uint8_t open_mode, bool is_text);
+uint8_t mp_flipper_file_close(void* handle);
+size_t mp_flipper_file_seek(void* handle, uint32_t offset);
+size_t mp_flipper_file_tell(void* handle);
+size_t mp_flipper_file_size(void* handle);
+bool mp_flipper_file_sync(void* handle);
+bool mp_flipper_file_eof(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);

+ 4 - 3
mp_flipper_halport.c

@@ -10,8 +10,8 @@
 mp_obj_t mp_builtin_open(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
     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;
+    uint8_t access_mode = MP_FLIPPER_FILE_ACCESS_MODE_READ;
+    uint8_t open_mode = MP_FLIPPER_FILE_OPEN_MODE_OPEN_EXIST;
 
     if(n_args > 1) {
         size_t len;
@@ -45,8 +45,9 @@ mp_obj_t mp_builtin_open(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs)
     size_t offset;
 
     void* handle = mp_flipper_file_open(file_name, access_mode, open_mode, &offset);
+    void* fd = mp_flipper_file_new_file_descriptor(handle, offset, access_mode, open_mode);
 
-    return (mp_obj_t)mp_flipper_file_new_file_descriptor(handle, offset, access_mode, open_mode);
+    return MP_OBJ_FROM_PTR(fd);
 }
 
 MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);