From 00ec3c68849fb544b2188e8931d1786d428ef27a Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Fri, 26 Jul 2024 18:20:22 +0200 Subject: [PATCH 1/7] Float support on slider --- src/Card.cpp | 21 +++++++++++++++++++++ src/Card.h | 18 +++++++++++++++--- src/ESPDash.cpp | 21 ++++++++++++++++----- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/Card.cpp b/src/Card.cpp index 01d9003e..c890c944 100644 --- a/src/Card.cpp +++ b/src/Card.cpp @@ -15,6 +15,21 @@ Card::Card(ESPDash *dashboard, const int type, const char* name, const char* sym _dashboard->add(this); } +Card::Card(ESPDash *dashboard, const int type, const char* name, const char* symbol, const float min, const float max, const float step){ + _dashboard = dashboard; + _id = dashboard->nextId(); + _type = type; + _name = name; + _symbol = symbol; + _value_min_f = min; + _value_max_f = max; + _value_step_f = step; + + _value_type = Card::FLOAT; + + _dashboard->add(this); +} + /* Attach Function Callback */ @@ -22,6 +37,12 @@ void Card::attachCallback(std::function cb){ _callback = cb; } +/* + Attach Function Callback +*/ +void Card::attachCallbackF(std::function cb){ + _callback_f = cb; +} /* Value update methods diff --git a/src/Card.h b/src/Card.h index 7c0747e5..5e2948b1 100644 --- a/src/Card.h +++ b/src/Card.h @@ -42,15 +42,27 @@ class Card { int _value_i; }; String _value_s; - int _value_min; - int _value_max; - int _value_step; + union alignas(4) { + float _value_min_f; + int _value_min; + }; + union alignas(4) { + float _value_max_f; + int _value_max; + }; + union alignas(4) { + float _value_step_f; + int _value_step; + }; String _symbol; std::function _callback = nullptr; + std::function _callback_f = nullptr; public: Card(ESPDash *dashboard, const int type, const char* name, const char* symbol = "", const int min = 0, const int max = 0, const int step = 1); + Card(ESPDash *dashboard, const int type, const char* name, const char* symbol, const float min, const float max, const float step); void attachCallback(std::function cb); + void attachCallbackF(std::function cb); void update(int value); void update(int value, const char* symbol); void update(bool value); diff --git a/src/ESPDash.cpp b/src/ESPDash.cpp index 2f78a78d..782e5a21 100644 --- a/src/ESPDash.cpp +++ b/src/ESPDash.cpp @@ -89,7 +89,11 @@ ESPDash::ESPDash(AsyncWebServer* server, const char* uri, bool enable_default_st for(int i=0; i < cards.Size(); i++){ Card *p = cards[i]; if(id == p->_id){ - if(p->_callback != nullptr){ + if(p->_callback_f != nullptr && p->_value_type == Card::FLOAT){ + _asyncAccessInProgress = true; + p->_callback_f(json["value"].as()); + _asyncAccessInProgress = false; + } else if(p->_callback != nullptr) { _asyncAccessInProgress = true; p->_callback(json["value"].as()); _asyncAccessInProgress = false; @@ -373,10 +377,17 @@ void ESPDash::generateComponentJSON(JsonObject& doc, Card* card, bool change_onl if (!change_only){ doc["n"] = card->_name; doc["t"] = cardTags[card->_type].type; - doc["min"] = card->_value_min; - doc["max"] = card->_value_max; - if (card->_value_step != 1) - doc["step"] = card->_value_step; + if (card->_type == SLIDER_CARD || card->_type == PROGRESS_CARD) { + if(card->_value_type == Card::FLOAT) { + doc["min"] = String(card->_value_min_f, 2); + doc["max"] = String(card->_value_max_f, 2); + doc["step"] = String(card->_value_step_f, 2); + } else { + doc["min"] = card->_value_min; + doc["max"] = card->_value_max; + doc["step"] = card->_value_step; + } + } } if(change_only || !card->_symbol.isEmpty()) doc["s"] = card->_symbol; From 896b17bd8448241611e050c88a2716260ccc6955 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Fri, 4 Oct 2024 15:44:53 +0200 Subject: [PATCH 2/7] Bugfix: do not return on void function --- src/ESPDash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ESPDash.cpp b/src/ESPDash.cpp index 782e5a21..a0d34586 100644 --- a/src/ESPDash.cpp +++ b/src/ESPDash.cpp @@ -69,7 +69,7 @@ ESPDash::ESPDash(AsyncWebServer* server, const char* uri, bool enable_default_st generateLayoutJSON(client, false); _asyncAccessInProgress = false; } else if (json["command"] == "ping") { - return _ws->text(client->id(), "{\"command\":\"pong\"}"); + _ws->text(client->id(), "{\"command\":\"pong\"}"); } else if (json["command"] == "button:clicked") { // execute and reference card data struct to funtion uint32_t id = json["id"].as(); From 54ad1989a27a1abae83fd5e3b9d717a860bf6452 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Fri, 4 Oct 2024 15:45:16 +0200 Subject: [PATCH 3/7] Update versions and CI --- .github/workflows/ci.yml | 94 +++++++++++++++++++++++----------------- library.json | 2 +- platformio.ini | 52 ++++++++++++---------- 3 files changed, 84 insertions(+), 64 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10677e8e..724a18f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,13 +56,13 @@ jobs: run: arduino-cli core install --additional-urls "${{ matrix.index_url }}" ${{ matrix.core }} - name: Install AsyncTCP - run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/AsyncTCP#v3.2.3 + run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/AsyncTCP#v3.2.10 - name: Install ESPAsyncTCP run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/esphome-ESPAsyncTCP#v2.0.0 - name: Install ESPAsyncWebServer - run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/ESPAsyncWebServer#v3.1.1 + run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/mathieucarbou/ESPAsyncWebServer#v3.3.14 - name: Install ArduinoJson run: ARDUINO_LIBRARY_ENABLE_UNSAFE_INSTALL=true arduino-cli lib install --git-url https://github.com/bblanchon/ArduinoJson#v7.1.0 @@ -86,58 +86,72 @@ jobs: run: arduino-cli compile --library . --warnings none -b ${{ matrix.board }} "examples/Interactive/Interactive.ino" platformio: - name: pio ${{ matrix.name }} + name: "pio:${{ matrix.env }}:${{ matrix.board }}" runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - - name: esp32dev|arduino + - env: ci-arduino-2 board: esp32dev - platform: espressif32 - opts: "--project-option 'lib_compat_mode = strict'" - - name: esp32dev|arduino-2 - board: esp32dev - platform: espressif32@6.7.0 - opts: "--project-option 'lib_compat_mode = strict'" - - name: esp32dev|arduino-3 - board: esp32dev - platform: espressif32 - opts: "--project-option 'lib_compat_mode = strict' --project-option 'platform_packages=platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.3, platform_packages=platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.3/esp32-arduino-libs-3.0.3.zip'" - - name: esp32-s3-devkitc-1|arduino + - env: ci-arduino-2 + board: esp32-s2-saola-1 + - env: ci-arduino-2 board: esp32-s3-devkitc-1 - platform: espressif32 - opts: "--project-option 'lib_compat_mode = strict'" - - name: esp32-s3-devkitc-1|arduino-2 + - env: ci-arduino-2 + board: esp32-c3-devkitc-02 + + - env: ci-arduino-3 + board: esp32dev + - env: ci-arduino-3 + board: esp32-s2-saola-1 + - env: ci-arduino-3 board: esp32-s3-devkitc-1 - platform: espressif32@6.7.0 - opts: "--project-option 'lib_compat_mode = strict'" - - name: esp32-s3-devkitc-1|arduino-3 + - env: ci-arduino-3 + board: esp32-c3-devkitc-02 + - env: ci-arduino-3 + board: esp32-c6-devkitc-1 + + - env: ci-arduino-310rc1 + board: esp32dev + - env: ci-arduino-310rc1 + board: esp32-s2-saola-1 + - env: ci-arduino-310rc1 board: esp32-s3-devkitc-1 - platform: espressif32 - opts: "--project-option 'lib_compat_mode = strict' --project-option 'platform_packages=platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.3, platform_packages=platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.3/esp32-arduino-libs-3.0.3.zip'" - - name: huzzah|espressif8266 + - env: ci-arduino-310rc1 + board: esp32-c3-devkitc-02 + - env: ci-arduino-310rc1 + board: esp32-c6-devkitc-1 + + - env: ci-esp8266 board: huzzah - platform: espressif8266 - opts: "--project-option 'lib_compat_mode = strict'" + - env: ci-esp8266 + board: d1_mini steps: - - uses: actions/checkout@v4 - - name: Set up cache + - name: Checkout + uses: actions/checkout@v4 + + - name: Cache PlatformIO uses: actions/cache@v4 with: + key: ${{ runner.os }}-pio path: | - ~/.platformio ~/.cache/pip - key: ${{ matrix.name }} - - uses: actions/setup-python@v5 + ~/.platformio + + - name: Python + uses: actions/setup-python@v5 with: python-version: "3.x" - - run: pip install platformio - - run: platformio platform install ${{ matrix.platform }} - - - run: platformio ci "examples/AccessPoint/AccessPoint.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} - - run: platformio ci "examples/Basic/Basic.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} - - run: platformio ci "examples/Benchmark/Benchmark.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} - - run: platformio ci "examples/Chart/Chart.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} - - run: platformio ci "examples/Dynamic/Dynamic.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} - - run: platformio ci "examples/Interactive/Interactive.ino" -l '.' -b ${{ matrix.board }} ${{ matrix.opts }} + + - name: Build + run: | + python -m pip install --upgrade pip + pip install --upgrade platformio + + - run: PLATFORMIO_SRC_DIR=examples/AccessPoint PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} + - run: PLATFORMIO_SRC_DIR=examples/Basic PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} + - run: PLATFORMIO_SRC_DIR=examples/Benchmark PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} + - run: PLATFORMIO_SRC_DIR=examples/Chart PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} + - run: PLATFORMIO_SRC_DIR=examples/Dynamic PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} + - run: PLATFORMIO_SRC_DIR=examples/Interactive PIO_BOARD=${{ matrix.board }} pio run -e ${{ matrix.env }} diff --git a/library.json b/library.json index 4d524e00..15b53f9c 100644 --- a/library.json +++ b/library.json @@ -28,7 +28,7 @@ { "owner": "mathieucarbou", "name": "ESPAsyncWebServer", - "version": "^3.1.1", + "version": "^3.3.14", "platforms": ["espressif8266", "espressif32"] } ] diff --git a/platformio.ini b/platformio.ini index 57e99b01..d57f0eae 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,3 +1,12 @@ +[platformio] +lib_dir = . +; src_dir = examples/AccessPoint +; src_dir = examples/Basic +src_dir = examples/Benchmark +; src_dir = examples/Chart +; src_dir = examples/Dynamic +; src_dir = examples/Interactive + [env] framework = arduino build_flags = @@ -6,40 +15,37 @@ build_flags = -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG lib_deps = bblanchon/ArduinoJson@^7.1.0 - mathieucarbou/AsyncTCP@^3.2.3 - mathieucarbou/ESPAsyncWebServer@^3.1.1 + mathieucarbou/ESPAsyncWebServer@^3.3.14 upload_protocol = esptool monitor_speed = 115200 monitor_filters = esp32_exception_decoder, log2file -[platformio] -lib_dir = . -; src_dir = examples/AccessPoint -; src_dir = examples/Basic -src_dir = examples/Benchmark -; src_dir = examples/Chart -; src_dir = examples/Dynamic -; src_dir = examples/Interactive - -[env:arduino] -platform = espressif32 -board = esp32-s3-devkitc-1 - [env:arduino-2] platform = espressif32@6.7.0 board = esp32-s3-devkitc-1 [env:arduino-3] -platform = espressif32 -platform_packages= - platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.3 - platformio/framework-arduinoespressif32-libs @ https://github.com/espressif/arduino-esp32/releases/download/3.0.3/esp32-arduino-libs-3.0.3.zip +platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.10-rc1/platform-espressif32.zip board = esp32-s3-devkitc-1 [env:esp8266] platform = espressif8266 board = huzzah -lib_deps = - bblanchon/ArduinoJson@^7.1.0 - mathieucarbou/ESPAsyncWebServer@^3.1.1 - esphome/ESPAsyncTCP-esphome@^2.0.0 + +; CI + +[env:ci-arduino-2] +platform = espressif32@6.9.0 +board = ${sysenv.PIO_BOARD} + +[env:ci-arduino-3] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.05/platform-espressif32.zip +board = ${sysenv.PIO_BOARD} + +[env:ci-arduino-310rc1] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.10-rc1/platform-espressif32.zip +board = ${sysenv.PIO_BOARD} + +[env:ci-esp8266] +platform = espressif8266 +board = ${sysenv.PIO_BOARD} From 7e580deccf01a388eac9962d8e6c71eaabcb66be Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Tue, 22 Oct 2024 03:13:59 +0530 Subject: [PATCH 4/7] fix: bump version --- docs/Written Offer for Source Code.pdf | Bin 50820 -> 0 bytes library.json | 2 +- library.properties | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 docs/Written Offer for Source Code.pdf diff --git a/docs/Written Offer for Source Code.pdf b/docs/Written Offer for Source Code.pdf deleted file mode 100644 index b9b6a62a3d68056eab66db63006f06b2b3aac04c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50820 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.&ux@f>$&a{%T1iILgIFQWIKMs>~l9AFBNl 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 diff --git a/library.json b/library.json index 1cf55b52..2ae4065d 100644 --- a/library.json +++ b/library.json @@ -15,7 +15,7 @@ "maintainer": true } ], - "version": "4.0.7", + "version": "4.0.8", "frameworks": "arduino", "platforms": ["espressif32", "espressif8266"], "dependencies": [ diff --git a/library.properties b/library.properties index 58c76822..3287b59b 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESP-DASH -version=4.0.7 +version=4.0.8 author=Ayush Sharma category=Communication maintainer=Ayush Sharma From 9b13bdc28270162594051c281fae450e379c6cf1 Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Tue, 22 Oct 2024 03:51:18 +0530 Subject: [PATCH 5/7] feat: added CLA --- .github/workflows/cla.yml | 29 +++++++++++++ CLA.md | 85 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 .github/workflows/cla.yml create mode 100644 CLA.md diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 00000000..228a70da --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,29 @@ +name: "CLA Assistant" +on: + issue_comment: + types: [created] + pull_request_target: + types: [opened,closed,synchronize] + +# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings +permissions: + actions: write + contents: write # this can be 'read' if the signatures are in remote repository + pull-requests: write + statuses: write + +jobs: + CLAAssistant: + runs-on: ubuntu-latest + steps: + - name: "CLA Assistant" + if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target' + uses: contributor-assistant/github-action@v2.6.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + path-to-signatures: '.github/cla-signatures/cla.json' + path-to-document: 'https://github.com/ayushsharma82/ESP-DASH/blob/master/CLA.md' # e.g. a CLA or a DCO document + # branch should not be protected + branch: 'dev' + allowlist: ayushsharma82,bot* diff --git a/CLA.md b/CLA.md new file mode 100644 index 00000000..38adeb75 --- /dev/null +++ b/CLA.md @@ -0,0 +1,85 @@ +# Contributor Agreement + +## Individual Contributor Non-Exclusive License Agreement + +Thank you for your interest in contributing to Softt's Software ("We" or "Us"). + +The purpose of this contributor agreement ("Agreement") is to clarify and document the rights granted by contributors to Us. + +### How to use this Contributor Agreement + +If You are an employee and have created the Contribution as part of your employment, You need to have Your employer approve this Agreement or sign the Entity version of this document. If You do not own the Copyright in the entire work of authorship, any other author of the Contribution should also sign this – in any event, please contact Us at + +### 1\. Definitions + +**"You"** means the individual Copyright owner who Submits a Contribution to Us. + +**"Legal Entity"** means an entity that is not a natural person. + +**"Affiliate"** means any other Legal Entity that controls, is controlled by, or under common control with that Legal Entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such Legal Entity, whether by contract or otherwise, (ii) ownership of fifty percent (50%) or more of the outstanding shares or securities that vote to elect the management or other persons who direct such Legal Entity or (iii) beneficial ownership of such entity. + +**"Contribution"** means any original work of authorship, including any original modifications or additions to an existing work of authorship, Submitted by You to Us, in which You own the Copyright. + +**"Copyright"** means all rights protecting works of authorship, including copyright, moral and neighboring rights, as appropriate, for the full term of their existence. + +**"Material"** means the software or documentation made available by Us to third parties. When this Agreement covers more than one software project, the Material means the software or documentation to which the Contribution was Submitted. After You Submit the Contribution, it may be included in the Material. + +**"Submit"** means any act by which a Contribution is transferred to Us by You by means of tangible or intangible media, including but not limited to electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Us, but excluding any transfer that is conspicuously marked or otherwise designated in writing by You as "Not a Contribution." + +**"Documentation"** means any non-software portion of a Contribution. + +### 2\. License grant + +#### 2.1 Copyright license to Us + +Subject to the terms and conditions of this Agreement, You hereby grant to Us a worldwide, royalty-free, NON-exclusive, perpetual and irrevocable (except as stated in Section 8.2) license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, under the Copyright covering the Contribution to use the Contribution by all means, including, but not limited to: + +* publish the Contribution, +* modify the Contribution, +* prepare derivative works based upon or containing the Contribution and/or to combine the Contribution with other Materials, +* reproduce the Contribution in original or modified form, +* distribute, to make the Contribution available to the public, display and publicly perform the Contribution in original or modified form. + +#### 2.2 Moral rights + +Moral Rights remain unaffected to the extent they are recognized and not waivable by applicable law. Notwithstanding, You may add your name to the attribution mechanism customary used in the Materials you Contribute to, such as the header of the source code files of Your Contribution, and We will respect this attribution when using Your Contribution. + +### 3\. Patents + +#### 3.1 Patent license + +Subject to the terms and conditions of this Agreement You hereby grant to Us and to recipients of Materials distributed by Us a worldwide, royalty-free, non-exclusive, perpetual and irrevocable (except as stated in Section 3.2) patent license, with the right to transfer an unlimited number of non-exclusive licenses or to grant sublicenses to third parties, to make, have made, use, sell, offer for sale, import and otherwise transfer the Contribution and the Contribution in combination with any Material (and portions of such combination). This license applies to all patents owned or controlled by You, whether already acquired or hereafter acquired, that would be infringed by making, having made, using, selling, offering for sale, importing or otherwise transferring of Your Contribution(s) alone or by combination of Your Contribution(s) with any Material. + +#### 3.2 Revocation of patent license + +You reserve the right to revoke the patent license stated in section 3.1 if We make any infringement claim that is targeted at your Contribution and not asserted for a Defensive Purpose. An assertion of claims of the Patents shall be considered for a "Defensive Purpose" if the claims are asserted against an entity that has filed, maintained, threatened, or voluntarily participated in a patent infringement lawsuit against Us or any of Our licensees. + +### 4. Disclaimer + +THE CONTRIBUTION IS PROVIDED "AS IS". MORE PARTICULARLY, ALL EXPRESS OR IMPLIED WARRANTIES INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTY OF SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE EXPRESSLY DISCLAIMED BY YOU TO US AND BY US TO YOU. TO THE EXTENT THAT ANY SUCH WARRANTIES CANNOT BE DISCLAIMED, SUCH WARRANTY IS LIMITED IN DURATION AND EXTENT TO THE MINIMUM PERIOD AND EXTENT PERMITTED BY LAW. + +### 5. Consequential damage waiver + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL YOU OR WE BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF ANTICIPATED SAVINGS, LOSS OF DATA, INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL AND EXEMPLARY DAMAGES ARISING OUT OF THIS AGREEMENT REGARDLESS OF THE LEGAL OR EQUITABLE THEORY (CONTRACT, TORT OR OTHERWISE) UPON WHICH THE CLAIM IS BASED. + +### 6. Approximation of disclaimer and damage waiver + +IF THE DISCLAIMER AND DAMAGE WAIVER MENTIONED IN SECTION 4. AND SECTION 5. CANNOT BE GIVEN LEGAL EFFECT UNDER APPLICABLE LOCAL LAW, REVIEWING COURTS SHALL APPLY LOCAL LAW THAT MOST CLOSELY APPROXIMATES AN ABSOLUTE WAIVER OF ALL CIVIL OR CONTRACTUAL LIABILITY IN CONNECTION WITH THE CONTRIBUTION. + +### 7. Term + +7.1 This Agreement shall come into effect upon Your acceptance of the terms and conditions. + +7.3 In the event of a termination of this Agreement Sections 4, 5, 6, 7 and 8 shall survive such termination and shall remain in full force thereafter. For the avoidance of doubt, Free and Open Source Software (sub)licenses that have already been granted for Contributions at the date of the termination shall remain in full force after the termination of this Agreement. + +### 8 Miscellaneous + +8.1 This Agreement and all disputes, claims, actions, suits or other proceedings arising out of this agreement or relating in any way to it shall be governed by the laws of India excluding its private international law provisions. + +8.2 This Agreement sets out the entire agreement between You and Us for Your Contributions to Us and overrides all other agreements or understandings. + +8.3 In case of Your death, this agreement shall continue with Your heirs. In case of more than one heir, all heirs must exercise their rights through a commonly authorized person. + +8.4 If any provision of this Agreement is found void and unenforceable, such provision will be replaced to the extent possible with a provision that comes closest to the meaning of the original provision and that is enforceable. The terms and conditions set forth in this Agreement shall apply notwithstanding any failure of essential purpose of this Agreement or any limited remedy to the maximum extent possible under law. + +8.5 You agree to notify Us of any facts or circumstances of which you become aware that would make this Agreement inaccurate in any respect. From d1dec94cd18750239aa3a893dbe96161c37056db Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Tue, 22 Oct 2024 03:51:30 +0530 Subject: [PATCH 6/7] chore: added CODE_OF_CONDUCT --- CODE_OF_CONDUCT.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..e51da244 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at . All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see + From f2d08f2ae11fd6bd1c50fc0fea7955df4ec0ec03 Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Tue, 22 Oct 2024 03:52:10 +0530 Subject: [PATCH 7/7] fix: CI paths ignore --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 724a18f8..5976c27e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,17 +4,17 @@ on: push: paths-ignore: - "**/**.md" - - "/keywords.txt" - - "/library.json" - - "/library.properties" - - "/docs" + - "keywords.txt" + - "library.json" + - "library.properties" + - "docs/**" pull_request: paths-ignore: - "**/**.md" - - "/keywords.txt" - - "/library.json" - - "/library.properties" - - "/docs" + - "keywords.txt" + - "library.json" + - "library.properties" + - "docs/**" jobs: arduino: