diff --git a/arduino/libretuya/api/FS.cpp b/arduino/libretuya/api/FS.cpp new file mode 100644 index 0000000..28cdfad --- /dev/null +++ b/arduino/libretuya/api/FS.cpp @@ -0,0 +1,228 @@ +/* + FS.cpp - file system wrapper + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "FS.h" + +using namespace fs; + +size_t File::write(uint8_t c) { + if (!*this) { + return 0; + } + return _p->write(&c, 1); +} + +time_t File::getLastWrite() { + if (!*this) { + return 0; + } + return _p->getLastWrite(); +} + +size_t File::write(const uint8_t *buf, size_t size) { + if (!*this) { + return 0; + } + return _p->write(buf, size); +} + +int File::available() { + if (!*this) { + return false; + } + return _p->size() - _p->position(); +} + +int File::read() { + if (!*this) { + return -1; + } + uint8_t result; + if (_p->read(&result, 1) != 1) { + return -1; + } + return result; +} + +size_t File::read(uint8_t *buf, size_t size) { + if (!*this) { + return -1; + } + return _p->read(buf, size); +} + +int File::peek() { + if (!*this) { + return -1; + } + size_t curPos = _p->position(); + int result = read(); + seek(curPos, SeekSet); + return result; +} + +void File::flush() { + if (!*this) { + return; + } + _p->flush(); +} + +bool File::seek(uint32_t pos, SeekMode mode) { + if (!*this) { + return false; + } + return _p->seek(pos, mode); +} + +size_t File::position() const { + if (!*this) { + return 0; + } + return _p->position(); +} + +size_t File::size() const { + if (!*this) { + return 0; + } + return _p->size(); +} + +bool File::setBufferSize(size_t size) { + if (!*this) { + return 0; + } + return _p->setBufferSize(size); +} + +void File::close() { + if (_p) { + _p->close(); + _p = nullptr; + } +} + +File::operator bool() const { + return _p != nullptr && *_p != false; +} + +const char *File::path() const { + if (!*this) { + return nullptr; + } + return _p->path(); +} + +const char *File::name() const { + if (!*this) { + return nullptr; + } + return _p->name(); +} + +// to implement +boolean File::isDirectory(void) { + if (!*this) { + return false; + } + return _p->isDirectory(); +} + +File File::openNextFile(const char *mode) { + if (!*this) { + return File(); + } + return _p->openNextFile(mode); +} + +void File::rewindDirectory(void) { + if (!*this) { + return; + } + _p->rewindDirectory(); +} + +File FS::open(const String &path, const char *mode, const bool create) { + return open(path.c_str(), mode, create); +} + +File FS::open(const char *path, const char *mode, const bool create) { + if (!_impl) { + return File(); + } + + return File(_impl->open(path, mode, create)); +} + +bool FS::exists(const char *path) { + if (!_impl) { + return false; + } + return _impl->exists(path); +} + +bool FS::exists(const String &path) { + return exists(path.c_str()); +} + +bool FS::remove(const char *path) { + if (!_impl) { + return false; + } + return _impl->remove(path); +} + +bool FS::remove(const String &path) { + return remove(path.c_str()); +} + +bool FS::rename(const char *pathFrom, const char *pathTo) { + if (!_impl) { + return false; + } + return _impl->rename(pathFrom, pathTo); +} + +bool FS::rename(const String &pathFrom, const String &pathTo) { + return rename(pathFrom.c_str(), pathTo.c_str()); +} + +bool FS::mkdir(const char *path) { + if (!_impl) { + return false; + } + return _impl->mkdir(path); +} + +bool FS::mkdir(const String &path) { + return mkdir(path.c_str()); +} + +bool FS::rmdir(const char *path) { + if (!_impl) { + return false; + } + return _impl->rmdir(path); +} + +bool FS::rmdir(const String &path) { + return rmdir(path.c_str()); +} diff --git a/arduino/libretuya/api/FS.h b/arduino/libretuya/api/FS.h new file mode 100644 index 0000000..58ae87d --- /dev/null +++ b/arduino/libretuya/api/FS.h @@ -0,0 +1,152 @@ +/* + FS.h - file system wrapper + Copyright (c) 2015 Ivan Grokhotkov. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#pragma once + +#include +#include + +namespace fs { + +#define FILE_READ "r" +#define FILE_WRITE "w" +#define FILE_APPEND "a" + +class File; + +class FileImpl; +typedef std::shared_ptr FileImplPtr; +class FSImpl; +typedef std::shared_ptr FSImplPtr; + +enum SeekMode { SeekSet = 0, SeekCur = 1, SeekEnd = 2 }; + +class File : public Stream { + public: + File(FileImplPtr p = FileImplPtr()) : _p(p) { + _timeout = 0; + } + + size_t write(uint8_t) override; + size_t write(const uint8_t *buf, size_t size) override; + int available() override; + int read() override; + int peek() override; + void flush() override; + size_t read(uint8_t *buf, size_t size); + + size_t readBytes(char *buffer, size_t length) { + return read((uint8_t *)buffer, length); + } + + bool seek(uint32_t pos, SeekMode mode); + + bool seek(uint32_t pos) { + return seek(pos, SeekSet); + } + + size_t position() const; + size_t size() const; + bool setBufferSize(size_t size); + void close(); + operator bool() const; + time_t getLastWrite(); + const char *path() const; + const char *name() const; + + boolean isDirectory(void); + File openNextFile(const char *mode = FILE_READ); + void rewindDirectory(void); + + protected: + FileImplPtr _p; +}; + +class FileImpl { + public: + virtual ~FileImpl() {} + + virtual size_t write(const uint8_t *buf, size_t size) = 0; + virtual size_t read(uint8_t *buf, size_t size) = 0; + virtual void flush() = 0; + virtual bool seek(uint32_t pos, SeekMode mode) = 0; + virtual size_t position() const = 0; + virtual size_t size() const = 0; + virtual bool setBufferSize(size_t size) = 0; + virtual void close() = 0; + virtual time_t getLastWrite() = 0; + virtual const char *path() const = 0; + virtual const char *name() const = 0; + virtual boolean isDirectory(void) = 0; + virtual FileImplPtr openNextFile(const char *mode) = 0; + virtual void rewindDirectory(void) = 0; + virtual operator bool() = 0; +}; + +class FS { + public: + FS(FSImplPtr impl) : _impl(impl) {} + + File open(const char *path, const char *mode = FILE_READ, const bool create = false); + File open(const String &path, const char *mode = FILE_READ, const bool create = false); + + bool exists(const char *path); + bool exists(const String &path); + + bool remove(const char *path); + bool remove(const String &path); + + bool rename(const char *pathFrom, const char *pathTo); + bool rename(const String &pathFrom, const String &pathTo); + + bool mkdir(const char *path); + bool mkdir(const String &path); + + bool rmdir(const char *path); + bool rmdir(const String &path); + + protected: + FSImplPtr _impl; +}; + +class FSImpl { + public: + FSImpl() {} + + virtual ~FSImpl() {} + + virtual FileImplPtr open(const char *path, const char *mode, const bool create) = 0; + virtual bool exists(const char *path) = 0; + virtual bool rename(const char *pathFrom, const char *pathTo) = 0; + virtual bool remove(const char *path) = 0; + virtual bool mkdir(const char *path) = 0; + virtual bool rmdir(const char *path) = 0; +}; + +} // namespace fs + +#ifndef FS_NO_GLOBALS +using fs::File; +using fs::FS; +using fs::SeekCur; +using fs::SeekEnd; +using fs::SeekMode; +using fs::SeekSet; +#endif // FS_NO_GLOBALS diff --git a/arduino/libretuya/api/LibreTuyaAPI.h b/arduino/libretuya/api/LibreTuyaAPI.h index bf12951..c5f6556 100644 --- a/arduino/libretuya/api/LibreTuyaAPI.h +++ b/arduino/libretuya/api/LibreTuyaAPI.h @@ -36,3 +36,7 @@ extern "C" { ) extern char *strdup(const char *); + +// ArduinCore-API doesn't define these anymore +#define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) +#define PGM_VOID_P const void * diff --git a/arduino/libretuya/api/WiFiClient.h b/arduino/libretuya/api/WiFiClient.h index 88842f4..8a60dea 100644 --- a/arduino/libretuya/api/WiFiClient.h +++ b/arduino/libretuya/api/WiFiClient.h @@ -35,6 +35,10 @@ class IWiFiClient : public Client { virtual size_t write(Stream &stream) = 0; + size_t write_P(PGM_P buffer, size_t size) { + return write((const uint8_t *)buffer, size); + } + virtual int fd() const = 0; virtual int socket() = 0; virtual int setTimeout(uint32_t seconds) = 0; diff --git a/arduino/libretuya/api/lt_logger.h b/arduino/libretuya/api/lt_logger.h index 27841c7..9d5abeb 100644 --- a/arduino/libretuya/api/lt_logger.h +++ b/arduino/libretuya/api/lt_logger.h @@ -77,14 +77,14 @@ void lt_log(const uint8_t level, const char *format, ...); #define LT_T_MOD(module, ...) \ do { \ if (module) { \ - LT_T(__VA_ARGS__) \ + LT_T(__VA_ARGS__); \ } \ } while (0) #define LT_D_MOD(module, ...) \ do { \ if (module) { \ - LT_D(__VA_ARGS__) \ + LT_D(__VA_ARGS__); \ } \ } while (0) diff --git a/arduino/libretuya/compat/FS.h b/arduino/libretuya/compat/FS.h new file mode 100644 index 0000000..deb849b --- /dev/null +++ b/arduino/libretuya/compat/FS.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/arduino/libretuya/compat/FSImpl.h b/arduino/libretuya/compat/FSImpl.h new file mode 100644 index 0000000..6f037f8 --- /dev/null +++ b/arduino/libretuya/compat/FSImpl.h @@ -0,0 +1 @@ +// nop diff --git a/arduino/libretuya/compat/pgmspace.h b/arduino/libretuya/compat/pgmspace.h new file mode 100644 index 0000000..8180390 --- /dev/null +++ b/arduino/libretuya/compat/pgmspace.h @@ -0,0 +1,3 @@ +#pragma once + +#include diff --git a/arduino/libretuya/compat/vfs_api.h b/arduino/libretuya/compat/vfs_api.h new file mode 100644 index 0000000..6f037f8 --- /dev/null +++ b/arduino/libretuya/compat/vfs_api.h @@ -0,0 +1 @@ +// nop