Лампа плавного включения с датчиками движения

Этот коммит содержится в:
Softonik 2022-11-20 17:43:24 +03:00 коммит произвёл Nikolay Kopitonenko
коммит 40be50fa06
15 изменённых файлов: 621 добавлений и 0 удалений

2
.gitignore предоставленный Обычный файл
Просмотреть файл

@ -0,0 +1,2 @@
_config.priv.h
build

62
ble.cpp Обычный файл
Просмотреть файл

@ -0,0 +1,62 @@
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "config.h"
// https://www.instructables.com/ESP32-Bluetooth-Low-Energy/
void setup_BLE();
BLEServer *server;
bool deviceConnected = false;
#define SERVICE_UUID "ab0828b1-198e-4351-b779-901fa0e0371e"
#define CHARACTERISTIC_UUID_RX "4ac8a682-9736-4e5d-932b-e9b31405049c"
#define CHARACTERISTIC_UUID_TX "0972EF8C-7613-4075-AD52-756F33D4DA91"
class CharacteristicCallbacks : public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *characteristic) {
std::string rxValue = characteristic->getValue();
if (rxValue.length() <= 0) {
return;
}
if (rxValue.find("wifi") != -1 || rxValue.find("w") != -1) {
triggerWifi();
} else {
action();
}
}
};
class ServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer *pServer) {
deviceConnected = true;
BLEDevice::startAdvertising();
};
void onDisconnect(BLEServer *pServer) {
deviceConnected = false;
BLEDevice::startAdvertising();
}
};
void setup_BLE() {
BLEDevice::init(BLE_NAME);
server = BLEDevice::createServer();
server->setCallbacks(new ServerCallbacks());
BLEService *service = server->createService(SERVICE_UUID);
BLECharacteristic *characteristicTX = service->createCharacteristic(
CHARACTERISTIC_UUID_TX,
BLECharacteristic::PROPERTY_NOTIFY);
characteristicTX->addDescriptor(new BLE2902());
BLECharacteristic *characteristic = service->createCharacteristic(
CHARACTERISTIC_UUID_RX,
BLECharacteristic::PROPERTY_WRITE);
characteristic->setCallbacks(new CharacteristicCallbacks());
service->start();
BLEDevice::startAdvertising();
}

20
config.h Обычный файл
Просмотреть файл

@ -0,0 +1,20 @@
#include "_config.priv.h"
#define UPDATES_ENABLED 1
#define DEBUG 0
// Prod
#define DVIZH_VERH_PIN 4
#define DVIZH_NIZ_PIN 16
#define DVIZH_TRIGGER RISING
// TTGO for test
// #define DVIZH_VERH_PIN 35
// #define DVIZH_NIZ_PIN 0
// #define DVIZH_TRIGGER FALLING
#define SVET_ONOFF_PIN 18
#define SVET_YARK_PIN 19
void triggerWifi();
void action();

50
dvizh.cpp Обычный файл
Просмотреть файл

