diff options
-rw-r--r-- | stmhal/file.c | 10 | ||||
-rw-r--r-- | stmhal/file.h | 2 | ||||
-rw-r--r-- | stmhal/modos.c | 63 | ||||
-rw-r--r-- | stmhal/modtime.c | 36 | ||||
-rw-r--r-- | stmhal/portmodules.h | 5 | ||||
-rw-r--r-- | stmhal/qstrdefsport.h | 2 |
6 files changed, 90 insertions, 28 deletions
diff --git a/stmhal/file.c b/stmhal/file.c index 2d33a8f7b4..c1a2924903 100644 --- a/stmhal/file.c +++ b/stmhal/file.c @@ -41,7 +41,7 @@ extern const mp_obj_type_t mp_type_fileio; extern const mp_obj_type_t mp_type_textio; // this table converts from FRESULT to POSIX errno -STATIC const byte fresult_to_errno_table[] = { +const byte fresult_to_errno_table[20] = { [FR_OK] = 0, [FR_DISK_ERR] = EIO, [FR_INT_ERR] = EIO, @@ -95,6 +95,13 @@ STATIC mp_int_t file_obj_write(mp_obj_t self_in, const void *buf, mp_uint_t size return sz_out; } +STATIC mp_obj_t file_obj_flush(mp_obj_t self_in) { + pyb_file_obj_t *self = self_in; + f_sync(&self->fp); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(file_obj_flush_obj, file_obj_flush); + mp_obj_t file_obj_close(mp_obj_t self_in) { pyb_file_obj_t *self = self_in; f_close(&self->fp); @@ -218,6 +225,7 @@ STATIC const mp_map_elem_t rawfile_locals_dict_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_readline), (mp_obj_t)&mp_stream_unbuffered_readline_obj}, { MP_OBJ_NEW_QSTR(MP_QSTR_readlines), (mp_obj_t)&mp_stream_unbuffered_readlines_obj}, { MP_OBJ_NEW_QSTR(MP_QSTR_write), (mp_obj_t)&mp_stream_write_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_flush), (mp_obj_t)&file_obj_flush_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t)&file_obj_close_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_seek), (mp_obj_t)&file_obj_seek_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_tell), (mp_obj_t)&file_obj_tell_obj }, diff --git a/stmhal/file.h b/stmhal/file.h index 350785f74c..7522a337dc 100644 --- a/stmhal/file.h +++ b/stmhal/file.h @@ -24,4 +24,6 @@ * THE SOFTWARE. */ +const byte fresult_to_errno_table[20]; + MP_DECLARE_CONST_FUN_OBJ(mp_builtin_open_obj); diff --git a/stmhal/modos.c b/stmhal/modos.c index dd6fd67ec9..35979ae972 100644 --- a/stmhal/modos.c +++ b/stmhal/modos.c @@ -32,10 +32,12 @@ #include "misc.h" #include "qstr.h" #include "obj.h" +#include "objtuple.h" #include "systick.h" #include "rng.h" #include "storage.h" #include "ff.h" +#include "file.h" #include "portmodules.h" #if _USE_LFN @@ -107,8 +109,7 @@ STATIC mp_obj_t os_listdir(uint n_args, const mp_obj_t *args) { return dir_list; } - -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(os_listdir_obj, 0, 1, os_listdir); +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(os_listdir_obj, 0, 1, os_listdir); STATIC mp_obj_t os_mkdir(mp_obj_t path_o) { const char *path = mp_obj_str_get_str(path_o); @@ -123,8 +124,7 @@ STATIC mp_obj_t os_mkdir(mp_obj_t path_o) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "Error creating directory '%s'", path)); } } - -MP_DEFINE_CONST_FUN_OBJ_1(os_mkdir_obj, os_mkdir); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_mkdir_obj, os_mkdir); STATIC mp_obj_t os_remove(mp_obj_t path_o) { const char *path = mp_obj_str_get_str(path_o); @@ -137,8 +137,7 @@ STATIC mp_obj_t os_remove(mp_obj_t path_o) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "Error removing file '%s'", path)); } } - -MP_DEFINE_CONST_FUN_OBJ_1(os_remove_obj, os_remove); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_remove_obj, os_remove); STATIC mp_obj_t os_rmdir(mp_obj_t path_o) { const char *path = mp_obj_str_get_str(path_o); @@ -151,15 +150,57 @@ STATIC mp_obj_t os_rmdir(mp_obj_t path_o) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "Error removing directory '%s'", path)); } } +STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_rmdir_obj, os_rmdir); + +STATIC mp_obj_t os_stat(mp_obj_t path_in) { + const char *path = mp_obj_str_get_str(path_in); + + FILINFO fno; +#if _USE_LFN + fno.lfname = NULL; + fno.lfsize = 0; +#endif -MP_DEFINE_CONST_FUN_OBJ_1(os_rmdir_obj, os_rmdir); + FRESULT res = f_stat(path, &fno); + if (res != FR_OK) { + nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(fresult_to_errno_table[res]))); + } + + mp_obj_tuple_t *t = mp_obj_new_tuple(10, NULL); + mp_int_t mode = 0; + if (fno.fattrib & AM_DIR) { + mode |= 0x4000; // stat.S_IFDIR + } else { + mode |= 0x8000; // stat.S_IFREG + } + mp_int_t seconds = mod_time_seconds_since_2000( + 1980 + ((fno.fdate >> 9) & 0x7f), + (fno.fdate >> 5) & 0x0f, + fno.fdate & 0x1f, + (fno.ftime >> 11) & 0x1f, + (fno.ftime >> 5) & 0x3f, + 2 * (fno.ftime & 0x1f) + ); + t->items[0] = MP_OBJ_NEW_SMALL_INT(mode); // st_mode + t->items[1] = MP_OBJ_NEW_SMALL_INT(0); // st_ino + t->items[2] = MP_OBJ_NEW_SMALL_INT(0); // st_dev + t->items[3] = MP_OBJ_NEW_SMALL_INT(0); // st_nlink + t->items[4] = MP_OBJ_NEW_SMALL_INT(0); // st_uid + t->items[5] = MP_OBJ_NEW_SMALL_INT(0); // st_gid + t->items[6] = MP_OBJ_NEW_SMALL_INT(fno.fsize); // st_size + t->items[7] = MP_OBJ_NEW_SMALL_INT(seconds); // st_atime + t->items[8] = MP_OBJ_NEW_SMALL_INT(seconds); // st_mtime + t->items[9] = MP_OBJ_NEW_SMALL_INT(seconds); // st_ctime + + return t; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_stat_obj, os_stat); STATIC mp_obj_t os_sync(void) { storage_flush(); return mp_const_none; } - -MP_DEFINE_CONST_FUN_OBJ_0(os_sync_obj, os_sync); +STATIC MP_DEFINE_CONST_FUN_OBJ_0(os_sync_obj, os_sync); STATIC mp_obj_t os_urandom(mp_obj_t num) { mp_int_t n = mp_obj_get_int(num); @@ -170,8 +211,7 @@ STATIC mp_obj_t os_urandom(mp_obj_t num) { } return mp_obj_str_builder_end(o); } - -MP_DEFINE_CONST_FUN_OBJ_1(os_urandom_obj, os_urandom); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(os_urandom_obj, os_urandom); STATIC const mp_map_elem_t os_module_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_os) }, @@ -180,6 +220,7 @@ STATIC const mp_map_elem_t os_module_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR_mkdir), (mp_obj_t)&os_mkdir_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_remove), (mp_obj_t)&os_remove_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_rmdir), (mp_obj_t)&os_rmdir_obj }, + { MP_OBJ_NEW_QSTR(MP_QSTR_stat), (mp_obj_t)&os_stat_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_unlink), (mp_obj_t)&os_remove_obj }, // unlink aliases to remove { MP_OBJ_NEW_QSTR(MP_QSTR_sync), (mp_obj_t)&os_sync_obj }, diff --git a/stmhal/modtime.c b/stmhal/modtime.c index ea4e3210a6..f13bb15f84 100644 --- a/stmhal/modtime.c +++ b/stmhal/modtime.c @@ -34,22 +34,36 @@ #include "portmodules.h" #include "rtc.h" -STATIC const uint days_since_jan1[]= { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; +STATIC const uint16_t days_since_jan1[]= { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; -STATIC bool is_leap_year(uint year) { +STATIC bool is_leap_year(mp_uint_t year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; } // compute the day of the year, between 1 and 366 // month should be between 1 and 12, date should start at 1 -STATIC uint year_day(uint year, uint month, uint date) { - uint yday = days_since_jan1[month - 1] + date; +mp_uint_t mod_time_year_day(mp_uint_t year, mp_uint_t month, mp_uint_t date) { + mp_uint_t yday = days_since_jan1[month - 1] + date; if (month >= 3 && is_leap_year(year)) { yday += 1; } return yday; } +// returns the number of seconds, as an integer, since 1/1/2000 +mp_uint_t mod_time_seconds_since_2000(mp_uint_t year, mp_uint_t month, mp_uint_t date, mp_uint_t hour, mp_uint_t minute, mp_uint_t second) { + return + second + + minute * 60 + + hour * 3600 + + (mod_time_year_day(year, month, date) - 1 + + ((year - 2000 + 3) / 4) // add a day each 4 years starting with 2001 + - ((year - 2000 + 99) / 100) // subtract a day each 100 years starting with 2001 + + ((year - 2000 + 399) / 400) // add a day each 400 years starting with 2001 + ) * 86400 + + (year - 2000) * 31536000; +} + // returns time stored in RTC as: (year, month, date, hour, minute, second, weekday) // weekday is 0-6 for Mon-Sun STATIC mp_obj_t time_localtime(void) { @@ -67,7 +81,7 @@ STATIC mp_obj_t time_localtime(void) { mp_obj_new_int(time.Minutes), mp_obj_new_int(time.Seconds), mp_obj_new_int(date.WeekDay - 1), - mp_obj_new_int(year_day(2000 + date.Year, date.Month, date.Date)), + mp_obj_new_int(mod_time_year_day(2000 + date.Year, date.Month, date.Date)), }; return mp_obj_new_tuple(8, tuple); } @@ -95,17 +109,7 @@ STATIC mp_obj_t time_time(void) { RTC_TimeTypeDef time; HAL_RTC_GetTime(&RTCHandle, &time, FORMAT_BIN); HAL_RTC_GetDate(&RTCHandle, &date, FORMAT_BIN); - return mp_obj_new_int( - time.Seconds - + time.Minutes * 60 - + time.Hours * 3600 - + (year_day(2000 + date.Year, date.Month, date.Date) - 1 - + ((date.Year + 3) / 4) // add a day each 4 years starting with 2001 - - ((date.Year + 99) / 100) // subtract a day each 100 years starting with 2001 - + ((date.Year + 399) / 400) // add a day each 400 years starting with 2001 - ) * 86400 - + date.Year * 31536000 - ); + return mp_obj_new_int(mod_time_seconds_since_2000(2000 + date.Year, date.Month, date.Date, time.Hours, time.Minutes, time.Seconds)); } MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time); diff --git a/stmhal/portmodules.h b/stmhal/portmodules.h index f38feafe78..d8a3d8f879 100644 --- a/stmhal/portmodules.h +++ b/stmhal/portmodules.h @@ -28,3 +28,8 @@ extern const mp_obj_module_t os_module; extern const mp_obj_module_t pyb_module; extern const mp_obj_module_t stm_module; extern const mp_obj_module_t time_module; + +// additional helper functions exported by the modules + +mp_uint_t mod_time_year_day(mp_uint_t year, mp_uint_t month, mp_uint_t date); +mp_uint_t mod_time_seconds_since_2000(mp_uint_t year, mp_uint_t month, mp_uint_t date, mp_uint_t hour, mp_uint_t minute, mp_uint_t second); diff --git a/stmhal/qstrdefsport.h b/stmhal/qstrdefsport.h index 6bf7c52d8a..656410b9b1 100644 --- a/stmhal/qstrdefsport.h +++ b/stmhal/qstrdefsport.h @@ -61,6 +61,7 @@ Q(rng) Q(SD) Q(SDcard) Q(FileIO) +Q(flush) // Entries for sys.path Q(0:/) Q(0:/lib) @@ -237,6 +238,7 @@ Q(remove) Q(rmdir) Q(unlink) Q(sep) +Q(stat) Q(urandom) // for time module |