mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
Merge pull request #366 from M4xi1m3/omega-dev
Adding file support to micropython
This commit is contained in:
@@ -199,3 +199,19 @@ PythonTimeImport = "Import time module"
|
||||
PythonTimePrefix = "time module function prefix"
|
||||
PythonTimeSleep = "Warten Sie n Sekunden lang"
|
||||
PythonTimeMonotonic = "Monotone Zeit zurückgeben"
|
||||
PythonFileOpen = "Öffnet eine Datei"
|
||||
PythonFileSeekable = "Ist eine Datei durchsuchbar?"
|
||||
PythonFileSeek = "Dateicursor verschieben"
|
||||
PythonFileTell = "Cursorposition der Datei abrufen"
|
||||
PythonFileClose = "Schließt eine Datei"
|
||||
PythonFileClosed = "Wenn Datei geschlossen wurde"
|
||||
PythonFileRead = "Bis zu size Bytes lesen"
|
||||
PythonFileWrite = "Schreibe b in die Datei"
|
||||
PythonFileReadline = "Lies eine Zeile"
|
||||
PythonFileReadlines = "Liest eine Liste von Zeilen"
|
||||
PythonFileTruncate = "Größe der Datei ändern"
|
||||
PythonFileWritelines = "Schreibt eine Liste von Zeilen"
|
||||
PythonFileName = "Dateiname"
|
||||
PythonFileMode = "Dateiöffnungsmodus"
|
||||
PythonFileReadable = "Ist die Datei lesbar?"
|
||||
PythonFileWritable = "Ist die Datei beschreibbar?"
|
||||
|
||||
@@ -199,3 +199,19 @@ PythonTimeImport = "Import time module"
|
||||
PythonTimePrefix = "time module function prefix"
|
||||
PythonTimeSleep = "Wait for n second"
|
||||
PythonTimeMonotonic = "Return monotonic time"
|
||||
PythonFileOpen = "Opens a file"
|
||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||
PythonFileSeek = "Move file's cursor"
|
||||
PythonFileTell = "Get file's cursor location"
|
||||
PythonFileClose = "Closes a file"
|
||||
PythonFileClosed = "True if file was closed"
|
||||
PythonFileRead = "Read up to size bytes"
|
||||
PythonFileWrite = "Write b into file"
|
||||
PythonFileReadline = "Reads a line or up to size bytes"
|
||||
PythonFileReadlines = "Reads a list of lines"
|
||||
PythonFileTruncate = "Resize the file to size"
|
||||
PythonFileWritelines = "Writes a list of lines"
|
||||
PythonFileName = "Contains file's name"
|
||||
PythonFileMode = "Contains file's open mode"
|
||||
PythonFileReadable = "Tells if read can be used on a file"
|
||||
PythonFileWritable = "Tells if write can be used on a file"
|
||||
|
||||
@@ -199,3 +199,19 @@ PythonTimeImport = "Import time module"
|
||||
PythonTimePrefix = "time module function prefix"
|
||||
PythonTimeSleep = "Esperar n segundos"
|
||||
PythonTimeMonotonic = "Tiempo monótono de retorno"
|
||||
PythonFileOpen = "Opens a file"
|
||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||
PythonFileSeek = "Move file's internal cursor"
|
||||
PythonFileTell = "Get file's internal cursor location"
|
||||
PythonFileClose = "Closes a file"
|
||||
PythonFileClosed = "True if file was closed"
|
||||
PythonFileRead = "Read up to size bytes"
|
||||
PythonFileWrite = "Write b into file"
|
||||
PythonFileReadline = "Reads a line or up to size bytes"
|
||||
PythonFileReadlines = "Reads a list of lines"
|
||||
PythonFileTruncate = "Resize the file to size"
|
||||
PythonFileWritelines = "Writes a list of lines"
|
||||
PythonFileName = "Contains file's name"
|
||||
PythonFileMode = "Contains file's open mode"
|
||||
PythonFileReadable = "Tells if read can be used on a file"
|
||||
PythonFileWritable = "Tells if write can be used on a file"
|
||||
|
||||
@@ -199,3 +199,19 @@ PythonTimeImport = "Importation du module temps"
|
||||
PythonTimePrefix = "Préfixe fonction du module temps"
|
||||
PythonTimeSleep = "Attendre n secondes"
|
||||
PythonTimeMonotonic = "Retourne le temps monotonic"
|
||||
PythonFileOpen = "Ouvre un fichier"
|
||||
PythonFileSeekable = "Indique si seek peut être utilisé"
|
||||
PythonFileSeek = "Déplace le curseur interne"
|
||||
PythonFileTell = "Donne la posititon du curseur"
|
||||
PythonFileClose = "Ferme un fichier"
|
||||
PythonFileClosed = "True si le fichier a été fermé"
|
||||
PythonFileRead = "Lis jusqu'à size bytes"
|
||||
PythonFileWrite = "Écris b dans le fichier"
|
||||
PythonFileReadline = "Lis une ligne ou jusqu'à size bytes"
|
||||
PythonFileReadlines = "Lis une liste de lignes"
|
||||
PythonFileTruncate = "Redimensionne le fichier"
|
||||
PythonFileWritelines = "Écris une liste de lignes"
|
||||
PythonFileName = "Nom du fichier"
|
||||
PythonFileMode = "Mode d'ouverture du fichier"
|
||||
PythonFileReadable = "Indique si read peut être utilisé"
|
||||
PythonFileWritable = "Indique si write peut être utilisé"
|
||||
|
||||
@@ -199,3 +199,19 @@ PythonTimeImport = "Idömodul importálása"
|
||||
PythonTimePrefix = "idömodul funkció elötag"
|
||||
PythonTimeSleep = "Várj n másodpercet"
|
||||
PythonTimeMonotonic = "Vissza a monoton idö"
|
||||
PythonFileOpen = "Fájl megnyitása"
|
||||
PythonFileSeekable = "A fájl kereshető?"
|
||||
PythonFileSeek = "A fájl kurzorának áthelyezése"
|
||||
PythonFileTell = "A fájl kurzorának helye"
|
||||
PythonFileClose = "Bezár egy fájlt"
|
||||
PythonFileClosed = "Igaz, ha a fájl bezárt"
|
||||
PythonFileRead = "Olvasson méretbájtig"
|
||||
PythonFileWrite = "B beírása fájlba"
|
||||
PythonFileReadline = "Olvas egy sort"
|
||||
PythonFileReadlines = "Olvassa a sorok listáját"
|
||||
PythonFileTruncate = "A fájl átméretezése méretre"
|
||||
PythonFileWritelines = "Sorok listáját írja"
|
||||
PythonFileName = "a fájl neve"
|
||||
PythonFileMode = "a fájl nyitott módja"
|
||||
PythonFileReadable = "A fájl olvasható?"
|
||||
PythonFileWritable = "A fájl írható?"
|
||||
|
||||
@@ -199,3 +199,19 @@ PythonTimeImport = "Import time module"
|
||||
PythonTimePrefix = "time module function prefix"
|
||||
PythonTimeSleep = "Aguardar n segundos"
|
||||
PythonTimeMonotonic = "Retornar tempo monotônico"
|
||||
PythonFileOpen = "Opens a file"
|
||||
PythonFileSeekable = "Tells if seek can be used on a file"
|
||||
PythonFileSeek = "Move file's internal cursor"
|
||||
PythonFileTell = "Get file's internal cursor location"
|
||||
PythonFileClose = "Closes a file"
|
||||
PythonFileClosed = "True if file was closed"
|
||||
PythonFileRead = "Read up to size bytes"
|
||||
PythonFileWrite = "Write b into file"
|
||||
PythonFileReadline = "Reads a line or up to size bytes"
|
||||
PythonFileReadlines = "Reads a list of lines"
|
||||
PythonFileTruncate = "Resize the file to size"
|
||||
PythonFileWritelines = "Writes a list of lines"
|
||||
PythonFileName = "Contains file's name"
|
||||
PythonFileMode = "Contains file's open mode"
|
||||
PythonFileReadable = "Tells if read can be used on a file"
|
||||
PythonFileWritable = "Tells if write can be used on a file"
|
||||
|
||||
@@ -238,3 +238,35 @@ PythonTimeCommandImportFrom = "from time import *"
|
||||
PythonTimeCommandSleep = "sleep()"
|
||||
PythonTimeCommandSleepDemo = "sleep(n)"
|
||||
PythonTimeCommandMonotonic = "monotonic()"
|
||||
PythonCommandFileOpen = "open(name, [mode])"
|
||||
PythonCommandFileOpenWithoutArg = "open(\x11)"
|
||||
PythonCommandFileSeek = "file.seek(offset, [whence])"
|
||||
PythonCommandFileSeekWithoutArg = ".seek(\x11)"
|
||||
PythonCommandFileTell = "file.tell()"
|
||||
PythonCommandFileTellWithoutArg = ".tell()"
|
||||
PythonCommandFileSeekable = "file.seekable()"
|
||||
PythonCommandFileSeekableWithoutArg = ".seekable()"
|
||||
PythonCommandFileClose = "file.close()"
|
||||
PythonCommandFileCloseWithoutArg = ".close()"
|
||||
PythonCommandFileClosed = "file.closed"
|
||||
PythonCommandFileClosedWithoutArg = ".closed"
|
||||
PythonCommandFileRead = "file.read([size])"
|
||||
PythonCommandFileReadWithoutArg = ".read(\x11)"
|
||||
PythonCommandFileWrite = "file.write(b)"
|
||||
PythonCommandFileWriteWithoutArg = ".write(\x11)"
|
||||
PythonCommandFileReadline = "file.readline([size])"
|
||||
PythonCommandFileReadlineWithoutArg = ".readline(\x11)"
|
||||
PythonCommandFileReadlines = "file.readlines([hint])"
|
||||
PythonCommandFileReadlinesWithoutArg = ".readlines(\x11)"
|
||||
PythonCommandFileTruncate = "file.truncate([size])"
|
||||
PythonCommandFileTruncateWithoutArg = ".truncate(\x11)"
|
||||
PythonCommandFileWritelines = "file.writelines(lines)"
|
||||
PythonCommandFileWritelinesWithoutArg = ".writelines(\x11)"
|
||||
PythonCommandFileName = "file.name"
|
||||
PythonCommandFileNameWithoutArg = ".name"
|
||||
PythonCommandFileMode = "file.mode"
|
||||
PythonCommandFileModeWithoutArg = ".mode"
|
||||
PythonCommandFileReadable = "file.readable()"
|
||||
PythonCommandFileReadableWithoutArg = ".readable()"
|
||||
PythonCommandFileWritable = "file.writable()"
|
||||
PythonCommandFileWritableWithoutArg = ".writable()"
|
||||
|
||||
@@ -422,11 +422,39 @@ const ToolboxMessageTree functionsChildren[] = {
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandReturn, I18n::Message::Default)
|
||||
};
|
||||
|
||||
const ToolboxMessageTree fileChildren[] {
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileOpen, I18n::Message::PythonFileOpen, false, I18n::Message::PythonCommandFileOpenWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileClose, I18n::Message::PythonFileClose, false, I18n::Message::PythonCommandFileCloseWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileClosed, I18n::Message::PythonFileClosed, false, I18n::Message::PythonCommandFileClosedWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileMode, I18n::Message::PythonFileMode, false, I18n::Message::PythonCommandFileModeWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileName, I18n::Message::PythonFileName, false, I18n::Message::PythonCommandFileNameWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileRead, I18n::Message::PythonFileRead, false, I18n::Message::PythonCommandFileReadWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileReadable, I18n::Message::PythonFileReadable, false, I18n::Message::PythonCommandFileReadableWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileReadline, I18n::Message::PythonFileReadline, false, I18n::Message::PythonCommandFileReadlineWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileReadlines, I18n::Message::PythonFileReadlines, false, I18n::Message::PythonCommandFileReadlinesWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileSeek, I18n::Message::PythonFileSeek, false, I18n::Message::PythonCommandFileSeekWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileSeekable, I18n::Message::PythonFileSeekable, false, I18n::Message::PythonCommandFileSeekableWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileTell, I18n::Message::PythonFileTell, false, I18n::Message::PythonCommandFileTellWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileTruncate, I18n::Message::PythonFileTruncate, false, I18n::Message::PythonCommandFileTruncateWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileWrite, I18n::Message::PythonFileWrite, false, I18n::Message::PythonCommandFileWriteWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileWritable, I18n::Message::PythonFileWritable, false, I18n::Message::PythonCommandFileWritableWithoutArg),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFileWritelines, I18n::Message::PythonFileWritelines, false, I18n::Message::PythonCommandFileWritelinesWithoutArg),
|
||||
};
|
||||
|
||||
const ToolboxMessageTree exceptionsChildren[] = {
|
||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1Error),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept1ErrorElseWithArg, I18n::Message::Default, false, I18n::Message::TryExcept1ErrorElse),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::TryExcept2ErrorWithArg, I18n::Message::Default, false, I18n::Message::TryExcept2Error),
|
||||
ToolboxMessageTree::Leaf(I18n::Message::WithInstructionWithArg, I18n::Message::Default, false, I18n::Message::WithInstruction),
|
||||
};
|
||||
|
||||
const ToolboxMessageTree menu[] = {
|
||||
ToolboxMessageTree::Node(I18n::Message::LoopsAndTests, loopsAndTestsChildren),
|
||||
ToolboxMessageTree::Node(I18n::Message::Modules, modulesChildren),
|
||||
ToolboxMessageTree::Node(I18n::Message::Catalog, catalogChildren),
|
||||
ToolboxMessageTree::Node(I18n::Message::Functions, functionsChildren)
|
||||
ToolboxMessageTree::Node(I18n::Message::Functions, functionsChildren),
|
||||
ToolboxMessageTree::Node(I18n::Message::Files, fileChildren),
|
||||
ToolboxMessageTree::Node(I18n::Message::Exceptions, exceptionsChildren)
|
||||
};
|
||||
|
||||
const ToolboxMessageTree toolboxModel = ToolboxMessageTree::Node(I18n::Message::Toolbox, menu);
|
||||
@@ -452,7 +480,7 @@ bool PythonToolbox::handleEvent(Ion::Events::Event event) {
|
||||
}
|
||||
|
||||
KDCoordinate PythonToolbox::rowHeight(int j) {
|
||||
if (typeAtLocation(0, j) == Toolbox::LeafCellType && m_messageTreeModel->label() == I18n::Message::IfStatementMenu) {
|
||||
if (typeAtLocation(0, j) == Toolbox::LeafCellType && (m_messageTreeModel->label() == I18n::Message::IfStatementMenu || m_messageTreeModel->label() == I18n::Message::Exceptions)) {
|
||||
/* To get the exact height needed for each cell, we have to compute its
|
||||
* text size, which means scan the text char by char to look for '\n'
|
||||
* chars. This is very costly and ruins the speed performance when
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Funktionen"
|
||||
Catalog = "Katalog"
|
||||
Modules = "Module"
|
||||
LoopsAndTests = "Schleifen und Tests"
|
||||
Files = "Dateien"
|
||||
Exceptions = "Ausnahmen"
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Functions"
|
||||
Catalog = "Catalog"
|
||||
Modules = "Modules"
|
||||
LoopsAndTests = "Loops and tests"
|
||||
Files = "Files"
|
||||
Exceptions = "Exceptions"
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Functions"
|
||||
Catalog = "Catalog"
|
||||
Modules = "Modules"
|
||||
LoopsAndTests = "Loops and tests"
|
||||
Files = "Files"
|
||||
Exceptions = "Exceptions"
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Fonctions"
|
||||
Catalog = "Catalogue"
|
||||
Modules = "Modules"
|
||||
LoopsAndTests = "Boucles et tests"
|
||||
Files = "Fichiers"
|
||||
Exceptions = "Exceptions"
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Funkciók"
|
||||
Catalog = "Katalógus"
|
||||
Modules = "Modulok"
|
||||
LoopsAndTests = "Hurkok és tesztek"
|
||||
Files = "Fájlok"
|
||||
Exceptions = "Kivételek"
|
||||
|
||||
@@ -2,3 +2,5 @@ Functions = "Functions"
|
||||
Catalog = "Catalog"
|
||||
Modules = "Modules"
|
||||
LoopsAndTests = "Loops and tests"
|
||||
Files = "Files"
|
||||
Exceptions = "Exceptions"
|
||||
|
||||
@@ -44,6 +44,14 @@ ForInRange2ArgsLoop = "for i in range(\x11,):\n "
|
||||
ForInRange2ArgsLoopWithArg = "for i in range(start, stop):\n instruction"
|
||||
ForInRange1ArgLoop = "for i in range(\x11):\n "
|
||||
ForInRange1ArgLoopWithArg = "for i in range(size):\n instruction"
|
||||
TryExcept1Error = "try:\n \nexcept \x11:\n "
|
||||
TryExcept1ErrorWithArg = "try:\n instruction\nexcept Error:\n reaction"
|
||||
TryExcept1ErrorElse = "try:\n \nexcept \x11:\n \nelse:\n "
|
||||
TryExcept1ErrorElseWithArg = "try:\n instruction\nexcept Error:\n reaction\nelse:\n clean"
|
||||
TryExcept2Error = "try:\n \nexcept (\x11):\n "
|
||||
TryExcept2ErrorWithArg = "try:\n instruction\nexcept (Error1, Error2):\n reaction"
|
||||
WithInstruction = "with \x11 as :\n "
|
||||
WithInstructionWithArg = "with expression as target:\n instructions"
|
||||
PythonCommandDef = "def \x11():\n "
|
||||
PythonCommandDefWithArg = "def function(x):"
|
||||
PythonCommandReturn = "return "
|
||||
|
||||
@@ -120,6 +120,9 @@ public:
|
||||
void destroyRecordWithBaseNameAndExtension(const char * baseName, const char * extension);
|
||||
void destroyRecordsWithExtension(const char * extension);
|
||||
|
||||
// Useful
|
||||
static bool FullNameCompliant(const char * name);
|
||||
|
||||
private:
|
||||
constexpr static uint32_t Magic = 0xEE0BDDBA;
|
||||
constexpr static size_t k_maxRecordSize = (1 << sizeof(record_size_t)*8);
|
||||
@@ -149,7 +152,6 @@ private:
|
||||
bool isFullNameTaken(const char * fullName, const Record * recordToExclude = nullptr);
|
||||
bool isBaseNameWithExtensionTaken(const char * baseName, const char * extension, Record * recordToExclude = nullptr);
|
||||
bool isNameOfRecordTaken(Record r, const Record * recordToExclude);
|
||||
static bool FullNameCompliant(const char * name);
|
||||
char * endBuffer();
|
||||
size_t sizeOfBaseNameAndExtension(const char * baseName, const char * extension) const;
|
||||
size_t sizeOfRecordWithBaseNameAndExtension(const char * baseName, const char * extension, size_t size) const;
|
||||
|
||||
@@ -136,6 +136,7 @@ port_src += $(addprefix python/port/,\
|
||||
helpers.c \
|
||||
mod/ion/modion.cpp \
|
||||
mod/ion/modion_table.cpp \
|
||||
mod/ion/file.cpp \
|
||||
mod/kandinsky/modkandinsky.cpp \
|
||||
mod/kandinsky/modkandinsky_table.c \
|
||||
mod/matplotlib/modmatplotlib.cpp \
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
#include "py/builtin.h"
|
||||
#include "py/obj.h"
|
||||
#include "py/runtime.h"
|
||||
#include "mod/ion/file.h"
|
||||
#include <string.h>
|
||||
#include "mphalport.h"
|
||||
|
||||
mp_obj_t mp_builtin_open(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
|
||||
mp_arg_check_num(n_args, kwargs->used, 1, 2, false);
|
||||
|
||||
if (n_args == 2) {
|
||||
return file_open_mode(args[0], args[1]);
|
||||
} else {
|
||||
return file_open(args[0]);
|
||||
}
|
||||
|
||||
return mp_const_none;
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);
|
||||
|
||||
@@ -493,3 +493,34 @@ Q(colormode)
|
||||
Q(time)
|
||||
Q(sleep)
|
||||
Q(monotonic)
|
||||
|
||||
// file QSTRs
|
||||
Q(file)
|
||||
|
||||
Q(close)
|
||||
Q(closed)
|
||||
Q(flush)
|
||||
Q(isatty)
|
||||
Q(readable)
|
||||
Q(readline)
|
||||
Q(readlines)
|
||||
Q(seekable)
|
||||
Q(tell)
|
||||
Q(writable)
|
||||
Q(writelines)
|
||||
|
||||
Q(fileno)
|
||||
Q(seek)
|
||||
Q(truncate)
|
||||
|
||||
Q(write)
|
||||
|
||||
Q(read)
|
||||
|
||||
Q(name)
|
||||
Q(mode)
|
||||
|
||||
Q(SEEK_SET)
|
||||
Q(SEEK_CUR)
|
||||
Q(SEEK_END)
|
||||
|
||||
|
||||
1004
python/port/mod/ion/file.cpp
Normal file
1004
python/port/mod/ion/file.cpp
Normal file
File diff suppressed because it is too large
Load Diff
9
python/port/mod/ion/file.h
Normal file
9
python/port/mod/ion/file.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef MP_MOD_FILE_H
|
||||
#define MP_MOD_FILE_H
|
||||
|
||||
#include <py/obj.h>
|
||||
|
||||
mp_obj_t file_open(mp_obj_t file_name);
|
||||
mp_obj_t file_open_mode(mp_obj_t file_name, mp_obj_t file_mode);
|
||||
|
||||
#endif
|
||||
@@ -1,3 +1,4 @@
|
||||
#include <py/obj.h>
|
||||
|
||||
mp_obj_t modion_keyboard_keydown(mp_obj_t key_o);
|
||||
extern const mp_obj_type_t file_type;
|
||||
|
||||
@@ -65,6 +65,8 @@ STATIC const mp_rom_map_elem_t modion_module_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_KEY_EE), MP_OBJ_NEW_SMALL_INT(Ion::Keyboard::Key::EE) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_KEY_ANS), MP_OBJ_NEW_SMALL_INT(Ion::Keyboard::Key::Ans) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_KEY_EXE), MP_OBJ_NEW_SMALL_INT(Ion::Keyboard::Key::EXE) },
|
||||
|
||||
{ MP_ROM_QSTR(MP_QSTR_file), (mp_obj_t)&file_type}
|
||||
};
|
||||
|
||||
STATIC MP_DEFINE_CONST_DICT(modion_module_globals, modion_module_globals_table);
|
||||
|
||||
Reference in New Issue
Block a user