@ -0,0 +1,50 @@
#include <Arduino.h>
#include "config.h"
#include "main.go.h"
static TaskHandle_t taskInterruptsReceiverHandle = NULL;
void IRAM_ATTR dvizhHandler() {
BaseType_t xHigherPriorityTaskWoken;
/* xHigherPriorityTaskWoken must be initialised to pdFALSE.
If calling vTaskNotifyGiveFromISR() unblocks the handling
task, and the priority of the handling task is higher than
the priority of the currently running task, then
xHigherPriorityTaskWoken will be automatically set to pdTRUE. */
xHigherPriorityTaskWoken = pdFALSE;
/* Unblock the handling task so the task can perform
any processing necessitated by the interrupt. xHandlingTask
is the task's handle, which was obtained when the task was
created. vTaskNotifyGiveFromISR() also increments
the receiving task's notification value. */
vTaskNotifyGiveFromISR(taskInterruptsReceiverHandle, &xHigherPriorityTaskWoken);
/* Force a context switch if xHigherPriorityTaskWoken is now
set to pdTRUE. The macro used to do this is dependent on
the port and may be called portEND_SWITCHING_ISR. */
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
void TaskInterruptsReceiver(void*) {
TaskSveta();
}
void setup_dvizh() {
pinMode(DVIZH_VERH_PIN, INPUT);
pinMode(DVIZH_NIZ_PIN, INPUT);
pinMode(SVET_ONOFF_PIN, OUTPUT);
pinMode(SVET_YARK_PIN, OUTPUT);
initSvet();
xTaskCreate(TaskInterruptsReceiver, "taskInterruptsReceiver", 4096, NULL, ESP_TASKD_EVENT_PRIO - 1, &taskInterruptsReceiverHandle);
attachInterrupt(DVIZH_VERH_PIN, dvizhHandler, DVIZH_TRIGGER);
attachInterrupt(DVIZH_NIZ_PIN, dvizhHandler, DVIZH_TRIGGER);
}
void action() {
if (DEBUG)
Serial.println("Action!");
}

28
go.mod Обычный файл
Просмотреть файл

@ -0,0 +1,28 @@
module my/app
go 1.19
require (
github.com/cucumber/godog v0.12.5
github.com/magefile/mage v1.11.0
github.com/onsi/gomega v1.19.0
my/go-controller v0.0.0
)
require (
github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect
github.com/cucumber/messages-go/v16 v16.0.1 // indirect
github.com/gofrs/uuid v4.2.0+incompatible // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-memdb v1.3.2 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
golang.org/x/text v0.3.7 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
replace github.com/cucumber/godog => /gopath/src/my/godog
replace my/go-controller => /gopath/src/my/go-controller

71
go.sum Обычный файл
Просмотреть файл

@ -0,0 +1,71 @@
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE=
github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw=
github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY=
github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-memdb v1.3.2 h1:RBKHOsnSszpU6vxq80LzC2BaQjuuvoyaQbkLTf7V7g8=
github.com/hashicorp/go-memdb v1.3.2/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE=
github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/magefile/mage v1.11.0 h1:C/55Ywp9BpgVVclD3lRnSYCwXTYxmSppIgLeDYlNuls=
github.com/magefile/mage v1.11.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

31
lestnica_dvizh.ino Обычный файл
Просмотреть файл

@ -0,0 +1,31 @@
// Partition Scheme: Minimal SPIFFS
#include "config.h"
void setup_dvizh();
void setup_BLE();
void handleWifi();
extern bool wifiEnabled;
SET_LOOP_TASK_STACK_SIZE(16 * 1024);
void setup() {
setup_dvizh();
if (DEBUG)
Serial.begin(115200);
#if UPDATES_ENABLED
setup_BLE();
#endif
}
void loop() {
#if UPDATES_ENABLED
handleWifi();
#endif
if (!wifiEnabled) {
delay(60000);
} else {
delay(1000);
}
}

34
main.go.h Обычный файл
Просмотреть файл

@ -0,0 +1,34 @@
void initSvet();
void DvizhEst(int start);
void DvizhaNet();
void PlavnoVklyuchit(int start);
void PlavnoVyklyuchit();
void Vklyuchit();
void Vyklyuchit();
void TaskSveta();
const unsigned long VREMYA_SVETA = 20000; TickType_t loopBlockTime = pdMS_TO_TICKS(1000); TickType_t vklYarkBlockTime = pdMS_TO_TICKS(10); TickType_t vyklYarkBlockTime = pdMS_TO_TICKS(50); bool vkl; unsigned long kogdaVyklyuchit; void initSvet() {
vkl=false; kogdaVyklyuchit=0; Vyklyuchit();
}
void DvizhEst(int start) {
kogdaVyklyuchit=millis()+VREMYA_SVETA; if (!vkl) { vkl=true; if (DEBUG) { Serial.println("Vkl svet"); } PlavnoVklyuchit(start); }
}
void DvizhaNet() {
if (kogdaVyklyuchit>millis()) { return; } if (vkl) { vkl=false; if (DEBUG) { Serial.println("Vykl"); } PlavnoVyklyuchit(); }
}
void PlavnoVklyuchit(int start) {
digitalWrite(SVET_ONOFF_PIN,1); int i; for(i=start; i>=0; i--) {analogWrite(SVET_YARK_PIN,i); if (DEBUG) { Serial.println(i); } delay(5);} Vklyuchit();
}
void PlavnoVyklyuchit() {
int v; int i; for(i=0; i<=255; i++) {analogWrite(SVET_YARK_PIN,i); if (DEBUG) { Serial.println(i); } v=ulTaskNotifyTake(0,vyklYarkBlockTime); if (v>0) { DvizhEst(i); return; }} Vyklyuchit();
}
void Vklyuchit() {
digitalWrite(SVET_YARK_PIN,0); digitalWrite(SVET_ONOFF_PIN,1);
}
void Vyklyuchit() {
digitalWrite(SVET_YARK_PIN,1); digitalWrite(SVET_ONOFF_PIN,0);
}
void TaskSveta() {
int v; while(1) {v=ulTaskNotifyTake(0,loopBlockTime); if (v>0) { DvizhEst(255); } else { DvizhaNet(); }}
}

3
pkg/app/features/app.feature Обычный файл
Просмотреть файл

@ -0,0 +1,3 @@
# language: ru
Функциональность: Лампа с датчиком движения

50
pkg/app/init_test.go Обычный файл
Просмотреть файл

@ -0,0 +1,50 @@
package app
import (
"context"
"os"
"testing"
. "my/app/pkg/testlib"
"github.com/cucumber/godog"
"github.com/cucumber/godog/colors"
. "github.com/onsi/gomega"
)
func InitializeScenario(ctx *godog.ScenarioContext) {
// -----------------------
ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) {
beforeScenario()
return ctx, nil
})
ctx.After(func(ctx context.Context, sc *godog.Scenario, err error) (context.Context, error) {
afterScenario()
return ctx, nil
})
InitializeGomegaForGodog(ctx)
_ = Ω
}
func InitializeSuite(tsc *godog.TestSuiteContext) {
tsc.BeforeSuite(beforeSuite)
tsc.AfterSuite(afterSuite)
}
func TestMain(m *testing.M) {
var opts = godog.Options{
Output: colors.Colored(os.Stdout),
Strict: true,
StopOnFailure: true,
}
godog.BindCommandLineFlags("godog.", &opts)
status := godog.TestSuite{
Name: "app",
TestSuiteInitializer: InitializeSuite,
ScenarioInitializer: InitializeScenario,
Options: &opts,
}.Run()
}

113
pkg/app/main.go Обычный файл
Просмотреть файл

@ -0,0 +1,113 @@
package app
import (
"my/go-controller/analog"
"my/go-controller/digital"
"my/go-controller/serial"
"my/go-controller/task"
"my/go-controller/timer"
)
const VREMYA_SVETA uint32 = 20000
var loopBlockTime task.TickType = task.MS_TO_TICKS(1000)
var vklYarkBlockTime task.TickType = task.MS_TO_TICKS(10)
var vyklYarkBlockTime task.TickType = task.MS_TO_TICKS(50)
var vkl bool
var kogdaVyklyuchit uint32
func initSvet() {
vkl = false
kogdaVyklyuchit = 0
Vyklyuchit()
}
func DvizhEst(start int) {
kogdaVyklyuchit = timer.Millis() + VREMYA_SVETA
if !vkl {
vkl = true
if DEBUG {
serial.Println("Vkl svet")
}
PlavnoVklyuchit(start)
}
}
func DvizhaNet() {
if kogdaVyklyuchit > timer.Millis() {
return
}
if vkl {
vkl = false
if DEBUG {
serial.Println("Vykl")
}
PlavnoVyklyuchit()
}
}
func PlavnoVklyuchit(start int) {
digital.Write(SVET_ONOFF_PIN, 1)
var i int
for i = start; i >= 0; i-- {
analog.Write(SVET_YARK_PIN, i)
if DEBUG {
serial.Println(i)
}
timer.Delay(5)
}
Vklyuchit()
}
func PlavnoVyklyuchit() {
var v int
var i int
for i = 0; i <= 255; i++ {
analog.Write(SVET_YARK_PIN, i)
if DEBUG {
serial.Println(i)
}
v = task.TaskNotifyTake(0, vyklYarkBlockTime)
if v > 0 {
DvizhEst(i)
return
}
}
Vyklyuchit()
}
func Vklyuchit() {
digital.Write(SVET_YARK_PIN, 0) // логика яркости инвертирована
digital.Write(SVET_ONOFF_PIN, 1)
}
func Vyklyuchit() {
digital.Write(SVET_YARK_PIN, 1) // логика яркости инвертирована
digital.Write(SVET_ONOFF_PIN, 0)
}
func TaskSveta() {
var v int
for {
/* Block to wait for a notification. Here the RTOS
task notification is being used as a counting semaphore.
The task's notification value is incremented each time
the ISR calls vTaskNotifyGiveFromISR(), and decremented
each time the RTOS task calls ulTaskNotifyTake() - so in
effect holds a count of the number of outstanding interrupts.
The first parameter is set to pdFALSE, so the notification
value is only decremented and not cleared to zero, and one
deferred interrupt event is processed at a time. */
v = task.TaskNotifyTake(0, loopBlockTime)
if v > 0 {
DvizhEst(255)
} else {
DvizhaNet()
}
}
}

25
pkg/app/main_test.go Обычный файл
Просмотреть файл

@ -0,0 +1,25 @@
package app
type testData struct {
}
var (
t *testData
)
func resetTestData() {
t = &testData{}
}
func beforeSuite() {
}
func afterSuite() {
}
func beforeScenario() {
resetTestData()
}
func afterScenario() {
}
// -----------------------

6
pkg/app/variables.go Обычный файл
Просмотреть файл

@ -0,0 +1,6 @@
package app
const DEBUG = false
const SVET_ONOFF_PIN = 0
const SVET_YARK_PIN = 0

48
pkg/testlib/testlib.go Обычный файл
Просмотреть файл

@ -0,0 +1,48 @@
package testlib
import (
"context"
"fmt"
"time"
"github.com/cucumber/godog"
. "github.com/onsi/gomega"
)
var Be = Equal
func NoErr(err error) {
ExpectWithOffset(1, err).NotTo(HaveOccurred())
}
var Ok = NoErr
func Yes(b bool) {
ExpectWithOffset(1, b).To(BeTrue())
}
func YesText(b bool, text string) {
ExpectWithOffset(1, b).To(BeTrue(), text)
}
var TestResult error
func InitializeGomegaForGodog(ctx *godog.ScenarioContext) {
ctx.StepContext().Before(func(ctx context.Context, st *godog.Step) (context.Context, error) {
TestResult = nil
return ctx, nil
})
ctx.StepContext().After(func(ctx context.Context, st *godog.Step, status godog.StepResultStatus, err error) (context.Context, error) {
return ctx, TestResult
})
RegisterFailHandler(func(message string, callerSkip ...int) {
// remember only the expectation failed first
// anything thereafter is not to be believed
if TestResult == nil {
TestResult = fmt.Errorf(message)
}
})
}
func Sleep(m time.Duration) {
time.Sleep(m * time.Millisecond)
}

78
wifi.cpp Обычный файл
Просмотреть файл

@ -0,0 +1,78 @@
#include <ArduinoOTA.h>
#include "config.h"
NET_IP
NET_GATEWAY
NET_SUBNET
bool wifiEnabled = false;
void startWifi() {
wifiEnabled = true;
if (!WiFi.config(local_IP, gateway, subnet)) {
// err
return;
}
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
// while (WiFi.waitForConnectResult() != WL_CONNECTED) {
// DEBUG_PRINTLN("Connection Failed! Rebooting...");
// delay(5000);
// ESP.restart();
// }
ArduinoOTA.setPasswordHash(PASSWORD_HASH);
ArduinoOTA
.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
// Serial.println("Start updating " + type);
})
.onEnd([]() {
// Serial.println("\nEnd");
})
.onProgress([](unsigned int progress, unsigned int total) {
// Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.onError([](ota_error_t error) {
// Serial.printf("Error[%u]: ", error);
// if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
// else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
// else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
// else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
// else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.begin();
// Serial.println("Wifi started");
}
void stopWifi() {
wifiEnabled = false;
WiFi.disconnect();
}
void triggerWifi() {
if (!wifiEnabled) {
startWifi();
} else {
stopWifi();
}
}
void handleWifi() {
if (!wifiEnabled) {
return;
}
ArduinoOTA.handle();
}