стабилизация кода
This commit is contained in:
5
Devices/main-module/.gitignore
vendored
Normal file
5
Devices/main-module/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
10
Devices/main-module/.vscode/extensions.json
vendored
Normal file
10
Devices/main-module/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
20
Devices/main-module/platformio.ini
Normal file
20
Devices/main-module/platformio.ini
Normal file
@@ -0,0 +1,20 @@
|
||||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:d1_mini]
|
||||
platform = espressif8266
|
||||
board = d1_mini
|
||||
build_flags = -Wl,-Teagle.flash.4m1m.ld
|
||||
framework = arduino
|
||||
board_build.filesystem = littlefs
|
||||
monitor_speed = 115200
|
||||
upload_speed = 256000
|
||||
;lib_deps = bblanchon/ArduinoJson@^6.19.4
|
||||
lib_deps = bblanchon/ArduinoJson@^7.0.3
|
||||
39
Devices/main-module/src/Config.h
Normal file
39
Devices/main-module/src/Config.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <ArduinoJson.h>
|
||||
#include "HalConfigBase.h"
|
||||
|
||||
class Config : public HalConfigBase
|
||||
{
|
||||
private:
|
||||
public:
|
||||
int cnt = 123;
|
||||
|
||||
inline String getFileName()
|
||||
{
|
||||
return F("/config.json");
|
||||
}
|
||||
|
||||
String convertToString()
|
||||
{
|
||||
String config = "";
|
||||
StaticJsonDocument<1024> doc;
|
||||
//JsonObject json = doc.createNestedObject();
|
||||
_toJson(doc);
|
||||
doc["cnt"] = cnt;
|
||||
serializeJson(doc, config);
|
||||
return config;
|
||||
}
|
||||
|
||||
bool convertFromString(String json)
|
||||
{
|
||||
StaticJsonDocument<1024> doc;
|
||||
DeserializationError error = deserializeJson(doc, json);
|
||||
if (error)
|
||||
return false;
|
||||
cnt = doc[0]["cnt"];
|
||||
_fromJson(doc);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
1299
Devices/main-module/src/FastBot.h
Normal file
1299
Devices/main-module/src/FastBot.h
Normal file
File diff suppressed because it is too large
Load Diff
46
Devices/main-module/src/HalConfigBase.h
Normal file
46
Devices/main-module/src/HalConfigBase.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
class HalConfigBase
|
||||
{
|
||||
public:
|
||||
String version;
|
||||
String ssid;
|
||||
String pass;
|
||||
String ssidAP;
|
||||
String passAP;
|
||||
String updateUrl;
|
||||
String token;
|
||||
String chatId;
|
||||
|
||||
// void ToJson(JsonObject &json);
|
||||
// void FromJson(JsonObject &json);
|
||||
protected:
|
||||
void _toJson(JsonDocument &json)
|
||||
{
|
||||
json["version"] = version;
|
||||
json["ssid"] = ssid;
|
||||
json["pass"] = pass;
|
||||
json["ssidAP"] = ssidAP;
|
||||
json["passAP"] = passAP;
|
||||
json["updateUrl"] = updateUrl;
|
||||
json["token"] = token;
|
||||
json["chatId"] = chatId;
|
||||
}
|
||||
|
||||
void _fromJson(JsonDocument &json)
|
||||
{
|
||||
version = json[0]["version"].as<String>();
|
||||
ssid = json[0]["ssid"].as<String>();
|
||||
pass = json[0]["pass"].as<String>();
|
||||
ssidAP = json[0]["ssidAP"].as<String>();
|
||||
passAP = json[0]["passAP"].as<String>();
|
||||
updateUrl = json[0]["updateUrl"].as<String>();
|
||||
token = json[0]["token"].as<String>();
|
||||
chatId = json[0]["chatId"].as<String>();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
200
Devices/main-module/src/HalRelays.h
Normal file
200
Devices/main-module/src/HalRelays.h
Normal file
@@ -0,0 +1,200 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include "pca9554.h"
|
||||
#include "config.h"
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
#define i2c_address 0x20
|
||||
|
||||
#define CHANNELS 8
|
||||
#define SWITCH_DELAY 500
|
||||
|
||||
struct RelItem
|
||||
{
|
||||
unsigned long Code = 0;
|
||||
bool State = false;
|
||||
u8 Mode = 0;
|
||||
unsigned long Delay = 0;
|
||||
};
|
||||
|
||||
class HalRelays
|
||||
{
|
||||
private:
|
||||
PCA9554 io;
|
||||
|
||||
inline String _configFileName() { return F("/relay.json"); }
|
||||
|
||||
bool (*_saveFunction)(String, String){};
|
||||
String (*_loadFunction)(String){};
|
||||
|
||||
String _convertToString()
|
||||
{
|
||||
String config = "";
|
||||
StaticJsonDocument<512> doc;
|
||||
for (byte i = 0; i < CHANNELS; i++)
|
||||
{
|
||||
JsonObject jo = doc.createNestedObject();
|
||||
jo["Code"] = Channels[i].Code;
|
||||
jo["Mode"] = Channels[i].Mode;
|
||||
jo["State"] = Channels[i].State;
|
||||
}
|
||||
serializeJson(doc, config);
|
||||
return config;
|
||||
}
|
||||
|
||||
bool _convertFromString(String config_str)
|
||||
{
|
||||
// StaticJsonDocument<512> doc;
|
||||
JsonDocument doc;
|
||||
DeserializationError error = deserializeJson(doc, config_str);
|
||||
if (error)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (byte i = 0; i < CHANNELS; i++)
|
||||
{
|
||||
Channels[i].Code = doc[i]["Code"];
|
||||
Channels[i].Mode = doc[i]["Mode"];
|
||||
Channels[i].State = doc[i]["State"];
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void _switch(u8 number)
|
||||
{
|
||||
if (millis() - Channels[number].Delay > SWITCH_DELAY)
|
||||
{
|
||||
Serial.print("RELAY [" + (String)number + "] set ");
|
||||
// bool value = io.digitalRead(number);
|
||||
if (Channels[number].State == true)
|
||||
{
|
||||
off(number);
|
||||
Channels[number].State = false;
|
||||
Serial.println("OFF");
|
||||
}
|
||||
else
|
||||
{
|
||||
on(number);
|
||||
Channels[number].State = true;
|
||||
Serial.println("ON");
|
||||
}
|
||||
Channels[number].Delay = millis();
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
RelItem Channels[CHANNELS];
|
||||
|
||||
HalRelays(byte sda, byte scl, bool (*saveFunction)(String, String), String (*loadFunction)(String))
|
||||
{
|
||||
io = PCA9554(i2c_address, sda, scl);
|
||||
_saveFunction = saveFunction;
|
||||
_loadFunction = loadFunction;
|
||||
}
|
||||
|
||||
bool cmd(unsigned long code)
|
||||
{
|
||||
for (byte i = 0; i < CHANNELS; i++)
|
||||
{
|
||||
if (code == Channels[i].Code)
|
||||
{
|
||||
_switch(i);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Serial.println("Code [" + (String)code + "] not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
void switchState(u8 number)
|
||||
{
|
||||
_switch(number);
|
||||
}
|
||||
|
||||
void printChannels()
|
||||
{
|
||||
Serial.println("CHANNELS");
|
||||
for (byte i = 0; i < CHANNELS; i++)
|
||||
{
|
||||
Serial.println((String)i + " :: " + (String)Channels[i].Code);
|
||||
}
|
||||
}
|
||||
|
||||
String printChannelsToString()
|
||||
{
|
||||
String str = "CHANNELS";
|
||||
for (byte i = 0; i < CHANNELS; i++)
|
||||
{
|
||||
str += ((String)i + " :: " + (String)Channels[i].Code);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
void save()
|
||||
{
|
||||
String config_str = _convertToString();
|
||||
if (!_saveFunction(config_str, _configFileName()))
|
||||
{
|
||||
Serial.println(F("RELAYS SAVE :: ERROR"));
|
||||
return;
|
||||
}
|
||||
Serial.println(F("RELAYS SAVE :: OK"));
|
||||
printChannels();
|
||||
}
|
||||
|
||||
bool load()
|
||||
{
|
||||
String configStr = _loadFunction(_configFileName());
|
||||
Serial.println("DBG");
|
||||
Serial.println(configStr);
|
||||
Serial.println("DBG");
|
||||
if (!_convertFromString(configStr))
|
||||
{
|
||||
Serial.println(F("RELAYS LOAD :: ERROR"));
|
||||
return false;
|
||||
}
|
||||
Serial.println(F("RELAYS LOAD :: OK"));
|
||||
printChannels();
|
||||
return true;
|
||||
}
|
||||
|
||||
void init()
|
||||
{
|
||||
// io.portMode(ALLINPUT);
|
||||
// offAll();
|
||||
io.portMode(ALLOUTPUT);
|
||||
offAll();
|
||||
|
||||
if (!load())
|
||||
{
|
||||
Serial.println(F("Relay ERROR: config not load."));
|
||||
}
|
||||
}
|
||||
|
||||
void on(u8 number)
|
||||
{
|
||||
io.digitalWrite(number, HIGH);
|
||||
}
|
||||
|
||||
void onAll()
|
||||
{
|
||||
io.digitalWritePort(0xFF);
|
||||
// for (u8 i = 0; i < 8; i++)
|
||||
// io.digitalWrite(i, HIGH);
|
||||
}
|
||||
|
||||
void off(u8 number)
|
||||
{
|
||||
io.digitalWrite(number, LOW);
|
||||
}
|
||||
|
||||
void offAll()
|
||||
{
|
||||
io.digitalWritePort(0x0);
|
||||
// for (u8 i = 0; i < 8; i++)
|
||||
// io.digitalWrite(i, LOW);
|
||||
}
|
||||
};
|
||||
79
Devices/main-module/src/HalTimer.h
Normal file
79
Devices/main-module/src/HalTimer.h
Normal file
@@ -0,0 +1,79 @@
|
||||
#pragma once
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
class HalTimer
|
||||
{
|
||||
private:
|
||||
unsigned long _period;
|
||||
unsigned long _last_millis;
|
||||
bool _init_first;
|
||||
void (*_function)(){};
|
||||
bool _isRun = false;
|
||||
|
||||
public:
|
||||
HalTimer()
|
||||
{
|
||||
}
|
||||
|
||||
HalTimer(unsigned long period)
|
||||
{
|
||||
_period = period;
|
||||
}
|
||||
|
||||
HalTimer(unsigned long period, void (*function)())
|
||||
{
|
||||
_period = period;
|
||||
_function = function;
|
||||
_init_first = true;
|
||||
_last_millis = millis();
|
||||
}
|
||||
|
||||
HalTimer(unsigned long period, void (*function)(), bool autostart)
|
||||
{
|
||||
_period = period;
|
||||
_function = function;
|
||||
_init_first = true;
|
||||
_last_millis = millis();
|
||||
if (autostart)
|
||||
start();
|
||||
}
|
||||
|
||||
void start()
|
||||
{
|
||||
_isRun = true;
|
||||
}
|
||||
|
||||
void stop()
|
||||
{
|
||||
_isRun = false;
|
||||
}
|
||||
|
||||
void tick()
|
||||
{
|
||||
if (!_isRun)
|
||||
return;
|
||||
|
||||
if (millis() - _last_millis > _period)
|
||||
{
|
||||
if (_init_first)
|
||||
_last_millis = millis();
|
||||
_function();
|
||||
if (!_init_first)
|
||||
_last_millis = millis();
|
||||
}
|
||||
}
|
||||
|
||||
void begin(unsigned long period, void (*function)(), bool init_first)
|
||||
{
|
||||
_period = period;
|
||||
begin(function, init_first);
|
||||
}
|
||||
|
||||
void begin(void (*function)(), bool init_first)
|
||||
{
|
||||
_function = function;
|
||||
_init_first = init_first;
|
||||
_last_millis = millis();
|
||||
}
|
||||
};
|
||||
701
Devices/main-module/src/RCSwitch.cpp
Normal file
701
Devices/main-module/src/RCSwitch.cpp
Normal file
@@ -0,0 +1,701 @@
|
||||
/*
|
||||
RCSwitch - Arduino libary for remote control outlet switches
|
||||
Copyright (c) 2011 Suat Özgür. All right reserved.
|
||||
|
||||
Contributors:
|
||||
- Andre Koehler / info(at)tomate-online(dot)de
|
||||
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
|
||||
- Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=46
|
||||
- Dominik Fischer / dom_fischer(at)web(dot)de
|
||||
- Frank Oltmanns / <first name>.<last name>(at)gmail(dot)com
|
||||
- Andreas Steinel / A.<lastname>(at)gmail(dot)com
|
||||
- Max Horn / max(at)quendi(dot)de
|
||||
- Robert ter Vehn / <first name>.<last name>(at)gmail(dot)com
|
||||
- Johann Richard / <first name>.<last name>(at)gmail(dot)com
|
||||
- Vlad Gheorghe / <first name>.<last name>(at)gmail(dot)com https://github.com/vgheo
|
||||
|
||||
Project home: https://github.com/sui77/rc-switch/
|
||||
|
||||
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 "RCSwitch.h"
|
||||
|
||||
#ifdef RaspberryPi
|
||||
// PROGMEM and _P functions are for AVR based microprocessors,
|
||||
// so we must normalize these for the ARM processor:
|
||||
#define PROGMEM
|
||||
#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
|
||||
#endif
|
||||
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
// interrupt handler and related code must be in RAM on ESP8266,
|
||||
// according to issue #46.
|
||||
#define RECEIVE_ATTR ICACHE_RAM_ATTR
|
||||
#else
|
||||
#define RECEIVE_ATTR
|
||||
#endif
|
||||
|
||||
|
||||
/* Format for protocol definitions:
|
||||
* {pulselength, Sync bit, "0" bit, "1" bit}
|
||||
*
|
||||
* pulselength: pulse length in microseconds, e.g. 350
|
||||
* Sync bit: {1, 31} means 1 high pulse and 31 low pulses
|
||||
* (perceived as a 31*pulselength long pulse, total length of sync bit is
|
||||
* 32*pulselength microseconds), i.e:
|
||||
* _
|
||||
* | |_______________________________ (don't count the vertical bars)
|
||||
* "0" bit: waveform for a data bit of value "0", {1, 3} means 1 high pulse
|
||||
* and 3 low pulses, total length (1+3)*pulselength, i.e:
|
||||
* _
|
||||
* | |___
|
||||
* "1" bit: waveform for a data bit of value "1", e.g. {3,1}:
|
||||
* ___
|
||||
* | |_
|
||||
*
|
||||
* These are combined to form Tri-State bits when sending or receiving codes.
|
||||
*/
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
static const RCSwitch::Protocol proto[] = {
|
||||
#else
|
||||
static const RCSwitch::Protocol PROGMEM proto[] = {
|
||||
#endif
|
||||
{ 350, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }, // protocol 1
|
||||
{ 650, { 1, 10 }, { 1, 2 }, { 2, 1 }, false }, // protocol 2
|
||||
{ 100, { 30, 71 }, { 4, 11 }, { 9, 6 }, false }, // protocol 3
|
||||
{ 380, { 1, 6 }, { 1, 3 }, { 3, 1 }, false }, // protocol 4
|
||||
{ 500, { 6, 14 }, { 1, 2 }, { 2, 1 }, false }, // protocol 5
|
||||
{ 450, { 23, 1 }, { 1, 2 }, { 2, 1 }, true }, // protocol 6 (HT6P20B)
|
||||
{ 150, { 2, 62 }, { 1, 6 }, { 6, 1 }, false } // protocol 7 (HS2303-PT, i. e. used in AUKEY Remote)
|
||||
};
|
||||
|
||||
enum {
|
||||
numProto = sizeof(proto) / sizeof(proto[0])
|
||||
};
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
volatile unsigned long RCSwitch::nReceivedValue = 0;
|
||||
volatile unsigned int RCSwitch::nReceivedBitlength = 0;
|
||||
volatile unsigned int RCSwitch::nReceivedDelay = 0;
|
||||
volatile unsigned int RCSwitch::nReceivedProtocol = 0;
|
||||
int RCSwitch::nReceiveTolerance = 60;
|
||||
const unsigned int RCSwitch::nSeparationLimit = 4300;
|
||||
// separationLimit: minimum microseconds between received codes, closer codes are ignored.
|
||||
// according to discussion on issue #14 it might be more suitable to set the separation
|
||||
// limit to the same time as the 'low' part of the sync signal for the current protocol.
|
||||
unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES];
|
||||
#endif
|
||||
|
||||
RCSwitch::RCSwitch() {
|
||||
this->nTransmitterPin = -1;
|
||||
this->setRepeatTransmit(10);
|
||||
this->setProtocol(1);
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
this->nReceiverInterrupt = -1;
|
||||
this->setReceiveTolerance(60);
|
||||
RCSwitch::nReceivedValue = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the protocol to send.
|
||||
*/
|
||||
void RCSwitch::setProtocol(Protocol protocol) {
|
||||
this->protocol = protocol;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the protocol to send, from a list of predefined protocols
|
||||
*/
|
||||
void RCSwitch::setProtocol(int nProtocol) {
|
||||
if (nProtocol < 1 || nProtocol > numProto) {
|
||||
nProtocol = 1; // TODO: trigger an error, e.g. "bad protocol" ???
|
||||
}
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
this->protocol = proto[nProtocol-1];
|
||||
#else
|
||||
memcpy_P(&this->protocol, &proto[nProtocol-1], sizeof(Protocol));
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the protocol to send with pulse length in microseconds.
|
||||
*/
|
||||
void RCSwitch::setProtocol(int nProtocol, int nPulseLength) {
|
||||
setProtocol(nProtocol);
|
||||
this->setPulseLength(nPulseLength);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets pulse length in microseconds
|
||||
*/
|
||||
void RCSwitch::setPulseLength(int nPulseLength) {
|
||||
this->protocol.pulseLength = nPulseLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets Repeat Transmits
|
||||
*/
|
||||
void RCSwitch::setRepeatTransmit(int nRepeatTransmit) {
|
||||
this->nRepeatTransmit = nRepeatTransmit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Receiving Tolerance
|
||||
*/
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
void RCSwitch::setReceiveTolerance(int nPercent) {
|
||||
RCSwitch::nReceiveTolerance = nPercent;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Enable transmissions
|
||||
*
|
||||
* @param nTransmitterPin Arduino Pin to which the sender is connected to
|
||||
*/
|
||||
void RCSwitch::enableTransmit(int nTransmitterPin) {
|
||||
this->nTransmitterPin = nTransmitterPin;
|
||||
pinMode(this->nTransmitterPin, OUTPUT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable transmissions
|
||||
*/
|
||||
void RCSwitch::disableTransmit() {
|
||||
this->nTransmitterPin = -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch on (Type D REV)
|
||||
*
|
||||
* @param sGroup Code of the switch group (A,B,C,D)
|
||||
* @param nDevice Number of the switch itself (1..3)
|
||||
*/
|
||||
void RCSwitch::switchOn(char sGroup, int nDevice) {
|
||||
this->sendTriState( this->getCodeWordD(sGroup, nDevice, true) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch off (Type D REV)
|
||||
*
|
||||
* @param sGroup Code of the switch group (A,B,C,D)
|
||||
* @param nDevice Number of the switch itself (1..3)
|
||||
*/
|
||||
void RCSwitch::switchOff(char sGroup, int nDevice) {
|
||||
this->sendTriState( this->getCodeWordD(sGroup, nDevice, false) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch on (Type C Intertechno)
|
||||
*
|
||||
* @param sFamily Familycode (a..f)
|
||||
* @param nGroup Number of group (1..4)
|
||||
* @param nDevice Number of device (1..4)
|
||||
*/
|
||||
void RCSwitch::switchOn(char sFamily, int nGroup, int nDevice) {
|
||||
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, true) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch off (Type C Intertechno)
|
||||
*
|
||||
* @param sFamily Familycode (a..f)
|
||||
* @param nGroup Number of group (1..4)
|
||||
* @param nDevice Number of device (1..4)
|
||||
*/
|
||||
void RCSwitch::switchOff(char sFamily, int nGroup, int nDevice) {
|
||||
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, false) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch on (Type B with two rotary/sliding switches)
|
||||
*
|
||||
* @param nAddressCode Number of the switch group (1..4)
|
||||
* @param nChannelCode Number of the switch itself (1..4)
|
||||
*/
|
||||
void RCSwitch::switchOn(int nAddressCode, int nChannelCode) {
|
||||
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, true) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch off (Type B with two rotary/sliding switches)
|
||||
*
|
||||
* @param nAddressCode Number of the switch group (1..4)
|
||||
* @param nChannelCode Number of the switch itself (1..4)
|
||||
*/
|
||||
void RCSwitch::switchOff(int nAddressCode, int nChannelCode) {
|
||||
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, false) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Deprecated, use switchOn(const char* sGroup, const char* sDevice) instead!
|
||||
* Switch a remote switch on (Type A with 10 pole DIP switches)
|
||||
*
|
||||
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
* @param nChannelCode Number of the switch itself (1..5)
|
||||
*/
|
||||
void RCSwitch::switchOn(const char* sGroup, int nChannel) {
|
||||
const char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" };
|
||||
this->switchOn(sGroup, code[nChannel]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deprecated, use switchOff(const char* sGroup, const char* sDevice) instead!
|
||||
* Switch a remote switch off (Type A with 10 pole DIP switches)
|
||||
*
|
||||
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
* @param nChannelCode Number of the switch itself (1..5)
|
||||
*/
|
||||
void RCSwitch::switchOff(const char* sGroup, int nChannel) {
|
||||
const char* code[6] = { "00000", "10000", "01000", "00100", "00010", "00001" };
|
||||
this->switchOff(sGroup, code[nChannel]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch on (Type A with 10 pole DIP switches)
|
||||
*
|
||||
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
* @param sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
*/
|
||||
void RCSwitch::switchOn(const char* sGroup, const char* sDevice) {
|
||||
this->sendTriState( this->getCodeWordA(sGroup, sDevice, true) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch a remote switch off (Type A with 10 pole DIP switches)
|
||||
*
|
||||
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
* @param sDevice Code of the switch device (refers to DIP switches 6..10 (A..E) where "1" = on and "0" = off, if all DIP switches are on it's "11111")
|
||||
*/
|
||||
void RCSwitch::switchOff(const char* sGroup, const char* sDevice) {
|
||||
this->sendTriState( this->getCodeWordA(sGroup, sDevice, false) );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a char[13], representing the code word to be send.
|
||||
*
|
||||
*/
|
||||
char* RCSwitch::getCodeWordA(const char* sGroup, const char* sDevice, bool bStatus) {
|
||||
static char sReturn[13];
|
||||
int nReturnPos = 0;
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
sReturn[nReturnPos++] = (sGroup[i] == '0') ? 'F' : '0';
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
sReturn[nReturnPos++] = (sDevice[i] == '0') ? 'F' : '0';
|
||||
}
|
||||
|
||||
sReturn[nReturnPos++] = bStatus ? '0' : 'F';
|
||||
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
|
||||
|
||||
sReturn[nReturnPos] = '\0';
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encoding for type B switches with two rotary/sliding switches.
|
||||
*
|
||||
* The code word is a tristate word and with following bit pattern:
|
||||
*
|
||||
* +-----------------------------+-----------------------------+----------+------------+
|
||||
* | 4 bits address | 4 bits address | 3 bits | 1 bit |
|
||||
* | switch group | switch number | not used | on / off |
|
||||
* | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | FFF | on=F off=0 |
|
||||
* +-----------------------------+-----------------------------+----------+------------+
|
||||
*
|
||||
* @param nAddressCode Number of the switch group (1..4)
|
||||
* @param nChannelCode Number of the switch itself (1..4)
|
||||
* @param bStatus Whether to switch on (true) or off (false)
|
||||
*
|
||||
* @return char[13], representing a tristate code word of length 12
|
||||
*/
|
||||
char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, bool bStatus) {
|
||||
static char sReturn[13];
|
||||
int nReturnPos = 0;
|
||||
|
||||
if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = 1; i <= 4; i++) {
|
||||
sReturn[nReturnPos++] = (nAddressCode == i) ? '0' : 'F';
|
||||
}
|
||||
|
||||
for (int i = 1; i <= 4; i++) {
|
||||
sReturn[nReturnPos++] = (nChannelCode == i) ? '0' : 'F';
|
||||
}
|
||||
|
||||
sReturn[nReturnPos++] = 'F';
|
||||
sReturn[nReturnPos++] = 'F';
|
||||
sReturn[nReturnPos++] = 'F';
|
||||
|
||||
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
|
||||
|
||||
sReturn[nReturnPos] = '\0';
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Like getCodeWord (Type C = Intertechno)
|
||||
*/
|
||||
char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, bool bStatus) {
|
||||
static char sReturn[13];
|
||||
int nReturnPos = 0;
|
||||
|
||||
int nFamily = (int)sFamily - 'a';
|
||||
if ( nFamily < 0 || nFamily > 15 || nGroup < 1 || nGroup > 4 || nDevice < 1 || nDevice > 4) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// encode the family into four bits
|
||||
sReturn[nReturnPos++] = (nFamily & 1) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = (nFamily & 2) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = (nFamily & 4) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = (nFamily & 8) ? 'F' : '0';
|
||||
|
||||
// encode the device and group
|
||||
sReturn[nReturnPos++] = ((nDevice-1) & 1) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = ((nDevice-1) & 2) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = ((nGroup-1) & 1) ? 'F' : '0';
|
||||
sReturn[nReturnPos++] = ((nGroup-1) & 2) ? 'F' : '0';
|
||||
|
||||
// encode the status code
|
||||
sReturn[nReturnPos++] = '0';
|
||||
sReturn[nReturnPos++] = 'F';
|
||||
sReturn[nReturnPos++] = 'F';
|
||||
sReturn[nReturnPos++] = bStatus ? 'F' : '0';
|
||||
|
||||
sReturn[nReturnPos] = '\0';
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encoding for the REV Switch Type
|
||||
*
|
||||
* The code word is a tristate word and with following bit pattern:
|
||||
*
|
||||
* +-----------------------------+-------------------+----------+--------------+
|
||||
* | 4 bits address | 3 bits address | 3 bits | 2 bits |
|
||||
* | switch group | device number | not used | on / off |
|
||||
* | A=1FFF B=F1FF C=FF1F D=FFF1 | 1=0FF 2=F0F 3=FF0 | 000 | on=10 off=01 |
|
||||
* +-----------------------------+-------------------+----------+--------------+
|
||||
*
|
||||
* Source: http://www.the-intruder.net/funksteckdosen-von-rev-uber-arduino-ansteuern/
|
||||
*
|
||||
* @param sGroup Name of the switch group (A..D, resp. a..d)
|
||||
* @param nDevice Number of the switch itself (1..3)
|
||||
* @param bStatus Whether to switch on (true) or off (false)
|
||||
*
|
||||
* @return char[13], representing a tristate code word of length 12
|
||||
*/
|
||||
char* RCSwitch::getCodeWordD(char sGroup, int nDevice, bool bStatus) {
|
||||
static char sReturn[13];
|
||||
int nReturnPos = 0;
|
||||
|
||||
// sGroup must be one of the letters in "abcdABCD"
|
||||
int nGroup = (sGroup >= 'a') ? (int)sGroup - 'a' : (int)sGroup - 'A';
|
||||
if ( nGroup < 0 || nGroup > 3 || nDevice < 1 || nDevice > 3) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
sReturn[nReturnPos++] = (nGroup == i) ? '1' : 'F';
|
||||
}
|
||||
|
||||
for (int i = 1; i <= 3; i++) {
|
||||
sReturn[nReturnPos++] = (nDevice == i) ? '1' : 'F';
|
||||
}
|
||||
|
||||
sReturn[nReturnPos++] = '0';
|
||||
sReturn[nReturnPos++] = '0';
|
||||
sReturn[nReturnPos++] = '0';
|
||||
|
||||
sReturn[nReturnPos++] = bStatus ? '1' : '0';
|
||||
sReturn[nReturnPos++] = bStatus ? '0' : '1';
|
||||
|
||||
sReturn[nReturnPos] = '\0';
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sCodeWord a tristate code word consisting of the letter 0, 1, F
|
||||
*/
|
||||
void RCSwitch::sendTriState(const char* sCodeWord) {
|
||||
// turn the tristate code word into the corresponding bit pattern, then send it
|
||||
unsigned long code = 0;
|
||||
unsigned int length = 0;
|
||||
for (const char* p = sCodeWord; *p; p++) {
|
||||
code <<= 2L;
|
||||
switch (*p) {
|
||||
case '0':
|
||||
// bit pattern 00
|
||||
break;
|
||||
case 'F':
|
||||
// bit pattern 01
|
||||
code |= 1L;
|
||||
break;
|
||||
case '1':
|
||||
// bit pattern 11
|
||||
code |= 3L;
|
||||
break;
|
||||
}
|
||||
length += 2;
|
||||
}
|
||||
this->send(code, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sCodeWord a binary code word consisting of the letter 0, 1
|
||||
*/
|
||||
void RCSwitch::send(const char* sCodeWord) {
|
||||
// turn the tristate code word into the corresponding bit pattern, then send it
|
||||
unsigned long code = 0;
|
||||
unsigned int length = 0;
|
||||
for (const char* p = sCodeWord; *p; p++) {
|
||||
code <<= 1L;
|
||||
if (*p != '0')
|
||||
code |= 1L;
|
||||
length++;
|
||||
}
|
||||
this->send(code, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transmit the first 'length' bits of the integer 'code'. The
|
||||
* bits are sent from MSB to LSB, i.e., first the bit at position length-1,
|
||||
* then the bit at position length-2, and so on, till finally the bit at position 0.
|
||||
*/
|
||||
void RCSwitch::send(unsigned long code, unsigned int length) {
|
||||
if (this->nTransmitterPin == -1)
|
||||
return;
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
// make sure the receiver is disabled while we transmit
|
||||
int nReceiverInterrupt_backup = nReceiverInterrupt;
|
||||
if (nReceiverInterrupt_backup != -1) {
|
||||
this->disableReceive();
|
||||
}
|
||||
#endif
|
||||
|
||||
for (int nRepeat = 0; nRepeat < nRepeatTransmit; nRepeat++) {
|
||||
for (int i = length-1; i >= 0; i--) {
|
||||
if (code & (1L << i))
|
||||
this->transmit(protocol.one);
|
||||
else
|
||||
this->transmit(protocol.zero);
|
||||
}
|
||||
this->transmit(protocol.syncFactor);
|
||||
}
|
||||
|
||||
// Disable transmit after sending (i.e., for inverted protocols)
|
||||
digitalWrite(this->nTransmitterPin, LOW);
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
// enable receiver again if we just disabled it
|
||||
if (nReceiverInterrupt_backup != -1) {
|
||||
this->enableReceive(nReceiverInterrupt_backup);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Transmit a single high-low pulse.
|
||||
*/
|
||||
void RCSwitch::transmit(HighLow pulses) {
|
||||
uint8_t firstLogicLevel = (this->protocol.invertedSignal) ? LOW : HIGH;
|
||||
uint8_t secondLogicLevel = (this->protocol.invertedSignal) ? HIGH : LOW;
|
||||
|
||||
digitalWrite(this->nTransmitterPin, firstLogicLevel);
|
||||
delayMicroseconds( this->protocol.pulseLength * pulses.high);
|
||||
digitalWrite(this->nTransmitterPin, secondLogicLevel);
|
||||
delayMicroseconds( this->protocol.pulseLength * pulses.low);
|
||||
}
|
||||
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
/**
|
||||
* Enable receiving data
|
||||
*/
|
||||
void RCSwitch::enableReceive(int interrupt) {
|
||||
this->nReceiverInterrupt = interrupt;
|
||||
this->enableReceive();
|
||||
}
|
||||
|
||||
void RCSwitch::enableReceive() {
|
||||
if (this->nReceiverInterrupt != -1) {
|
||||
RCSwitch::nReceivedValue = 0;
|
||||
RCSwitch::nReceivedBitlength = 0;
|
||||
#if defined(RaspberryPi) // Raspberry Pi
|
||||
wiringPiISR(this->nReceiverInterrupt, INT_EDGE_BOTH, &handleInterrupt);
|
||||
#else // Arduino
|
||||
attachInterrupt(this->nReceiverInterrupt, handleInterrupt, CHANGE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable receiving data
|
||||
*/
|
||||
void RCSwitch::disableReceive() {
|
||||
#if not defined(RaspberryPi) // Arduino
|
||||
detachInterrupt(this->nReceiverInterrupt);
|
||||
#endif // For Raspberry Pi (wiringPi) you can't unregister the ISR
|
||||
this->nReceiverInterrupt = -1;
|
||||
}
|
||||
|
||||
bool RCSwitch::available() {
|
||||
return RCSwitch::nReceivedValue != 0;
|
||||
}
|
||||
|
||||
void RCSwitch::resetAvailable() {
|
||||
RCSwitch::nReceivedValue = 0;
|
||||
}
|
||||
|
||||
unsigned long RCSwitch::getReceivedValue() {
|
||||
return RCSwitch::nReceivedValue;
|
||||
}
|
||||
|
||||
unsigned int RCSwitch::getReceivedBitlength() {
|
||||
return RCSwitch::nReceivedBitlength;
|
||||
}
|
||||
|
||||
unsigned int RCSwitch::getReceivedDelay() {
|
||||
return RCSwitch::nReceivedDelay;
|
||||
}
|
||||
|
||||
unsigned int RCSwitch::getReceivedProtocol() {
|
||||
return RCSwitch::nReceivedProtocol;
|
||||
}
|
||||
|
||||
unsigned int* RCSwitch::getReceivedRawdata() {
|
||||
return RCSwitch::timings;
|
||||
}
|
||||
|
||||
/* helper function for the receiveProtocol method */
|
||||
static inline unsigned int diff(int A, int B) {
|
||||
return abs(A - B);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
bool RECEIVE_ATTR RCSwitch::receiveProtocol(const int p, unsigned int changeCount) {
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
const Protocol &pro = proto[p-1];
|
||||
#else
|
||||
Protocol pro;
|
||||
memcpy_P(&pro, &proto[p-1], sizeof(Protocol));
|
||||
#endif
|
||||
|
||||
unsigned long code = 0;
|
||||
//Assuming the longer pulse length is the pulse captured in timings[0]
|
||||
const unsigned int syncLengthInPulses = ((pro.syncFactor.low) > (pro.syncFactor.high)) ? (pro.syncFactor.low) : (pro.syncFactor.high);
|
||||
const unsigned int delay = RCSwitch::timings[0] / syncLengthInPulses;
|
||||
const unsigned int delayTolerance = delay * RCSwitch::nReceiveTolerance / 100;
|
||||
|
||||
/* For protocols that start low, the sync period looks like
|
||||
* _________
|
||||
* _____________| |XXXXXXXXXXXX|
|
||||
*
|
||||
* |--1st dur--|-2nd dur-|-Start data-|
|
||||
*
|
||||
* The 3rd saved duration starts the data.
|
||||
*
|
||||
* For protocols that start high, the sync period looks like
|
||||
*
|
||||
* ______________
|
||||
* | |____________|XXXXXXXXXXXXX|
|
||||
*
|
||||
* |-filtered out-|--1st dur--|--Start data--|
|
||||
*
|
||||
* The 2nd saved duration starts the data
|
||||
*/
|
||||
const unsigned int firstDataTiming = (pro.invertedSignal) ? (2) : (1);
|
||||
|
||||
for (unsigned int i = firstDataTiming; i < changeCount - 1; i += 2) {
|
||||
code <<= 1;
|
||||
if (diff(RCSwitch::timings[i], delay * pro.zero.high) < delayTolerance &&
|
||||
diff(RCSwitch::timings[i + 1], delay * pro.zero.low) < delayTolerance) {
|
||||
// zero
|
||||
} else if (diff(RCSwitch::timings[i], delay * pro.one.high) < delayTolerance &&
|
||||
diff(RCSwitch::timings[i + 1], delay * pro.one.low) < delayTolerance) {
|
||||
// one
|
||||
code |= 1;
|
||||
} else {
|
||||
// Failed
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (changeCount > 7) { // ignore very short transmissions: no device sends them, so this must be noise
|
||||
RCSwitch::nReceivedValue = code;
|
||||
RCSwitch::nReceivedBitlength = (changeCount - 1) / 2;
|
||||
RCSwitch::nReceivedDelay = delay;
|
||||
RCSwitch::nReceivedProtocol = p;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void RECEIVE_ATTR RCSwitch::handleInterrupt() {
|
||||
|
||||
static unsigned int changeCount = 0;
|
||||
static unsigned long lastTime = 0;
|
||||
static unsigned int repeatCount = 0;
|
||||
|
||||
const long time = micros();
|
||||
const unsigned int duration = time - lastTime;
|
||||
|
||||
if (duration > RCSwitch::nSeparationLimit) {
|
||||
// A long stretch without signal level change occurred. This could
|
||||
// be the gap between two transmission.
|
||||
if (diff(duration, RCSwitch::timings[0]) < 200) {
|
||||
// This long signal is close in length to the long signal which
|
||||
// started the previously recorded timings; this suggests that
|
||||
// it may indeed by a a gap between two transmissions (we assume
|
||||
// here that a sender will send the signal multiple times,
|
||||
// with roughly the same gap between them).
|
||||
repeatCount++;
|
||||
if (repeatCount == 2) {
|
||||
for(unsigned int i = 1; i <= numProto; i++) {
|
||||
if (receiveProtocol(i, changeCount)) {
|
||||
// receive succeeded for protocol i
|
||||
break;
|
||||
}
|
||||
}
|
||||
repeatCount = 0;
|
||||
}
|
||||
}
|
||||
changeCount = 0;
|
||||
}
|
||||
|
||||
// detect overflow
|
||||
if (changeCount >= RCSWITCH_MAX_CHANGES) {
|
||||
changeCount = 0;
|
||||
repeatCount = 0;
|
||||
}
|
||||
|
||||
RCSwitch::timings[changeCount++] = duration;
|
||||
lastTime = time;
|
||||
}
|
||||
#endif
|
||||
184
Devices/main-module/src/RCSwitch.h
Normal file
184
Devices/main-module/src/RCSwitch.h
Normal file
@@ -0,0 +1,184 @@
|
||||
/*
|
||||
RCSwitch - Arduino libary for remote control outlet switches
|
||||
Copyright (c) 2011 Suat Özgür. All right reserved.
|
||||
|
||||
Contributors:
|
||||
- Andre Koehler / info(at)tomate-online(dot)de
|
||||
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
|
||||
- Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=46
|
||||
- Dominik Fischer / dom_fischer(at)web(dot)de
|
||||
- Frank Oltmanns / <first name>.<last name>(at)gmail(dot)com
|
||||
- Max Horn / max(at)quendi(dot)de
|
||||
- Robert ter Vehn / <first name>.<last name>(at)gmail(dot)com
|
||||
|
||||
Project home: https://github.com/sui77/rc-switch/
|
||||
|
||||
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
|
||||
*/
|
||||
#ifndef _RCSwitch_h
|
||||
#define _RCSwitch_h
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include "Arduino.h"
|
||||
#elif defined(ENERGIA) // LaunchPad, FraunchPad and StellarPad specific
|
||||
#include "Energia.h"
|
||||
#elif defined(RPI) // Raspberry Pi
|
||||
#define RaspberryPi
|
||||
|
||||
// Include libraries for RPi:
|
||||
#include <string.h> /* memcpy */
|
||||
#include <stdlib.h> /* abs */
|
||||
#include <wiringPi.h>
|
||||
#elif defined(SPARK)
|
||||
#include "application.h"
|
||||
#else
|
||||
#include "WProgram.h"
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
// At least for the ATTiny X4/X5, receiving has to be disabled due to
|
||||
// missing libm depencies (udivmodhi4)
|
||||
#if defined( __AVR_ATtinyX5__ ) or defined ( __AVR_ATtinyX4__ )
|
||||
#define RCSwitchDisableReceiving
|
||||
#endif
|
||||
|
||||
// Number of maximum high/Low changes per packet.
|
||||
// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync
|
||||
#define RCSWITCH_MAX_CHANGES 67
|
||||
|
||||
class RCSwitch {
|
||||
|
||||
public:
|
||||
RCSwitch();
|
||||
|
||||
void switchOn(int nGroupNumber, int nSwitchNumber);
|
||||
void switchOff(int nGroupNumber, int nSwitchNumber);
|
||||
void switchOn(const char* sGroup, int nSwitchNumber);
|
||||
void switchOff(const char* sGroup, int nSwitchNumber);
|
||||
void switchOn(char sFamily, int nGroup, int nDevice);
|
||||
void switchOff(char sFamily, int nGroup, int nDevice);
|
||||
void switchOn(const char* sGroup, const char* sDevice);
|
||||
void switchOff(const char* sGroup, const char* sDevice);
|
||||
void switchOn(char sGroup, int nDevice);
|
||||
void switchOff(char sGroup, int nDevice);
|
||||
|
||||
void sendTriState(const char* sCodeWord);
|
||||
void send(unsigned long code, unsigned int length);
|
||||
void send(const char* sCodeWord);
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
void enableReceive(int interrupt);
|
||||
void enableReceive();
|
||||
void disableReceive();
|
||||
bool available();
|
||||
void resetAvailable();
|
||||
|
||||
unsigned long getReceivedValue();
|
||||
unsigned int getReceivedBitlength();
|
||||
unsigned int getReceivedDelay();
|
||||
unsigned int getReceivedProtocol();
|
||||
unsigned int* getReceivedRawdata();
|
||||
#endif
|
||||
|
||||
void enableTransmit(int nTransmitterPin);
|
||||
void disableTransmit();
|
||||
void setPulseLength(int nPulseLength);
|
||||
void setRepeatTransmit(int nRepeatTransmit);
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
void setReceiveTolerance(int nPercent);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Description of a single pule, which consists of a high signal
|
||||
* whose duration is "high" times the base pulse length, followed
|
||||
* by a low signal lasting "low" times the base pulse length.
|
||||
* Thus, the pulse overall lasts (high+low)*pulseLength
|
||||
*/
|
||||
struct HighLow {
|
||||
uint8_t high;
|
||||
uint8_t low;
|
||||
};
|
||||
|
||||
/**
|
||||
* A "protocol" describes how zero and one bits are encoded into high/low
|
||||
* pulses.
|
||||
*/
|
||||
struct Protocol {
|
||||
/** base pulse length in microseconds, e.g. 350 */
|
||||
uint16_t pulseLength;
|
||||
|
||||
HighLow syncFactor;
|
||||
HighLow zero;
|
||||
HighLow one;
|
||||
|
||||
/**
|
||||
* If true, interchange high and low logic levels in all transmissions.
|
||||
*
|
||||
* By default, RCSwitch assumes that any signals it sends or receives
|
||||
* can be broken down into pulses which start with a high signal level,
|
||||
* followed by a a low signal level. This is e.g. the case for the
|
||||
* popular PT 2260 encoder chip, and thus many switches out there.
|
||||
*
|
||||
* But some devices do it the other way around, and start with a low
|
||||
* signal level, followed by a high signal level, e.g. the HT6P20B. To
|
||||
* accommodate this, one can set invertedSignal to true, which causes
|
||||
* RCSwitch to change how it interprets any HighLow struct FOO: It will
|
||||
* then assume transmissions start with a low signal lasting
|
||||
* FOO.high*pulseLength microseconds, followed by a high signal lasting
|
||||
* FOO.low*pulseLength microseconds.
|
||||
*/
|
||||
bool invertedSignal;
|
||||
};
|
||||
|
||||
void setProtocol(Protocol protocol);
|
||||
void setProtocol(int nProtocol);
|
||||
void setProtocol(int nProtocol, int nPulseLength);
|
||||
|
||||
private:
|
||||
char* getCodeWordA(const char* sGroup, const char* sDevice, bool bStatus);
|
||||
char* getCodeWordB(int nGroupNumber, int nSwitchNumber, bool bStatus);
|
||||
char* getCodeWordC(char sFamily, int nGroup, int nDevice, bool bStatus);
|
||||
char* getCodeWordD(char group, int nDevice, bool bStatus);
|
||||
void transmit(HighLow pulses);
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
static void handleInterrupt();
|
||||
static bool receiveProtocol(const int p, unsigned int changeCount);
|
||||
int nReceiverInterrupt;
|
||||
#endif
|
||||
int nTransmitterPin;
|
||||
int nRepeatTransmit;
|
||||
|
||||
Protocol protocol;
|
||||
|
||||
#if not defined( RCSwitchDisableReceiving )
|
||||
static int nReceiveTolerance;
|
||||
volatile static unsigned long nReceivedValue;
|
||||
volatile static unsigned int nReceivedBitlength;
|
||||
volatile static unsigned int nReceivedDelay;
|
||||
volatile static unsigned int nReceivedProtocol;
|
||||
const static unsigned int nSeparationLimit;
|
||||
/*
|
||||
* timings[0] contains sync timing, followed by a number of bits
|
||||
*/
|
||||
static unsigned int timings[RCSWITCH_MAX_CHANGES];
|
||||
#endif
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
150
Devices/main-module/src/datatypes.h
Normal file
150
Devices/main-module/src/datatypes.h
Normal file
@@ -0,0 +1,150 @@
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
|
||||
enum FB_FileType {
|
||||
FB_PHOTO,
|
||||
FB_AUDIO,
|
||||
FB_DOC,
|
||||
FB_VIDEO,
|
||||
FB_GIF,
|
||||
FB_VOICE,
|
||||
};
|
||||
|
||||
struct FB_msg {
|
||||
String& userID; // ID юзера
|
||||
String& username; // ник (в API это first_name)
|
||||
String& chatID; // ID чата
|
||||
int32_t messageID; // ID сообщения
|
||||
String& text; // текст
|
||||
String& data; // callback дата
|
||||
bool query; // запрос
|
||||
bool& edited; // сообщение отредактировано
|
||||
bool isBot; // сообщение от бота
|
||||
bool OTA; // запрос на OTA обновление
|
||||
uint32_t unix; // время сообщения
|
||||
String& fileName; // имя файла
|
||||
String& replyText; // текст ответа, если он есть
|
||||
bool isFile; // это файл
|
||||
String& fileUrl; // адрес файла для загрузки
|
||||
|
||||
// legacy
|
||||
String& usrID; // ID юзера
|
||||
String& first_name; // имя
|
||||
String& last_name; // фамилия
|
||||
int32_t ID; // ID сообщения
|
||||
|
||||
// вся информация одной строкой
|
||||
String toString() {
|
||||
String s;
|
||||
s.reserve(200);
|
||||
s += F("userID: ");
|
||||
s += userID;
|
||||
s += F(", username: ");
|
||||
s += username;
|
||||
s += F(", isBot: ");
|
||||
s += isBot;
|
||||
s += '\n';
|
||||
|
||||
s += F("chatID: ");
|
||||
s += chatID;
|
||||
s += F(", messageID: ");
|
||||
s += messageID;
|
||||
s += F(", edited: ");
|
||||
s += edited;
|
||||
s += '\n';
|
||||
|
||||
s += F("text: ");
|
||||
s += text;
|
||||
s += F(", replyText: ");
|
||||
s += replyText;
|
||||
s += '\n';
|
||||
|
||||
s += F("query: ");
|
||||
s += query;
|
||||
s += F(", data: ");
|
||||
s += data;
|
||||
s += '\n';
|
||||
|
||||
s += F("isFile: ");
|
||||
s += isFile;
|
||||
s += F(", fileName: ");
|
||||
s += fileName;
|
||||
s += F(", OTA: ");
|
||||
s += OTA;
|
||||
s += '\n';
|
||||
|
||||
s += F("fileUrl: ");
|
||||
s += fileUrl;
|
||||
s += '\n';
|
||||
|
||||
s += F("unix: ");
|
||||
s += unix;
|
||||
s += '\n';
|
||||
return s;
|
||||
}
|
||||
};
|
||||
|
||||
struct FB_Time {
|
||||
FB_Time(uint32_t unix = 0, int16_t gmt = 0) {
|
||||
if (!unix) return;
|
||||
if (abs(gmt) <= 12) gmt *= 60;
|
||||
unix += gmt * 60L;
|
||||
second = unix % 60ul;
|
||||
unix /= 60ul;
|
||||
minute = unix % 60ul;
|
||||
unix /= 60ul;
|
||||
hour = unix % 24ul;
|
||||
unix /= 24ul;
|
||||
dayWeek = (unix + 4) % 7;
|
||||
if (!dayWeek) dayWeek = 7;
|
||||
unix += 719468;
|
||||
uint8_t era = unix / 146097ul;
|
||||
uint16_t doe = unix - era * 146097ul;
|
||||
uint16_t yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
|
||||
year = yoe + era * 400;
|
||||
uint16_t doy = doe - (yoe * 365 + yoe / 4 - yoe / 100);
|
||||
uint16_t mp = (doy * 5 + 2) / 153;
|
||||
day = doy - (mp * 153 + 2) / 5 + 1;
|
||||
month = mp + (mp < 10 ? 3 : -9);
|
||||
year += (month <= 2);
|
||||
}
|
||||
|
||||
uint8_t second = 0;
|
||||
uint8_t minute = 0;
|
||||
uint8_t hour = 0;
|
||||
uint8_t day = 0;
|
||||
uint8_t month = 0;
|
||||
uint8_t dayWeek = 0;
|
||||
uint16_t year = 0;
|
||||
|
||||
// получить строку времени формата ЧЧ:ММ:СС
|
||||
String timeString() {
|
||||
String str;
|
||||
if (!year) return str = F("Not sync");
|
||||
str.reserve(8);
|
||||
if (hour < 10) str += '0';
|
||||
str += hour;
|
||||
str += ':';
|
||||
if (minute < 10) str += '0';
|
||||
str += minute;
|
||||
str += ':';
|
||||
if (second < 10) str += '0';
|
||||
str += second;
|
||||
return str;
|
||||
}
|
||||
|
||||
// получить строку даты формата ДД.ММ.ГГГГ
|
||||
String dateString() {
|
||||
String str;
|
||||
if (!year) return str = F("Not sync");
|
||||
str.reserve(10);
|
||||
if (day < 10) str += '0';
|
||||
str += day;
|
||||
str += '.';
|
||||
if (month < 10) str += '0';
|
||||
str += month;
|
||||
str += '.';
|
||||
str += year;
|
||||
return str;
|
||||
}
|
||||
};
|
||||
551
Devices/main-module/src/main.cpp
Normal file
551
Devices/main-module/src/main.cpp
Normal file
@@ -0,0 +1,551 @@
|
||||
#include <Arduino.h>
|
||||
#include <LittleFS.h>
|
||||
#include <ArduinoJson.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
#include <WiFiUdp.h>
|
||||
#include <ESP8266HTTPClient.h>
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "RCSwitch.h"
|
||||
#include "pca9554.h"
|
||||
|
||||
#include "HalRelays.h"
|
||||
#include "HalTimer.h"
|
||||
#include "config.h"
|
||||
|
||||
#include "FastBot.h"
|
||||
|
||||
// Set i2c address
|
||||
#define sda 12
|
||||
#define scl 14
|
||||
/*
|
||||
Received 6277048 / 24bit Protocol: 1
|
||||
Received 6277044 / 24bit Protocol: 1
|
||||
Received 6277042 / 24bit Protocol: 1
|
||||
Received 6277041 / 24bit Protocol: 1
|
||||
*/
|
||||
|
||||
RCSwitch mySwitch = RCSwitch();
|
||||
|
||||
int rfPin = D1;
|
||||
|
||||
// PCA9554 io(0x38, sda, scl);
|
||||
// PCA9554 io(0x20, sda, scl);
|
||||
// HalRelays _rel(sda, scl, _rel_save, _rel_load);
|
||||
HalRelays _rel(sda, scl, _fs_write, _fs_read);
|
||||
|
||||
Config _config;
|
||||
FastBot _bot;
|
||||
ESP8266WebServer _web(80);
|
||||
|
||||
unsigned long _radio_last_value;
|
||||
|
||||
void _timer1_handler()
|
||||
{
|
||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||
}
|
||||
|
||||
HalTimer timer1(1 * 1000, _timer1_handler, true);
|
||||
|
||||
void _timer2_handler()
|
||||
{
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
_bot.tick();
|
||||
}
|
||||
}
|
||||
|
||||
HalTimer timer2(3 * 1000, _timer2_handler, true);
|
||||
|
||||
void sendHello()
|
||||
{
|
||||
String hi = F("Power On ") + (String)_config.version;
|
||||
uint8 status = _bot.sendMessage(hi, _config.chatId);
|
||||
Serial.println("Power On [" + (String)status + "]");
|
||||
}
|
||||
|
||||
void bot_handler(FB_msg &msg)
|
||||
{
|
||||
Serial.print(msg.chatID); // ID чата
|
||||
Serial.print(", ");
|
||||
Serial.print(msg.username); // логин
|
||||
Serial.print(", ");
|
||||
Serial.println(msg.text); // текст
|
||||
|
||||
if (msg.OTA && msg.text == "-update")
|
||||
{
|
||||
String upd = F("update...");
|
||||
Serial.println(upd);
|
||||
_bot.update();
|
||||
Serial.println(upd + "OK");
|
||||
}
|
||||
|
||||
if (msg.text == "-this")
|
||||
{
|
||||
_config.chatId = msg.chatID;
|
||||
_config_save();
|
||||
_bot.sendMessage(F("Set this OK"), msg.chatID);
|
||||
}
|
||||
|
||||
if (msg.text == "-reset")
|
||||
{
|
||||
// ESP.reset();
|
||||
}
|
||||
|
||||
if (msg.text == "/set")
|
||||
{
|
||||
String hi = F("Настройки [") + (String)_config.version + "]\r\n";
|
||||
_bot.sendMessage(hi, _config.chatId);
|
||||
_bot.sendMessage(_rel.printChannelsToString(), _config.chatId);
|
||||
}
|
||||
|
||||
if (msg.text == "/radio")
|
||||
{
|
||||
Serial.print(F("Radio Last: "));
|
||||
Serial.println((String)_radio_last_value);
|
||||
_bot.sendMessage(((String)_radio_last_value), msg.chatID);
|
||||
_rel.printChannels();
|
||||
Serial.print(F("load"));
|
||||
_rel.load();
|
||||
_rel.printChannels();
|
||||
}
|
||||
|
||||
if (msg.text.startsWith(F("/r-")))
|
||||
{
|
||||
int number = (msg.text.substring(msg.text.indexOf("-") + 1, msg.text.length())).toInt();
|
||||
if (0 <= number && number <= 7)
|
||||
{
|
||||
_rel.switchState(number);
|
||||
}
|
||||
}
|
||||
|
||||
if (msg.text.startsWith(F("/radio rel=")))
|
||||
{
|
||||
int number = (msg.text.substring(msg.text.indexOf("=") + 1, msg.text.length())).toInt();
|
||||
if (0 <= number && number <= 7)
|
||||
{
|
||||
_rel.Channels[number].Code = _radio_last_value;
|
||||
_rel.save();
|
||||
String str = F("Set radio [") + (String)_radio_last_value + F("] to channel: [") + (String)number + F("]");
|
||||
Serial.println(str);
|
||||
_bot.sendMessage(str, msg.chatID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
pinMode(rfPin, INPUT);
|
||||
|
||||
// delay(100);
|
||||
_fs_init();
|
||||
|
||||
_rel.init();
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.println(F("SYSTEM: HAL9000"));
|
||||
Serial.println(F("UNIT: HOMEON"));
|
||||
|
||||
if (!_config_load())
|
||||
{
|
||||
Serial.println(F("setup DEFAULT config"));
|
||||
_config.ssidAP = "HomeOn";
|
||||
_config.passAP = "012345678";
|
||||
_config.ssid = "paranetm";
|
||||
_config.pass = "78515169";
|
||||
_config.version = VERSION;
|
||||
_config.updateUrl = "http://iot.paranet.ru/cloudupdate/getup/?platform=HomeOn";
|
||||
_config.token = "314329238:AAHIQa9Jvae3bnfAQBiOoC6kJZ70jtkYLks";
|
||||
// 314329238:AAHIQa9Jvae3bnfAQBiOoC6kJZ70jtkYLks
|
||||
_config.chatId = "";
|
||||
|
||||
_config_save();
|
||||
}
|
||||
_config.version = VERSION;
|
||||
|
||||
// String _rel_conf = _rel_load();
|
||||
_rel.load();
|
||||
|
||||
_wifi_check();
|
||||
_web_init();
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
Serial.println(F("set token : ") + _config.token);
|
||||
_bot.setToken(_config.token);
|
||||
_bot.detach();
|
||||
_bot.attach(bot_handler);
|
||||
sendHello();
|
||||
}
|
||||
|
||||
mySwitch.enableReceive(rfPin);
|
||||
}
|
||||
|
||||
bool radio()
|
||||
{
|
||||
if (mySwitch.available())
|
||||
{
|
||||
_radio_last_value = mySwitch.getReceivedValue();
|
||||
Serial.print(F("Received: "));
|
||||
Serial.println(_radio_last_value);
|
||||
|
||||
mySwitch.resetAvailable();
|
||||
if (_rel.cmd(_radio_last_value))
|
||||
{
|
||||
String text = F("Переключение: ") + (String)_radio_last_value;
|
||||
_bot.sendMessage(text, _config.chatId);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
radio();
|
||||
timer1.tick();
|
||||
radio();
|
||||
timer2.tick();
|
||||
// if (WiFi.status() == WL_CONNECTED)
|
||||
// {
|
||||
// _bot.tick();
|
||||
// }
|
||||
radio();
|
||||
//_web.handleClient();
|
||||
}
|
||||
|
||||
void loop2()
|
||||
{
|
||||
delay(5000);
|
||||
|
||||
Serial.println(F("ping"));
|
||||
// io.digitalWrite(pin, LOW);
|
||||
_rel.offAll();
|
||||
delay(5000);
|
||||
// io.digitalWrite(pin, HIGH);
|
||||
_rel.onAll();
|
||||
|
||||
return;
|
||||
|
||||
if (mySwitch.available())
|
||||
{
|
||||
/*
|
||||
Received 6277044 / 24bit Protocol: 1
|
||||
Received 6277042 / 24bit Protocol: 1
|
||||
Received 6277041 / 24bit Protocol: 1
|
||||
Received 6277048 / 24bit Protocol: 1
|
||||
*/
|
||||
/**
|
||||
unsigned long code = mySwitch.getReceivedValue();
|
||||
int pin = -1;
|
||||
int le = sizeof(codes) / sizeof(unsigned long);
|
||||
Serial.println("RC: " + (String)code);
|
||||
for (byte i = 0; i < le; i++)
|
||||
{
|
||||
if (code == codes[i])
|
||||
{
|
||||
pin = i + 1;
|
||||
if (pin == 3)
|
||||
{
|
||||
Serial.println("set off-timer");
|
||||
off_timer = 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
**/
|
||||
|
||||
Serial.print("Received ");
|
||||
Serial.print(mySwitch.getReceivedValue());
|
||||
Serial.print(" / ");
|
||||
Serial.print(mySwitch.getReceivedBitlength());
|
||||
Serial.print("bit ");
|
||||
Serial.print("Protocol: ");
|
||||
Serial.println(mySwitch.getReceivedProtocol());
|
||||
|
||||
mySwitch.resetAvailable();
|
||||
}
|
||||
}
|
||||
|
||||
/** base rutine **/
|
||||
|
||||
void _wifi_init(void)
|
||||
{
|
||||
// Попытка подключения к точке доступа
|
||||
WiFi.setAutoConnect(false);
|
||||
WiFi.BSSID(0);
|
||||
WiFi.mode(WIFI_STA);
|
||||
byte tries = 17;
|
||||
|
||||
String _ssid = _config.ssid;
|
||||
String _pass = _config.pass;
|
||||
|
||||
Serial.print("MAC address: ");
|
||||
Serial.println(WiFi.macAddress());
|
||||
|
||||
Serial.println("SSID: " + _ssid);
|
||||
Serial.println("PASS: " + _pass);
|
||||
WiFi.begin(_ssid.c_str(), _pass.c_str());
|
||||
|
||||
// Делаем проверку подключения до тех пор пока счетчик tries не станет равен нулю или не получим подключение
|
||||
while (--tries && WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
Serial.print(".");
|
||||
delay(1000);
|
||||
}
|
||||
|
||||
if (WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
// Если не удалось подключиться запускаем в режиме AP
|
||||
Serial.println("");
|
||||
Serial.println("WiFi up AP");
|
||||
_wifi_apmode();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Иначе удалось подключиться отправляем сообщение о подключении и выводим адрес IP
|
||||
Serial.println("");
|
||||
Serial.println("WiFi connected");
|
||||
Serial.print("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
WiFi.setAutoReconnect(true);
|
||||
_isApMode = false;
|
||||
}
|
||||
|
||||
//_config.ip = WiFi.localIP().toString();
|
||||
}
|
||||
|
||||
bool _wifi_apmode()
|
||||
{
|
||||
String _ssidAP = _config.ssidAP;
|
||||
String _passAP = _config.passAP;
|
||||
|
||||
Serial.println("AP SSID: " + _ssidAP);
|
||||
Serial.println("AP PASS: " + _passAP);
|
||||
|
||||
// Отключаем WIFI
|
||||
WiFi.disconnect();
|
||||
// Меняем режим на режим точки доступа
|
||||
WiFi.mode(WIFI_AP);
|
||||
// Задаем настройки сети
|
||||
Serial.print("Setting soft-AP configuration ... ");
|
||||
Serial.println(WiFi.softAPConfig(IPAddress(192, 168, 10, 1), IPAddress(192, 168, 10, 1), IPAddress(255, 255, 255, 0)) ? "Ready" : "Failed!");
|
||||
// Включаем WIFI в режиме точки доступа с именем и паролем
|
||||
Serial.print("Setting soft-AP ... ");
|
||||
Serial.println(WiFi.softAP(_ssidAP.c_str(), _passAP.c_str()) ? "AP Ready" : "AP Failed!");
|
||||
// Serial.println(WiFi.softAP("test1", "12345678") ? "AP Ready" : "AP Failed!");
|
||||
_isApMode = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void _wifi_check()
|
||||
{
|
||||
if (WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
_wifi_init();
|
||||
return;
|
||||
}
|
||||
if (_isApMode)
|
||||
{
|
||||
_wifi_init();
|
||||
}
|
||||
}
|
||||
|
||||
bool _config_load(void)
|
||||
{
|
||||
String str = _fs_read(_config.getFileName());
|
||||
if (!_config.convertFromString(str))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Serial.println(F("LOAD CONFING"));
|
||||
Serial.println(str);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool _config_save(void)
|
||||
{
|
||||
String str = _config.convertToString();
|
||||
Serial.println(F("SAVE CONFING"));
|
||||
return _fs_write(str, _config.getFileName());
|
||||
}
|
||||
|
||||
void _web_init(void)
|
||||
{
|
||||
_web.on("/get", HTTP_GET, _handle_get);
|
||||
_web.on("/gett", HTTP_GET, _handle_gett);
|
||||
_web.on("/list", HTTP_GET, _handle_file_list);
|
||||
_web.on("/set", HTTP_GET, _handle_set);
|
||||
_web.onNotFound([]()
|
||||
{
|
||||
if (!_handle_file_read(_web.uri())) _web.send(404, "text/plain", "File Not Found: " + _web.uri()); });
|
||||
|
||||
_web.begin();
|
||||
}
|
||||
|
||||
void _handle_set(void)
|
||||
{
|
||||
_config.ssid = _web.arg("ssid");
|
||||
_config.pass = _web.arg("pass");
|
||||
_config.token = _web.arg("bottoken");
|
||||
_config.updateUrl = _web.arg("updateurl");
|
||||
|
||||
if (_config_save())
|
||||
{
|
||||
_web.send(200, "text/plain", "SUCCESS");
|
||||
ESP.restart();
|
||||
}
|
||||
else
|
||||
{
|
||||
_web.send(500, "text/plain", "ERROR");
|
||||
}
|
||||
}
|
||||
|
||||
void _handle_get(void)
|
||||
{
|
||||
/***
|
||||
String root = "{}";
|
||||
DynamicJsonBuffer jsonBuffer;
|
||||
JsonObject &json = jsonBuffer.parseObject(root);
|
||||
_config.ToJson(json);
|
||||
// Помещаем созданный json в переменную root
|
||||
root = "";
|
||||
json.printTo(root);
|
||||
_web.send(200, "text/json", root);
|
||||
***/
|
||||
}
|
||||
|
||||
void _handle_gett(void)
|
||||
{
|
||||
/***
|
||||
String root = "{}";
|
||||
DynamicJsonBuffer jsonBuffer;
|
||||
JsonObject &json = jsonBuffer.parseObject(root);
|
||||
// Помещаем созданный json в переменную root
|
||||
root = "";
|
||||
json.printTo(root);
|
||||
_web.send(200, "text/json", root);
|
||||
***/
|
||||
}
|
||||
|
||||
void _handle_file_list(void)
|
||||
{
|
||||
String path = "/";
|
||||
if (_web.hasArg("dir"))
|
||||
path += _web.arg("dir");
|
||||
Dir dir = LittleFS.openDir(path);
|
||||
path = String();
|
||||
String output = "[";
|
||||
while (dir.next())
|
||||
{
|
||||
File entry = dir.openFile("r");
|
||||
if (output != "[")
|
||||
output += ',';
|
||||
bool isDir = false;
|
||||
output += "{\"type\":\"";
|
||||
output += (isDir) ? "dir" : "file";
|
||||
output += "\",\"name\":\"";
|
||||
output += String(entry.name()); //.substring(1);
|
||||
output += "\"}";
|
||||
entry.close();
|
||||
}
|
||||
output += "]";
|
||||
_web.send(200, "text/json", output);
|
||||
}
|
||||
|
||||
bool _handle_file_read(String path)
|
||||
{
|
||||
if (path.endsWith("/"))
|
||||
path += "index.html";
|
||||
String contentType = _getContentType(path);
|
||||
String pathWithGz = path + ".gz";
|
||||
if (LittleFS.exists(pathWithGz) || LittleFS.exists(path))
|
||||
{
|
||||
if (LittleFS.exists(pathWithGz))
|
||||
path += ".gz";
|
||||
File file = LittleFS.open(path, "r");
|
||||
size_t sent = _web.streamFile(file, contentType);
|
||||
file.close();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
String _getContentType(String filename)
|
||||
{
|
||||
if (_web.hasArg("download"))
|
||||
return "application/octet-stream";
|
||||
else if (filename.endsWith(".htm"))
|
||||
return "text/html";
|
||||
else if (filename.endsWith(".html"))
|
||||
return "text/html";
|
||||
else if (filename.endsWith(".json"))
|
||||
return "application/json";
|
||||
else if (filename.endsWith(".css"))
|
||||
return "text/css";
|
||||
else if (filename.endsWith(".js"))
|
||||
return "application/javascript";
|
||||
else if (filename.endsWith(".png"))
|
||||
return "image/png";
|
||||
else if (filename.endsWith(".gif"))
|
||||
return "image/gif";
|
||||
else if (filename.endsWith(".jpg"))
|
||||
return "image/jpeg";
|
||||
else if (filename.endsWith(".ico"))
|
||||
return "image/x-icon";
|
||||
else if (filename.endsWith(".xml"))
|
||||
return "text/xml";
|
||||
else if (filename.endsWith(".pdf"))
|
||||
return "application/x-pdf";
|
||||
else if (filename.endsWith(".zip"))
|
||||
return "application/x-zip";
|
||||
else if (filename.endsWith(".gz"))
|
||||
return "application/x-gzip";
|
||||
return "text/plain";
|
||||
}
|
||||
|
||||
void _fs_init(void)
|
||||
{
|
||||
LittleFS.begin();
|
||||
{
|
||||
Dir dir = LittleFS.openDir("/");
|
||||
while (dir.next())
|
||||
{
|
||||
String fileName = dir.fileName();
|
||||
size_t fileSize = dir.fileSize();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool _fs_write(String str, String file_name)
|
||||
{
|
||||
File file = LittleFS.open(file_name, "w");
|
||||
if (!file)
|
||||
{
|
||||
Serial.println(F("Failed to open file for writing"));
|
||||
file.close();
|
||||
return false;
|
||||
}
|
||||
file.print(str);
|
||||
file.close();
|
||||
Serial.println(F("SAVE FILE:"));
|
||||
Serial.println(str);
|
||||
return true;
|
||||
}
|
||||
|
||||
String _fs_read(String file_name)
|
||||
{
|
||||
String str = "";
|
||||
File file = LittleFS.open(file_name, "r");
|
||||
if (!file)
|
||||
return str;
|
||||
str = file.readString();
|
||||
file.close();
|
||||
return str;
|
||||
}
|
||||
27
Devices/main-module/src/main.h
Normal file
27
Devices/main-module/src/main.h
Normal file
@@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
|
||||
#define VERSION "20260109:1"
|
||||
|
||||
bool _isApMode = false;
|
||||
|
||||
String _rel_load(void);
|
||||
bool _rel_save(String config);
|
||||
|
||||
void _fs_init(void);
|
||||
bool _fs_write(String str, String file_name);
|
||||
String _fs_read(String file_name);
|
||||
|
||||
void _web_init(void);
|
||||
void _wifi_init(void);
|
||||
bool _handle_file_read(String path);
|
||||
bool _wifi_apmode(void);
|
||||
void _handle_get(void);
|
||||
void _handle_gett(void);
|
||||
void _handle_file_list(void);
|
||||
void _handle_set(void);
|
||||
bool _config_load(void);
|
||||
String _getContentType(String filename);
|
||||
bool _config_save(void);
|
||||
int sensor_run(void);
|
||||
void _termostat();
|
||||
void _wifi_check();
|
||||
150
Devices/main-module/src/pca9554.h
Normal file
150
Devices/main-module/src/pca9554.h
Normal file
@@ -0,0 +1,150 @@
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <Wire.h>
|
||||
|
||||
// PCA9554 Addressing
|
||||
// Address A2 A1 A0
|
||||
// 0x20 L L L
|
||||
// 0x21 L L H
|
||||
// 0x22 L H L
|
||||
// 0x23 L H H
|
||||
// 0x24 H L L
|
||||
// 0x25 H L H
|
||||
// 0x26 H H L
|
||||
// 0x27 H H H
|
||||
|
||||
#define INPUTPORT 0x00
|
||||
#define OUTPUTPORT 0x01
|
||||
#define POLINVPORT 0x02
|
||||
#define CONFIGPORT 0x03
|
||||
|
||||
#define ALLOUTPUT 0x00
|
||||
#define ALLINPUT 0xFF
|
||||
|
||||
class PCA9554
|
||||
{
|
||||
private:
|
||||
int _address;
|
||||
byte _sda = SDA;
|
||||
byte _scl = SCL;
|
||||
TwoWire *_wire;
|
||||
|
||||
bool twiRead(byte ®isterAddress)
|
||||
{
|
||||
_wire->beginTransmission(_address);
|
||||
_wire->write(registerAddress);
|
||||
|
||||
if (_wire->endTransmission() == 0)
|
||||
{
|
||||
delay(15);
|
||||
_wire->requestFrom(_address, 1, true);
|
||||
while (_wire->available() < 1)
|
||||
;
|
||||
registerAddress = _wire->read();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool twiWrite(byte registerAddress, byte dataWrite)
|
||||
{
|
||||
_wire->beginTransmission(_address);
|
||||
_wire->write(registerAddress);
|
||||
_wire->write(dataWrite);
|
||||
|
||||
if (_wire->endTransmission() == 0)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public:
|
||||
PCA9554() {}
|
||||
PCA9554(byte address, byte sda, byte scl)
|
||||
{
|
||||
_wire = &Wire;
|
||||
_address = address;
|
||||
_sda = sda;
|
||||
_scl = scl;
|
||||
_wire->begin(_sda, _scl);
|
||||
}
|
||||
|
||||
bool pinMode(byte pinNumber, bool state)
|
||||
{
|
||||
byte oldValue = CONFIGPORT;
|
||||
if (this->twiRead(oldValue) && (pinNumber <= 7))
|
||||
{
|
||||
if (!state)
|
||||
{
|
||||
oldValue |= (1 << pinNumber);
|
||||
if (this->portMode(oldValue))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
else if (state)
|
||||
{
|
||||
oldValue &= ~(1 << pinNumber);
|
||||
if (this->portMode(oldValue))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool portMode(byte value)
|
||||
{
|
||||
if (this->twiWrite(CONFIGPORT, value))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool digitalWrite(byte pinNumber, bool state)
|
||||
{
|
||||
byte oldValue = OUTPUTPORT;
|
||||
if (this->twiRead(oldValue) && pinNumber <= 7)
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
oldValue |= (1 << pinNumber);
|
||||
if (this->digitalWritePort(oldValue))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
else if (!state)
|
||||
{
|
||||
oldValue &= ~(1 << pinNumber);
|
||||
if (this->digitalWritePort(oldValue))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool digitalWritePort(byte value)
|
||||
{
|
||||
if (this->twiWrite(OUTPUTPORT, value))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool digitalRead(byte &pinNumber)
|
||||
{
|
||||
byte oldValue = INPUTPORT;
|
||||
if (this->twiRead(oldValue) && (pinNumber <= 7))
|
||||
{
|
||||
oldValue &= (1 << pinNumber);
|
||||
if (oldValue > 0)
|
||||
pinNumber = 1;
|
||||
else
|
||||
pinNumber = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
bool digitalReadPort(byte &value)
|
||||
{
|
||||
value = INPUTPORT;
|
||||
if (this->twiRead(value))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
};
|
||||
109
Devices/main-module/src/utils.cpp
Normal file
109
Devices/main-module/src/utils.cpp
Normal file
@@ -0,0 +1,109 @@
|
||||
#include "utils.h"
|
||||
|
||||
void FB_escHTML(String& s) {
|
||||
String out;
|
||||
out.reserve(s.length());
|
||||
for (uint16_t i = 0; i < s.length(); i++) {
|
||||
switch (s[i]) {
|
||||
case '<': out += F("<"); break;
|
||||
case '>': out += F(">"); break;
|
||||
case '&': out += F("&"); break;
|
||||
default: out += s[i]; break;
|
||||
}
|
||||
}
|
||||
s = out;
|
||||
}
|
||||
|
||||
static const char FB_escList[] = ">-={}.!";
|
||||
|
||||
void FB_escMarkdown(String& s) {
|
||||
String out;
|
||||
out.reserve(s.length());
|
||||
for (uint16_t i = 0; i < s.length(); i++) {
|
||||
if (strchr(FB_escList, s[i]) != 0) out += '\\';
|
||||
out += s[i];
|
||||
}
|
||||
Serial.println(out);
|
||||
s = out;
|
||||
}
|
||||
|
||||
int64_t FB_str64(const String &s) {
|
||||
return atoll(s.c_str());
|
||||
}
|
||||
String FB_64str(int64_t id) {
|
||||
String s;
|
||||
int32_t s1 = (int64_t)id % 1000000000;
|
||||
int32_t s2 = (int64_t)id / 1000000000;
|
||||
if (s2) {
|
||||
s += s2;
|
||||
s += abs(s1);
|
||||
} else {
|
||||
s += s1;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// упрощённый urlencode (до 38 ASCII + space)
|
||||
// по хорошему нужно пропускать только a-Z, 0-9 и -_.!~*'()
|
||||
void FB_urlencode(const String& s, String& dest) {
|
||||
dest.reserve(s.length() + 10);
|
||||
char c;
|
||||
for (uint16_t i = 0; i < s.length(); i++) {
|
||||
c = s[i];
|
||||
if (c == ' ') dest += '+';
|
||||
else if (c <= 38 || c == '+') {
|
||||
dest += '%';
|
||||
dest += (char)((c >> 4) + (((c >> 4) > 9) ? 87 : 48));
|
||||
dest += (char)((c & 0xF) + (((c & 0xF) > 9) ? 87 : 48));
|
||||
}
|
||||
else dest += c;
|
||||
}
|
||||
}
|
||||
|
||||
// разработано Глебом Жуковым, допилено AlexGyver
|
||||
// https://vk.com/wall-97877471_783011
|
||||
void FB_unicode(String &uStr) {
|
||||
if (!uStr.length()) return;
|
||||
String out;
|
||||
out.reserve(uStr.length() / 3);
|
||||
int32_t uBytes, buf = 0;
|
||||
char x0[] = "\0x";
|
||||
for (uint16_t i = 0; i < uStr.length(); i++) {
|
||||
if (uStr[i] != '\\') out += uStr[i];
|
||||
else {
|
||||
switch (uStr[++i]) {
|
||||
case '0': break;
|
||||
case 'n': out += '\n'; break;
|
||||
case 'r': out += '\r'; break;
|
||||
case 't': out += '\t'; break;
|
||||
case 'u':
|
||||
uBytes = strtol(uStr.c_str() + i + 1, NULL, HEX);
|
||||
i += 4;
|
||||
if ((uBytes >= 0xD800) && (uBytes <= 0xDBFF)) buf = uBytes;
|
||||
else if ((uBytes >= 0xDC00) && (uBytes <= 0xDFFF)) {
|
||||
uBytes = (0x10000 + ((buf - 0xD800) * 0x0400) + (uBytes - 0xDC00));
|
||||
out += (char)(0b11110000 | ((uBytes >> 18) & 0b111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | ((uBytes >> 12) & 0b111111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | ((uBytes >> 6) & 0b111111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | (uBytes & 0b111111));
|
||||
} else if (uBytes < 0x800) {
|
||||
out += (char)(0b11000000 | ((uBytes >> 6) & 0b11111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | (uBytes & 0b111111));
|
||||
} else if (uBytes >= 0x800) {
|
||||
out += (char)(0b11100000 | ((uBytes >> 12) & 0b1111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | ((uBytes >> 6) & 0b111111));
|
||||
out += x0;
|
||||
out += (char)(0b10000000 | (uBytes & 0b111111));
|
||||
}
|
||||
break;
|
||||
default: out += uStr[i]; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
uStr = out;
|
||||
}
|
||||
49
Devices/main-module/src/utils.h
Normal file
49
Devices/main-module/src/utils.h
Normal file
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
#include <Arduino.h>
|
||||
void FB_unicode(String &uStr);
|
||||
void FB_urlencode(const String& s, String& dest);
|
||||
void FB_escHTML(String& s);
|
||||
void FB_escMarkdown(String& s);
|
||||
|
||||
int64_t FB_str64(const String &s);
|
||||
String FB_64str(int64_t id);
|
||||
|
||||
struct FB_Parser {
|
||||
FB_Parser() {
|
||||
str.reserve(20);
|
||||
}
|
||||
|
||||
bool parseNT(const String& s) {
|
||||
while (!end) {
|
||||
char c1 = s[++i];
|
||||
if (c1 == '\t' || c1 == '\n' || c1 == '\0') {
|
||||
int to = i;
|
||||
if (s[to - 1] == ' ') to--;
|
||||
if (s[from] == ' ') from++;
|
||||
str = s.substring(from, to);
|
||||
from = i + 1;
|
||||
end = (c1 == '\0');
|
||||
div = c1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool parse(const String& s) {
|
||||
if (i >= (int)s.length() - 1) return 0;
|
||||
i = s.indexOf(',', from);
|
||||
if (i < 0) i = s.length();
|
||||
int to = i;
|
||||
if (s[to - 1] == ' ') to--;
|
||||
if (s[from] == ' ') from++;
|
||||
str = s.substring(from, to);
|
||||
from = i + 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int i = 0, from = 0;
|
||||
char div;
|
||||
bool end = false;
|
||||
String str;
|
||||
};
|
||||
5
Devices/rancho/meteo-out/.gitignore
vendored
Normal file
5
Devices/rancho/meteo-out/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
||||
10
Devices/rancho/meteo-out/.vscode/extensions.json
vendored
Normal file
10
Devices/rancho/meteo-out/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
||||
@@ -20,3 +20,9 @@ lib_deps =
|
||||
isobit/ArduinoNATS@^1.1.2
|
||||
; https://gitflic.ru/project/vpodberezsky/hal9000.git#1.1
|
||||
https://github.com/GyverLibs/FastBot2#1.2.4
|
||||
|
||||
arduino-libraries/NTPClient@^3.2.1
|
||||
; bblanchon/ArduinoJson@^7.2.1
|
||||
milesburton/DallasTemperature@^3.11.0
|
||||
https://gitflic.ru/project/vpodberezsky/hal9000.git#1.1
|
||||
; knolleary/PubSubClient@^2.8
|
||||
|
||||
263
Devices/rancho/meteo-out/src/main.cpp
Normal file
263
Devices/rancho/meteo-out/src/main.cpp
Normal file
@@ -0,0 +1,263 @@
|
||||
#include <Arduino.h>
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <ArduinoNATS.h>
|
||||
#include <FastBot2.h>
|
||||
#include <OneWire.h>
|
||||
#include <DallasTemperature.h>
|
||||
|
||||
FastBot2 bot;
|
||||
|
||||
String WIFI_SSID[] = {
|
||||
"fazenda",
|
||||
"paranetm",
|
||||
};
|
||||
|
||||
#define hello_str "MeteoOut is online [20251203]"
|
||||
|
||||
#define WIFI_PASS "78515169"
|
||||
|
||||
#define BOT_TOKEN "5363807811:AAHRz_rDIY5AV2NpEzS9jy0xXwjScAJyUOs"
|
||||
#define CHAT_ID "317081354"
|
||||
|
||||
#define ONE_WIRE_BUS D3
|
||||
|
||||
OneWire oneWire(ONE_WIRE_BUS);
|
||||
DallasTemperature sensors(&oneWire);
|
||||
|
||||
WiFiClient clientNats;
|
||||
NATS nats(
|
||||
&clientNats,
|
||||
"nats.paranet.ru", NATS_DEFAULT_PORT);
|
||||
|
||||
float currentT;
|
||||
|
||||
void getTemper()
|
||||
{
|
||||
Serial.print("Requesting temperatures...");
|
||||
sensors.requestTemperatures(); // Send the command to get temperatures
|
||||
Serial.println("DONE");
|
||||
// After we got the temperatures, we can print them here.
|
||||
// We use the function ByIndex, and as an example get the temperature from the first sensor only.
|
||||
float tempC = sensors.getTempCByIndex(0);
|
||||
|
||||
// Check if reading was successful
|
||||
if (tempC != DEVICE_DISCONNECTED_C)
|
||||
{
|
||||
Serial.print("Temperature for the device 1 (index 0) is: ");
|
||||
Serial.println(tempC);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Error: Could not read temperature data");
|
||||
}
|
||||
|
||||
currentT = tempC;
|
||||
}
|
||||
|
||||
String bot_last_message;
|
||||
String bot_chat_id;
|
||||
|
||||
void updateh(fb::Update &u)
|
||||
{
|
||||
// Serial.println("NEW MESSAGE");
|
||||
// Serial.println(u.message().from().username());
|
||||
// Serial.println(u.message().text());
|
||||
|
||||
if (u.message().text() == "update meteoout" && u.message().document().name().endsWith(".bin"))
|
||||
{ // .bin - значит это ОТА
|
||||
bot.sendMessage(fb::Message("OTA begin", u.message().chat().id()));
|
||||
|
||||
// между downloadFile и updateFlash/updateFS/writeTo не должно быть отправки сообщений!
|
||||
// OTA обновление тип 1
|
||||
// bot.updateFlash(u.message().document(), u.message().chat().id());
|
||||
|
||||
// OTA обновление тип 2
|
||||
fb::Fetcher fetch = bot.downloadFile(u.message().document().id());
|
||||
if (fetch)
|
||||
{
|
||||
if (fetch.updateFlash())
|
||||
{
|
||||
Serial.println("OTA done");
|
||||
bot.sendMessage(fb::Message("OTA done", u.message().chat().id()), true);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("OTA error");
|
||||
bot.sendMessage(fb::Message("OTA error", u.message().chat().id()), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String text = u.message().text();
|
||||
String id = u.message().chat().id();
|
||||
bot_last_message = text;
|
||||
bot_chat_id = id;
|
||||
|
||||
// #1
|
||||
// отправить обратно в чат (эхо)
|
||||
// bot.sendMessage(fb::Message(u.message().text(), u.message().chat().id()));
|
||||
|
||||
// #2
|
||||
// String text = u.message().text();
|
||||
// text += " - ответ";
|
||||
// bot.sendMessage(fb::Message(text, u.message().chat().id()));
|
||||
|
||||
// #3
|
||||
// fb::Message msg;
|
||||
// msg.text = u.message().text();
|
||||
// msg.text += " - ответ";
|
||||
// msg.chatID = u.message().chat().id();
|
||||
// bot.sendMessage(msg);
|
||||
}
|
||||
|
||||
void nats_blink_handler(NATS::msg msg)
|
||||
{
|
||||
// nats.publish(msg.reply, msg.data);
|
||||
String str = F("reply\n");
|
||||
str += msg.reply;
|
||||
str += F("\ndata\n");
|
||||
str += msg.data;
|
||||
Serial.println(str);
|
||||
// _telegram.send(str, _config.CHAT_ID);
|
||||
|
||||
// int count = atoi(msg.data);
|
||||
// while (count-- > 0)
|
||||
// {
|
||||
// digitalWrite(LED_BUILTIN, LOW);
|
||||
// delay(100);
|
||||
// digitalWrite(LED_BUILTIN, HIGH);
|
||||
// delay(100);
|
||||
// }
|
||||
}
|
||||
|
||||
void nats_on_connect()
|
||||
{
|
||||
nats.subscribe("switches/k1", nats_blink_handler);
|
||||
}
|
||||
|
||||
void wifi_check()
|
||||
{
|
||||
if (WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
for (byte i = 0; i < WIFI_SSID->length(); i++)
|
||||
{
|
||||
Serial.println("");
|
||||
Serial.print("try connected... ");
|
||||
Serial.println(WIFI_SSID[i]);
|
||||
byte tries = 20;
|
||||
WiFi.begin(WIFI_SSID[i], WIFI_PASS);
|
||||
while (tries-- > 0 && WiFi.status() != WL_CONNECTED)
|
||||
{
|
||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||
delay(500);
|
||||
Serial.print(".");
|
||||
yield();
|
||||
}
|
||||
if (WiFi.status() == WL_CONNECTED)
|
||||
{
|
||||
Serial.println("");
|
||||
return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
delay(1000);
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.println();
|
||||
Serial.println();
|
||||
Serial.println(F("SYSTEM: HAL9000"));
|
||||
Serial.println(F("Module: MeteoOut"));
|
||||
|
||||
sensors.begin();
|
||||
sensors.setResolution(9);
|
||||
getTemper();
|
||||
|
||||
wifi_check();
|
||||
Serial.println("WiFi connected");
|
||||
|
||||
// ============
|
||||
bot.attachUpdate(updateh); // подключить обработчик обновлений
|
||||
bot.setToken(F(BOT_TOKEN)); // установить токен
|
||||
|
||||
// режим опроса обновлений. Самый быстрый - Long
|
||||
// особенности читай тут в самом низу
|
||||
// https://github.com/GyverLibs/FastBot2/blob/main/docs/3.start.md
|
||||
|
||||
// bot.setPollMode(fb::Poll::Sync, 4000); // умолч
|
||||
// bot.setPollMode(fb::Poll::Async, 4000);
|
||||
bot.setPollMode(fb::Poll::Long, 60000);
|
||||
|
||||
// поприветствуем админа
|
||||
bot.sendMessage(fb::Message(hello_str, CHAT_ID));
|
||||
|
||||
Serial.print("connect NATS...");
|
||||
nats.on_connect = nats_on_connect;
|
||||
if (nats.connect())
|
||||
{
|
||||
Serial.println(" OK");
|
||||
bot.sendMessage(fb::Message("NATS connected.", CHAT_ID));
|
||||
}
|
||||
}
|
||||
|
||||
ulong ticks_1000 = 0;
|
||||
ulong ticks_10000 = 0;
|
||||
ulong ticks_10mins = 0;
|
||||
ulong ticks_60mins = 0;
|
||||
|
||||
void telegram_handler()
|
||||
{
|
||||
String text = bot_last_message;
|
||||
if (text.length() > 0)
|
||||
{
|
||||
Serial.println(F("CMD: ") + text);
|
||||
Serial.println(F("from chat: ") + bot_chat_id);
|
||||
|
||||
if (text == "/get-meteo-out")
|
||||
{
|
||||
String msg = "T: " + (String)currentT;
|
||||
bot.sendMessage(fb::Message(msg, bot_chat_id));
|
||||
Serial.println("send to chat > " + bot_chat_id);
|
||||
}
|
||||
|
||||
bot_last_message = "";
|
||||
}
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
if (millis() - ticks_1000 > 1000)
|
||||
{
|
||||
ticks_1000 = millis();
|
||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||
wifi_check();
|
||||
telegram_handler();
|
||||
}
|
||||
if (millis() - ticks_10000 > 10000)
|
||||
{
|
||||
ticks_10000 = millis();
|
||||
getTemper();
|
||||
// Serial.println("t = " + (String)currentT);
|
||||
}
|
||||
if (millis() - ticks_10mins > 600000UL)
|
||||
{
|
||||
ticks_10mins = millis();
|
||||
Serial.println("send to nats... ");
|
||||
nats.publish("/sensors/meteoout", ((String)currentT).c_str());
|
||||
Serial.println("OK");
|
||||
}
|
||||
if (millis() - ticks_60mins > 3600000UL)
|
||||
{
|
||||
ticks_60mins = millis();
|
||||
bot.sendMessage(fb::Message("MeteoOut T: " + (String)currentT, bot_chat_id));
|
||||
}
|
||||
|
||||
bot.tick();
|
||||
nats.process();
|
||||
yield();
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,140 +0,0 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "D:\\_local_git\\HomeOnApp\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 4,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Program.cs",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-11-23T12:42:55.827Z",
|
||||
"IsPinned": true,
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "App.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\App.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\App.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:12:12.287Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "Routes.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Routes.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Routes.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:12:00.693Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "Home.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:11:36.038Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 3,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Program.cs",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
|
||||
"RelativeToolTip": "Services.Web.UI\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-11-23T13:10:49.152Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 5,
|
||||
"Title": "launchSettings.json",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
|
||||
"WhenOpened": "2025-11-23T12:57:22.581Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 6,
|
||||
"Title": "Api.Services.DataBus.http",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003502|",
|
||||
"WhenOpened": "2025-11-23T12:56:50.808Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,174 +0,0 @@
|
||||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "D:\\_local_git\\HomeOnApp\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\weather.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\weather.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\counter.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\counter.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\routes.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\components\\pages\\home.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|d:\\_local_git\\homeonapp\\services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{186CADB7-6D07-4958-B0B6-99E644E43568}|Services.Web.UI\\Services.Web.UI.csproj|solutionrelative:services.web.ui\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|d:\\_local_git\\homeonapp\\api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}",
|
||||
"RelativeMoniker": "D:0:0:{32308B95-763B-04CF-84D7-C22CE2F5DF6E}|Api.Services.DataBus\\Api.Services.DataBus.csproj|solutionrelative:api.services.databus\\api.services.databus.http||{5703B403-55E7-4C63-8C88-A8F52C7A45C5}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 1,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 6,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Program.cs",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Program.cs",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-11-23T12:42:55.827Z",
|
||||
"IsPinned": true,
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Weather.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Weather.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Weather.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Weather.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Weather.razor",
|
||||
"ViewState": "AgIAABsAAAAAAAAAAAAAABkAAAAqAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:14:14.338Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "Counter.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Counter.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Counter.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Counter.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Counter.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:13:49.614Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 2,
|
||||
"Title": "App.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\App.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\App.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\App.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:12:12.287Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 3,
|
||||
"Title": "Routes.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Routes.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Routes.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Routes.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:12:00.693Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 4,
|
||||
"Title": "Home.razor",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"RelativeToolTip": "Services.Web.UI\\Components\\Pages\\Home.razor",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||
"WhenOpened": "2025-11-23T13:11:36.038Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 5,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
|
||||
"RelativeDocumentMoniker": "Services.Web.UI\\Program.cs",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Services.Web.UI\\Program.cs",
|
||||
"RelativeToolTip": "Services.Web.UI\\Program.cs",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2025-11-23T13:10:49.152Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 7,
|
||||
"Title": "launchSettings.json",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Properties\\launchSettings.json",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
|
||||
"WhenOpened": "2025-11-23T12:57:22.581Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 8,
|
||||
"Title": "Api.Services.DataBus.http",
|
||||
"DocumentMoniker": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"RelativeDocumentMoniker": "Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"ToolTip": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"RelativeToolTip": "Api.Services.DataBus\\Api.Services.DataBus.http",
|
||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003502|",
|
||||
"WhenOpened": "2025-11-23T12:56:50.808Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,13 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,6 +0,0 @@
|
||||
@Api.Services.DataBus_HostAddress = http://localhost:5173
|
||||
|
||||
GET {{Api.Services.DataBus_HostAddress}}/weatherforecast/
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
@@ -1,39 +0,0 @@
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
|
||||
builder.Services.AddOpenApi();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.MapOpenApi();
|
||||
}
|
||||
|
||||
var summaries = new[]
|
||||
{
|
||||
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
|
||||
};
|
||||
|
||||
app.MapGet("/weatherforecast", () =>
|
||||
{
|
||||
var forecast = Enumerable.Range(1, 5).Select(index =>
|
||||
new WeatherForecast
|
||||
(
|
||||
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
|
||||
Random.Shared.Next(-20, 55),
|
||||
summaries[Random.Shared.Next(summaries.Length)]
|
||||
))
|
||||
.ToArray();
|
||||
return forecast;
|
||||
})
|
||||
.WithName("GetWeatherForecast");
|
||||
|
||||
app.Run();
|
||||
|
||||
internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
|
||||
{
|
||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": false,
|
||||
"applicationUrl": "http://localhost:5173",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
|
||||
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\vpodberezsky\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
|
||||
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<SourceRoot Include="C:\Users\vpodberezsky\.nuget\packages\" />
|
||||
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.openapi\10.0.0\build\Microsoft.AspNetCore.OpenApi.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.openapi\10.0.0\build\Microsoft.AspNetCore.OpenApi.targets')" />
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,23 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// Этот код создан программой.
|
||||
// Исполняемая версия:4.0.30319.42000
|
||||
//
|
||||
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
|
||||
// повторной генерации кода.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Api.Services.DataBus")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Api.Services.DataBus")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Api.Services.DataBus")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
// Создано классом WriteCodeFragment MSBuild.
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
6fcfe52902469cd4a11fcdbd9675f02c70468f27aad962caca4dee55c91a9eaf
|
||||
@@ -1,17 +0,0 @@
|
||||
// <auto-generated/>
|
||||
global using Microsoft.AspNetCore.Builder;
|
||||
global using Microsoft.AspNetCore.Hosting;
|
||||
global using Microsoft.AspNetCore.Http;
|
||||
global using Microsoft.AspNetCore.Routing;
|
||||
global using Microsoft.Extensions.Configuration;
|
||||
global using Microsoft.Extensions.DependencyInjection;
|
||||
global using Microsoft.Extensions.Hosting;
|
||||
global using Microsoft.Extensions.Logging;
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.IO;
|
||||
global using System.Linq;
|
||||
global using System.Net.Http;
|
||||
global using System.Net.Http.Json;
|
||||
global using System.Threading;
|
||||
global using System.Threading.Tasks;
|
||||
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
||||
{"GlobalPropertiesHash":"U5WhPJPIVoIchpLJ3IU+ENky8hcmTH8TR740SONAzR0=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["UYWt3os4Ukb1Rre\u002Bm\u002BQCaM/HDRckO9F2SwlcwE2e4PI=","79/nlzCC2T1MKLzeg09cQdb4EPmlGLoouwFfqAZfm/w="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@@ -1,577 +0,0 @@
|
||||
{
|
||||
"version": 3,
|
||||
"targets": {
|
||||
"net10.0": {
|
||||
"Microsoft.AspNetCore.OpenApi/10.0.0": {
|
||||
"type": "package",
|
||||
"dependencies": {
|
||||
"Microsoft.OpenApi": "2.0.0"
|
||||
},
|
||||
"compile": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll": {
|
||||
"related": ".xml"
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll": {
|
||||
"related": ".xml"
|
||||
}
|
||||
},
|
||||
"frameworkReferences": [
|
||||
"Microsoft.AspNetCore.App"
|
||||
],
|
||||
"build": {
|
||||
"build/Microsoft.AspNetCore.OpenApi.targets": {}
|
||||
}
|
||||
},
|
||||
"Microsoft.OpenApi/2.0.0": {
|
||||
"type": "package",
|
||||
"compile": {
|
||||
"lib/net8.0/Microsoft.OpenApi.dll": {
|
||||
"related": ".pdb;.xml"
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.OpenApi.dll": {
|
||||
"related": ".pdb;.xml"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Microsoft.AspNetCore.OpenApi/10.0.0": {
|
||||
"sha512": "0aqIF1t+sA2T62LIeMtXGSiaV7keGQaJnvwwmu+htQdjCaKYARfXAeqp4nHH9y2etpilyZ/tnQzZg4Ilmo/c4Q==",
|
||||
"type": "package",
|
||||
"path": "microsoft.aspnetcore.openapi/10.0.0",
|
||||
"files": [
|
||||
".nupkg.metadata",
|
||||
".signature.p7s",
|
||||
"Icon.png",
|
||||
"PACKAGE.md",
|
||||
"THIRD-PARTY-NOTICES.TXT",
|
||||
"analyzers/dotnet/cs/Microsoft.AspNetCore.OpenApi.SourceGenerators.dll",
|
||||
"build/Microsoft.AspNetCore.OpenApi.targets",
|
||||
"lib/net10.0/Microsoft.AspNetCore.OpenApi.dll",
|
||||
"lib/net10.0/Microsoft.AspNetCore.OpenApi.xml",
|
||||
"microsoft.aspnetcore.openapi.10.0.0.nupkg.sha512",
|
||||
"microsoft.aspnetcore.openapi.nuspec"
|
||||
]
|
||||
},
|
||||
"Microsoft.OpenApi/2.0.0": {
|
||||
"sha512": "GGYLfzV/G/ct80OZ45JxnWP7NvMX1BCugn/lX7TH5o0lcVaviavsLMTxmFV2AybXWjbi3h6FF1vgZiTK6PXndw==",
|
||||
"type": "package",
|
||||
"path": "microsoft.openapi/2.0.0",
|
||||
"files": [
|
||||
".nupkg.metadata",
|
||||
".signature.p7s",
|
||||
"README.md",
|
||||
"lib/net8.0/Microsoft.OpenApi.dll",
|
||||
"lib/net8.0/Microsoft.OpenApi.pdb",
|
||||
"lib/net8.0/Microsoft.OpenApi.xml",
|
||||
"lib/netstandard2.0/Microsoft.OpenApi.dll",
|
||||
"lib/netstandard2.0/Microsoft.OpenApi.pdb",
|
||||
"lib/netstandard2.0/Microsoft.OpenApi.xml",
|
||||
"microsoft.openapi.2.0.0.nupkg.sha512",
|
||||
"microsoft.openapi.nuspec"
|
||||
]
|
||||
}
|
||||
},
|
||||
"projectFileDependencyGroups": {
|
||||
"net10.0": [
|
||||
"Microsoft.AspNetCore.OpenApi >= 10.0.0"
|
||||
]
|
||||
},
|
||||
"packageFolders": {
|
||||
"C:\\Users\\vpodberezsky\\.nuget\\packages\\": {},
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
|
||||
"projectName": "Api.Services.DataBus",
|
||||
"projectPath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
|
||||
"packagesPath": "C:\\Users\\vpodberezsky\\.nuget\\packages\\",
|
||||
"outputPath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\vpodberezsky\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net10.0"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net10.0": {
|
||||
"targetAlias": "net10.0",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "all"
|
||||
},
|
||||
"SdkAnalysisLevel": "10.0.100"
|
||||
},
|
||||
"frameworks": {
|
||||
"net10.0": {
|
||||
"targetAlias": "net10.0",
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.OpenApi": {
|
||||
"target": "Package",
|
||||
"version": "[10.0.0, )"
|
||||
}
|
||||
},
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.AspNetCore.App": {
|
||||
"privateAssets": "none"
|
||||
},
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.100/PortableRuntimeIdentifierGraph.json",
|
||||
"packagesToPrune": {
|
||||
"Microsoft.AspNetCore": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Antiforgery": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.App": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication.BearerToken": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication.Cookies": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication.Core": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authentication.OAuth": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authorization": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Authorization.Policy": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components.Authorization": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components.Endpoints": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components.Forms": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components.Server": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Components.Web": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Connections.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.CookiePolicy": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Cors": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Cryptography.Internal": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Cryptography.KeyDerivation": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.DataProtection": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.DataProtection.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.DataProtection.Extensions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Diagnostics": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Diagnostics.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Diagnostics.HealthChecks": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.HostFiltering": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Hosting": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Hosting.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Hosting.Server.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Html.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Connections": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Connections.Common": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Extensions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Features": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Http.Results": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.HttpLogging": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.HttpOverrides": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.HttpsPolicy": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Identity": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Localization": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Localization.Routing": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Metadata": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.ApiExplorer": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Core": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Cors": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.DataAnnotations": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Formatters.Json": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Formatters.Xml": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Localization": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.Razor": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.RazorPages": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.TagHelpers": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Mvc.ViewFeatures": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.OutputCaching": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.RateLimiting": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Razor": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Razor.Runtime": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.RequestDecompression": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.ResponseCaching": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.ResponseCaching.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.ResponseCompression": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Rewrite": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Routing": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Routing.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.HttpSys": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.IIS": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.IISIntegration": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.Kestrel": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.Kestrel.Core": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.Kestrel.Transport.NamedPipes": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.Kestrel.Transport.Quic": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.Session": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.SignalR": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.SignalR.Common": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.SignalR.Core": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.SignalR.Protocols.Json": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.StaticAssets": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.StaticFiles": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.WebSockets": "(,10.0.32767]",
|
||||
"Microsoft.AspNetCore.WebUtilities": "(,10.0.32767]",
|
||||
"Microsoft.CSharp": "(,4.7.32767]",
|
||||
"Microsoft.Extensions.Caching.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Caching.Memory": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.Binder": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.CommandLine": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.EnvironmentVariables": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.FileExtensions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.Ini": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.Json": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.KeyPerFile": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.UserSecrets": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Configuration.Xml": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.DependencyInjection": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Diagnostics": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Diagnostics.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Diagnostics.HealthChecks": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Features": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.FileProviders.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.FileProviders.Composite": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.FileProviders.Physical": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.FileSystemGlobbing": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Hosting": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Hosting.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Http": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Identity.Core": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Identity.Stores": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Localization": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Localization.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.Configuration": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.Console": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.Debug": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.EventLog": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.EventSource": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Logging.TraceSource": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.ObjectPool": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Options": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Options.ConfigurationExtensions": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Options.DataAnnotations": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Primitives": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.Validation": "(,10.0.32767]",
|
||||
"Microsoft.Extensions.WebEncoders": "(,10.0.32767]",
|
||||
"Microsoft.JSInterop": "(,10.0.32767]",
|
||||
"Microsoft.Net.Http.Headers": "(,10.0.32767]",
|
||||
"Microsoft.VisualBasic": "(,10.4.32767]",
|
||||
"Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||
"Microsoft.Win32.Registry": "(,5.0.32767]",
|
||||
"runtime.any.System.Collections": "(,4.3.32767]",
|
||||
"runtime.any.System.Diagnostics.Tools": "(,4.3.32767]",
|
||||
"runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||
"runtime.any.System.Globalization": "(,4.3.32767]",
|
||||
"runtime.any.System.Globalization.Calendars": "(,4.3.32767]",
|
||||
"runtime.any.System.IO": "(,4.3.32767]",
|
||||
"runtime.any.System.Reflection": "(,4.3.32767]",
|
||||
"runtime.any.System.Reflection.Extensions": "(,4.3.32767]",
|
||||
"runtime.any.System.Reflection.Primitives": "(,4.3.32767]",
|
||||
"runtime.any.System.Resources.ResourceManager": "(,4.3.32767]",
|
||||
"runtime.any.System.Runtime": "(,4.3.32767]",
|
||||
"runtime.any.System.Runtime.Handles": "(,4.3.32767]",
|
||||
"runtime.any.System.Runtime.InteropServices": "(,4.3.32767]",
|
||||
"runtime.any.System.Text.Encoding": "(,4.3.32767]",
|
||||
"runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||
"runtime.any.System.Threading.Tasks": "(,4.3.32767]",
|
||||
"runtime.any.System.Threading.Timer": "(,4.3.32767]",
|
||||
"runtime.aot.System.Collections": "(,4.3.32767]",
|
||||
"runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]",
|
||||
"runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||
"runtime.aot.System.Globalization": "(,4.3.32767]",
|
||||
"runtime.aot.System.Globalization.Calendars": "(,4.3.32767]",
|
||||
"runtime.aot.System.IO": "(,4.3.32767]",
|
||||
"runtime.aot.System.Reflection": "(,4.3.32767]",
|
||||
"runtime.aot.System.Reflection.Extensions": "(,4.3.32767]",
|
||||
"runtime.aot.System.Reflection.Primitives": "(,4.3.32767]",
|
||||
"runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]",
|
||||
"runtime.aot.System.Runtime": "(,4.3.32767]",
|
||||
"runtime.aot.System.Runtime.Handles": "(,4.3.32767]",
|
||||
"runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]",
|
||||
"runtime.aot.System.Text.Encoding": "(,4.3.32767]",
|
||||
"runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||
"runtime.aot.System.Threading.Tasks": "(,4.3.32767]",
|
||||
"runtime.aot.System.Threading.Timer": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]",
|
||||
"runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]",
|
||||
"runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]",
|
||||
"runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]",
|
||||
"runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]",
|
||||
"runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]",
|
||||
"runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||
"runtime.unix.System.Console": "(,4.3.32767]",
|
||||
"runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]",
|
||||
"runtime.unix.System.IO.FileSystem": "(,4.3.32767]",
|
||||
"runtime.unix.System.Net.Primitives": "(,4.3.32767]",
|
||||
"runtime.unix.System.Net.Sockets": "(,4.3.32767]",
|
||||
"runtime.unix.System.Private.Uri": "(,4.3.32767]",
|
||||
"runtime.unix.System.Runtime.Extensions": "(,4.3.32767]",
|
||||
"runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]",
|
||||
"runtime.win.System.Console": "(,4.3.32767]",
|
||||
"runtime.win.System.Diagnostics.Debug": "(,4.3.32767]",
|
||||
"runtime.win.System.IO.FileSystem": "(,4.3.32767]",
|
||||
"runtime.win.System.Net.Primitives": "(,4.3.32767]",
|
||||
"runtime.win.System.Net.Sockets": "(,4.3.32767]",
|
||||
"runtime.win.System.Runtime.Extensions": "(,4.3.32767]",
|
||||
"runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||
"runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||
"runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]",
|
||||
"runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"runtime.win7.System.Private.Uri": "(,4.3.32767]",
|
||||
"runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]",
|
||||
"System.AppContext": "(,4.3.32767]",
|
||||
"System.Buffers": "(,5.0.32767]",
|
||||
"System.Collections": "(,4.3.32767]",
|
||||
"System.Collections.Concurrent": "(,4.3.32767]",
|
||||
"System.Collections.Immutable": "(,10.0.32767]",
|
||||
"System.Collections.NonGeneric": "(,4.3.32767]",
|
||||
"System.Collections.Specialized": "(,4.3.32767]",
|
||||
"System.ComponentModel": "(,4.3.32767]",
|
||||
"System.ComponentModel.Annotations": "(,4.3.32767]",
|
||||
"System.ComponentModel.EventBasedAsync": "(,4.3.32767]",
|
||||
"System.ComponentModel.Primitives": "(,4.3.32767]",
|
||||
"System.ComponentModel.TypeConverter": "(,4.3.32767]",
|
||||
"System.Console": "(,4.3.32767]",
|
||||
"System.Data.Common": "(,4.3.32767]",
|
||||
"System.Data.DataSetExtensions": "(,4.4.32767]",
|
||||
"System.Diagnostics.Contracts": "(,4.3.32767]",
|
||||
"System.Diagnostics.Debug": "(,4.3.32767]",
|
||||
"System.Diagnostics.DiagnosticSource": "(,10.0.32767]",
|
||||
"System.Diagnostics.EventLog": "(,10.0.32767]",
|
||||
"System.Diagnostics.FileVersionInfo": "(,4.3.32767]",
|
||||
"System.Diagnostics.Process": "(,4.3.32767]",
|
||||
"System.Diagnostics.StackTrace": "(,4.3.32767]",
|
||||
"System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]",
|
||||
"System.Diagnostics.Tools": "(,4.3.32767]",
|
||||
"System.Diagnostics.TraceSource": "(,4.3.32767]",
|
||||
"System.Diagnostics.Tracing": "(,4.3.32767]",
|
||||
"System.Drawing.Primitives": "(,4.3.32767]",
|
||||
"System.Dynamic.Runtime": "(,4.3.32767]",
|
||||
"System.Formats.Asn1": "(,10.0.32767]",
|
||||
"System.Formats.Cbor": "(,10.0.32767]",
|
||||
"System.Formats.Tar": "(,10.0.32767]",
|
||||
"System.Globalization": "(,4.3.32767]",
|
||||
"System.Globalization.Calendars": "(,4.3.32767]",
|
||||
"System.Globalization.Extensions": "(,4.3.32767]",
|
||||
"System.IO": "(,4.3.32767]",
|
||||
"System.IO.Compression": "(,4.3.32767]",
|
||||
"System.IO.Compression.ZipFile": "(,4.3.32767]",
|
||||
"System.IO.FileSystem": "(,4.3.32767]",
|
||||
"System.IO.FileSystem.AccessControl": "(,4.4.32767]",
|
||||
"System.IO.FileSystem.DriveInfo": "(,4.3.32767]",
|
||||
"System.IO.FileSystem.Primitives": "(,4.3.32767]",
|
||||
"System.IO.FileSystem.Watcher": "(,4.3.32767]",
|
||||
"System.IO.IsolatedStorage": "(,4.3.32767]",
|
||||
"System.IO.MemoryMappedFiles": "(,4.3.32767]",
|
||||
"System.IO.Pipelines": "(,10.0.32767]",
|
||||
"System.IO.Pipes": "(,4.3.32767]",
|
||||
"System.IO.Pipes.AccessControl": "(,5.0.32767]",
|
||||
"System.IO.UnmanagedMemoryStream": "(,4.3.32767]",
|
||||
"System.Linq": "(,4.3.32767]",
|
||||
"System.Linq.AsyncEnumerable": "(,10.0.32767]",
|
||||
"System.Linq.Expressions": "(,4.3.32767]",
|
||||
"System.Linq.Parallel": "(,4.3.32767]",
|
||||
"System.Linq.Queryable": "(,4.3.32767]",
|
||||
"System.Memory": "(,5.0.32767]",
|
||||
"System.Net.Http": "(,4.3.32767]",
|
||||
"System.Net.Http.Json": "(,10.0.32767]",
|
||||
"System.Net.NameResolution": "(,4.3.32767]",
|
||||
"System.Net.NetworkInformation": "(,4.3.32767]",
|
||||
"System.Net.Ping": "(,4.3.32767]",
|
||||
"System.Net.Primitives": "(,4.3.32767]",
|
||||
"System.Net.Requests": "(,4.3.32767]",
|
||||
"System.Net.Security": "(,4.3.32767]",
|
||||
"System.Net.ServerSentEvents": "(,10.0.32767]",
|
||||
"System.Net.Sockets": "(,4.3.32767]",
|
||||
"System.Net.WebHeaderCollection": "(,4.3.32767]",
|
||||
"System.Net.WebSockets": "(,4.3.32767]",
|
||||
"System.Net.WebSockets.Client": "(,4.3.32767]",
|
||||
"System.Numerics.Vectors": "(,5.0.32767]",
|
||||
"System.ObjectModel": "(,4.3.32767]",
|
||||
"System.Private.DataContractSerialization": "(,4.3.32767]",
|
||||
"System.Private.Uri": "(,4.3.32767]",
|
||||
"System.Reflection": "(,4.3.32767]",
|
||||
"System.Reflection.DispatchProxy": "(,6.0.32767]",
|
||||
"System.Reflection.Emit": "(,4.7.32767]",
|
||||
"System.Reflection.Emit.ILGeneration": "(,4.7.32767]",
|
||||
"System.Reflection.Emit.Lightweight": "(,4.7.32767]",
|
||||
"System.Reflection.Extensions": "(,4.3.32767]",
|
||||
"System.Reflection.Metadata": "(,10.0.32767]",
|
||||
"System.Reflection.Primitives": "(,4.3.32767]",
|
||||
"System.Reflection.TypeExtensions": "(,4.3.32767]",
|
||||
"System.Resources.Reader": "(,4.3.32767]",
|
||||
"System.Resources.ResourceManager": "(,4.3.32767]",
|
||||
"System.Resources.Writer": "(,4.3.32767]",
|
||||
"System.Runtime": "(,4.3.32767]",
|
||||
"System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]",
|
||||
"System.Runtime.CompilerServices.VisualC": "(,4.3.32767]",
|
||||
"System.Runtime.Extensions": "(,4.3.32767]",
|
||||
"System.Runtime.Handles": "(,4.3.32767]",
|
||||
"System.Runtime.InteropServices": "(,4.3.32767]",
|
||||
"System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]",
|
||||
"System.Runtime.Loader": "(,4.3.32767]",
|
||||
"System.Runtime.Numerics": "(,4.3.32767]",
|
||||
"System.Runtime.Serialization.Formatters": "(,4.3.32767]",
|
||||
"System.Runtime.Serialization.Json": "(,4.3.32767]",
|
||||
"System.Runtime.Serialization.Primitives": "(,4.3.32767]",
|
||||
"System.Runtime.Serialization.Xml": "(,4.3.32767]",
|
||||
"System.Security.AccessControl": "(,6.0.32767]",
|
||||
"System.Security.Claims": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.Algorithms": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.Cng": "(,5.0.32767]",
|
||||
"System.Security.Cryptography.Csp": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.Encoding": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.OpenSsl": "(,5.0.32767]",
|
||||
"System.Security.Cryptography.Primitives": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.X509Certificates": "(,4.3.32767]",
|
||||
"System.Security.Cryptography.Xml": "(,10.0.32767]",
|
||||
"System.Security.Principal": "(,4.3.32767]",
|
||||
"System.Security.Principal.Windows": "(,5.0.32767]",
|
||||
"System.Security.SecureString": "(,4.3.32767]",
|
||||
"System.Text.Encoding": "(,4.3.32767]",
|
||||
"System.Text.Encoding.CodePages": "(,10.0.32767]",
|
||||
"System.Text.Encoding.Extensions": "(,4.3.32767]",
|
||||
"System.Text.Encodings.Web": "(,10.0.32767]",
|
||||
"System.Text.Json": "(,10.0.32767]",
|
||||
"System.Text.RegularExpressions": "(,4.3.32767]",
|
||||
"System.Threading": "(,4.3.32767]",
|
||||
"System.Threading.AccessControl": "(,10.0.32767]",
|
||||
"System.Threading.Channels": "(,10.0.32767]",
|
||||
"System.Threading.Overlapped": "(,4.3.32767]",
|
||||
"System.Threading.RateLimiting": "(,10.0.32767]",
|
||||
"System.Threading.Tasks": "(,4.3.32767]",
|
||||
"System.Threading.Tasks.Dataflow": "(,10.0.32767]",
|
||||
"System.Threading.Tasks.Extensions": "(,5.0.32767]",
|
||||
"System.Threading.Tasks.Parallel": "(,4.3.32767]",
|
||||
"System.Threading.Thread": "(,4.3.32767]",
|
||||
"System.Threading.ThreadPool": "(,4.3.32767]",
|
||||
"System.Threading.Timer": "(,4.3.32767]",
|
||||
"System.ValueTuple": "(,4.5.32767]",
|
||||
"System.Xml.ReaderWriter": "(,4.3.32767]",
|
||||
"System.Xml.XDocument": "(,4.3.32767]",
|
||||
"System.Xml.XmlDocument": "(,4.3.32767]",
|
||||
"System.Xml.XmlSerializer": "(,4.3.32767]",
|
||||
"System.Xml.XPath": "(,4.3.32767]",
|
||||
"System.Xml.XPath.XDocument": "(,5.0.32767]"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "SXLztkQN/uI=",
|
||||
"success": true,
|
||||
"projectFilePath": "D:\\_local_git\\HomeOnApp\\Api.Services.DataBus\\Api.Services.DataBus.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"C:\\Users\\vpodberezsky\\.nuget\\packages\\microsoft.aspnetcore.openapi\\10.0.0\\microsoft.aspnetcore.openapi.10.0.0.nupkg.sha512",
|
||||
"C:\\Users\\vpodberezsky\\.nuget\\packages\\microsoft.openapi\\2.0.0\\microsoft.openapi.2.0.0.nupkg.sha512"
|
||||
],
|
||||
"logs": []
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<Solution>
|
||||
<Project Path="Api.Services.DataBus/Api.Services.DataBus.csproj" />
|
||||
<Project Path="Services.Web.UI/Services.Web.UI.csproj" Id="186cadb7-6d07-4958-b0b6-99e644e43568" />
|
||||
</Solution>
|
||||
@@ -1,23 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<base href="/" />
|
||||
<ResourcePreloader />
|
||||
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" />
|
||||
<link rel="stylesheet" href="@Assets["app.css"]" />
|
||||
<link rel="stylesheet" href="@Assets["Services.Web.UI.styles.css"]" />
|
||||
<ImportMap />
|
||||
<link rel="icon" type="image/png" href="favicon.png" />
|
||||
<HeadOutlet />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<Routes />
|
||||
<ReconnectModal />
|
||||
<script src="@Assets["_framework/blazor.web.js"]"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,23 +0,0 @@
|
||||
@inherits LayoutComponentBase
|
||||
|
||||
<div class="page">
|
||||
<div class="sidebar">
|
||||
<NavMenu />
|
||||
</div>
|
||||
|
||||
<main>
|
||||
<div class="top-row px-4">
|
||||
<a href="https://learn.microsoft.com/aspnet/core/" target="_blank">About</a>
|
||||
</div>
|
||||
|
||||
<article class="content px-4">
|
||||
@Body
|
||||
</article>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<div id="blazor-error-ui" data-nosnippet>
|
||||
An unhandled error has occurred.
|
||||
<a href="." class="reload">Reload</a>
|
||||
<span class="dismiss">🗙</span>
|
||||
</div>
|
||||
@@ -1,98 +0,0 @@
|
||||
.page {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
main {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
|
||||
}
|
||||
|
||||
.top-row {
|
||||
background-color: #f7f7f7;
|
||||
border-bottom: 1px solid #d6d5d5;
|
||||
justify-content: flex-end;
|
||||
height: 3.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.top-row ::deep a, .top-row ::deep .btn-link {
|
||||
white-space: nowrap;
|
||||
margin-left: 1.5rem;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.top-row ::deep a:first-child {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
@media (max-width: 640.98px) {
|
||||
.top-row {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.top-row ::deep a, .top-row ::deep .btn-link {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 641px) {
|
||||
.page {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
width: 250px;
|
||||
height: 100vh;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.top-row {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.top-row.auth ::deep a:first-child {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.top-row, article {
|
||||
padding-left: 2rem !important;
|
||||
padding-right: 1.5rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
#blazor-error-ui {
|
||||
color-scheme: light only;
|
||||
background: lightyellow;
|
||||
bottom: 0;
|
||||
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
|
||||
box-sizing: border-box;
|
||||
display: none;
|
||||
left: 0;
|
||||
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
#blazor-error-ui .dismiss {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
right: 0.75rem;
|
||||
top: 0.5rem;
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
<div class="top-row ps-3 navbar navbar-dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="">Services.Web.UI</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
|
||||
|
||||
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
|
||||
<nav class="nav flex-column">
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
|
||||
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
|
||||
</NavLink>
|
||||
</div>
|
||||
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="counter">
|
||||
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
|
||||
</NavLink>
|
||||
</div>
|
||||
|
||||
<div class="nav-item px-3">
|
||||
<NavLink class="nav-link" href="weather">
|
||||
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
|
||||
</NavLink>
|
||||
</div>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
.navbar-toggler {
|
||||
appearance: none;
|
||||
cursor: pointer;
|
||||
width: 3.5rem;
|
||||
height: 2.5rem;
|
||||
color: white;
|
||||
position: absolute;
|
||||
top: 0.5rem;
|
||||
right: 1rem;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.navbar-toggler:checked {
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
.top-row {
|
||||
min-height: 3.5rem;
|
||||
background-color: rgba(0,0,0,0.4);
|
||||
}
|
||||
|
||||
.navbar-brand {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.bi {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
margin-right: 0.75rem;
|
||||
top: -1px;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.bi-house-door-fill-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.bi-plus-square-fill-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.bi-list-nested-nav-menu {
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
|
||||
}
|
||||
|
||||
.nav-item {
|
||||
font-size: 0.9rem;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.nav-item:first-of-type {
|
||||
padding-top: 1rem;
|
||||
}
|
||||
|
||||
.nav-item:last-of-type {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
.nav-item ::deep .nav-link {
|
||||
color: #d7d7d7;
|
||||
background: none;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
height: 3rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 3rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.nav-item ::deep a.active {
|
||||
background-color: rgba(255,255,255,0.37);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-item ::deep .nav-link:hover {
|
||||
background-color: rgba(255,255,255,0.1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.nav-scrollable {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar-toggler:checked ~ .nav-scrollable {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (min-width: 641px) {
|
||||
.navbar-toggler {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.nav-scrollable {
|
||||
/* Never collapse the sidebar for wide screens */
|
||||
display: block;
|
||||
|
||||
/* Allow sidebar to scroll for tall menus */
|
||||
height: calc(100vh - 3.5rem);
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<script type="module" src="@Assets["Components/Layout/ReconnectModal.razor.js"]"></script>
|
||||
|
||||
<dialog id="components-reconnect-modal" data-nosnippet>
|
||||
<div class="components-reconnect-container">
|
||||
<div class="components-rejoining-animation" aria-hidden="true">
|
||||
<div></div>
|
||||
<div></div>
|
||||
</div>
|
||||
<p class="components-reconnect-first-attempt-visible">
|
||||
Rejoining the server...
|
||||
</p>
|
||||
<p class="components-reconnect-repeated-attempt-visible">
|
||||
Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.
|
||||
</p>
|
||||
<p class="components-reconnect-failed-visible">
|
||||
Failed to rejoin.<br />Please retry or reload the page.
|
||||
</p>
|
||||
<button id="components-reconnect-button" class="components-reconnect-failed-visible">
|
||||
Retry
|
||||
</button>
|
||||
<p class="components-pause-visible">
|
||||
The session has been paused by the server.
|
||||
</p>
|
||||
<button id="components-resume-button" class="components-pause-visible">
|
||||
Resume
|
||||
</button>
|
||||
<p class="components-resume-failed-visible">
|
||||
Failed to resume the session.<br />Please reload the page.
|
||||
</p>
|
||||
</div>
|
||||
</dialog>
|
||||
@@ -1,157 +0,0 @@
|
||||
.components-reconnect-first-attempt-visible,
|
||||
.components-reconnect-repeated-attempt-visible,
|
||||
.components-reconnect-failed-visible,
|
||||
.components-pause-visible,
|
||||
.components-resume-failed-visible,
|
||||
.components-rejoining-animation {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible,
|
||||
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation,
|
||||
#components-reconnect-modal.components-reconnect-paused .components-pause-visible,
|
||||
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible,
|
||||
#components-reconnect-modal.components-reconnect-retrying,
|
||||
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible,
|
||||
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation,
|
||||
#components-reconnect-modal.components-reconnect-failed,
|
||||
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible {
|
||||
display: block;
|
||||
}
|
||||
|
||||
|
||||
#components-reconnect-modal {
|
||||
background-color: white;
|
||||
width: 20rem;
|
||||
margin: 20vh auto;
|
||||
padding: 2rem;
|
||||
border: 0;
|
||||
border-radius: 0.5rem;
|
||||
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
|
||||
opacity: 0;
|
||||
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
|
||||
animation: components-reconnect-modal-fadeOutOpacity 0.5s both;
|
||||
&[open]
|
||||
|
||||
{
|
||||
animation: components-reconnect-modal-slideUp 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity 0.5s ease-in-out 0.3s;
|
||||
animation-fill-mode: both;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#components-reconnect-modal::backdrop {
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
animation: components-reconnect-modal-fadeInOpacity 0.5s ease-in-out;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-slideUp {
|
||||
0% {
|
||||
transform: translateY(30px) scale(0.95);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-fadeInOpacity {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes components-reconnect-modal-fadeOutOpacity {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.components-reconnect-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
#components-reconnect-modal p {
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button {
|
||||
border: 0;
|
||||
background-color: #6b9ed2;
|
||||
color: white;
|
||||
padding: 4px 24px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button:hover {
|
||||
background-color: #3b6ea2;
|
||||
}
|
||||
|
||||
#components-reconnect-modal button:active {
|
||||
background-color: #6b9ed2;
|
||||
}
|
||||
|
||||
.components-rejoining-animation {
|
||||
position: relative;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.components-rejoining-animation div {
|
||||
position: absolute;
|
||||
border: 3px solid #0087ff;
|
||||
opacity: 1;
|
||||
border-radius: 50%;
|
||||
animation: components-rejoining-animation 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
|
||||
}
|
||||
|
||||
.components-rejoining-animation div:nth-child(2) {
|
||||
animation-delay: -0.5s;
|
||||
}
|
||||
|
||||
@keyframes components-rejoining-animation {
|
||||
0% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
4.9% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
5% {
|
||||
top: 40px;
|
||||
left: 40px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
// Set up event handlers
|
||||
const reconnectModal = document.getElementById("components-reconnect-modal");
|
||||
reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
|
||||
|
||||
const retryButton = document.getElementById("components-reconnect-button");
|
||||
retryButton.addEventListener("click", retry);
|
||||
|
||||
const resumeButton = document.getElementById("components-resume-button");
|
||||
resumeButton.addEventListener("click", resume);
|
||||
|
||||
function handleReconnectStateChanged(event) {
|
||||
if (event.detail.state === "show") {
|
||||
reconnectModal.showModal();
|
||||
} else if (event.detail.state === "hide") {
|
||||
reconnectModal.close();
|
||||
} else if (event.detail.state === "failed") {
|
||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
} else if (event.detail.state === "rejected") {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function retry() {
|
||||
document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
|
||||
try {
|
||||
// Reconnect will asynchronously return:
|
||||
// - true to mean success
|
||||
// - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
|
||||
// - exception to mean we didn't reach the server (this can be sync or async)
|
||||
const successful = await Blazor.reconnect();
|
||||
if (!successful) {
|
||||
// We have been able to reach the server, but the circuit is no longer available.
|
||||
// We'll reload the page so the user can continue using the app as quickly as possible.
|
||||
const resumeSuccessful = await Blazor.resumeCircuit();
|
||||
if (!resumeSuccessful) {
|
||||
location.reload();
|
||||
} else {
|
||||
reconnectModal.close();
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// We got an exception, server is currently unavailable
|
||||
document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
|
||||
}
|
||||
}
|
||||
|
||||
async function resume() {
|
||||
try {
|
||||
const successful = await Blazor.resumeCircuit();
|
||||
if (!successful) {
|
||||
location.reload();
|
||||
}
|
||||
} catch {
|
||||
location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
async function retryWhenDocumentBecomesVisible() {
|
||||
if (document.visibilityState === "visible") {
|
||||
await retry();
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
@page "/counter"
|
||||
@rendermode InteractiveServer
|
||||
|
||||
<PageTitle>Counter</PageTitle>
|
||||
|
||||
<h1>Counter</h1>
|
||||
|
||||
<p role="status">Current count: @currentCount</p>
|
||||
|
||||
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
|
||||
|
||||
@code {
|
||||
private int currentCount = 0;
|
||||
|
||||
private void IncrementCount()
|
||||
{
|
||||
currentCount++;
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
@page "/Error"
|
||||
@using System.Diagnostics
|
||||
|
||||
<PageTitle>Error</PageTitle>
|
||||
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
|
||||
@code{
|
||||
[CascadingParameter]
|
||||
private HttpContext? HttpContext { get; set; }
|
||||
|
||||
private string? RequestId { get; set; }
|
||||
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
|
||||
protected override void OnInitialized() =>
|
||||
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
@page "/"
|
||||
|
||||
<PageTitle>Home</PageTitle>
|
||||
|
||||
<h1>Hello, world!</h1>
|
||||
|
||||
Welcome to your new app.
|
||||
@@ -1,5 +0,0 @@
|
||||
@page "/not-found"
|
||||
@layout MainLayout
|
||||
|
||||
<h3>Not Found</h3>
|
||||
<p>Sorry, the content you are looking for does not exist.</p>
|
||||
@@ -1,64 +0,0 @@
|
||||
@page "/weather"
|
||||
@attribute [StreamRendering]
|
||||
|
||||
<PageTitle>Weather</PageTitle>
|
||||
|
||||
<h1>Weather</h1>
|
||||
|
||||
<p>This component demonstrates showing data.</p>
|
||||
|
||||
@if (forecasts == null)
|
||||
{
|
||||
<p><em>Loading...</em></p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date</th>
|
||||
<th aria-label="Temperature in Celsius">Temp. (C)</th>
|
||||
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
|
||||
<th>Summary</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var forecast in forecasts)
|
||||
{
|
||||
<tr>
|
||||
<td>@forecast.Date.ToShortDateString()</td>
|
||||
<td>@forecast.TemperatureC</td>
|
||||
<td>@forecast.TemperatureF</td>
|
||||
<td>@forecast.Summary</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
|
||||
@code {
|
||||
private WeatherForecast[]? forecasts;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
// Simulate asynchronous loading to demonstrate streaming rendering
|
||||
await Task.Delay(500);
|
||||
|
||||
var startDate = DateOnly.FromDateTime(DateTime.Now);
|
||||
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
|
||||
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
|
||||
{
|
||||
Date = startDate.AddDays(index),
|
||||
TemperatureC = Random.Shared.Next(-20, 55),
|
||||
Summary = summaries[Random.Shared.Next(summaries.Length)]
|
||||
}).ToArray();
|
||||
}
|
||||
|
||||
private class WeatherForecast
|
||||
{
|
||||
public DateOnly Date { get; set; }
|
||||
public int TemperatureC { get; set; }
|
||||
public string? Summary { get; set; }
|
||||
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
<Router AppAssembly="typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
|
||||
<Found Context="routeData">
|
||||
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
||||
<FocusOnNavigate RouteData="routeData" Selector="h1" />
|
||||
</Found>
|
||||
</Router>
|
||||
@@ -1,11 +0,0 @@
|
||||
@using System.Net.Http
|
||||
@using System.Net.Http.Json
|
||||
@using Microsoft.AspNetCore.Components.Forms
|
||||
@using Microsoft.AspNetCore.Components.Routing
|
||||
@using Microsoft.AspNetCore.Components.Web
|
||||
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||
@using Microsoft.JSInterop
|
||||
@using Services.Web.UI
|
||||
@using Services.Web.UI.Components
|
||||
@using Services.Web.UI.Components.Layout
|
||||
@@ -1,23 +0,0 @@
|
||||
using Services.Web.UI.Components;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddRazorComponents()
|
||||
.AddInteractiveServerComponents();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
||||
}
|
||||
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
||||
app.UseAntiforgery();
|
||||
|
||||
app.MapStaticAssets();
|
||||
app.MapRazorComponents<App>()
|
||||
.AddInteractiveServerRenderMode();
|
||||
|
||||
app.Run();
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||
"profiles": {
|
||||
"http": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5005",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v10.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v10.0": {
|
||||
"Services.Web.UI/1.0.0": {
|
||||
"runtime": {
|
||||
"Services.Web.UI.dll": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Services.Web.UI/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]
|
||||
@@ -1 +0,0 @@
|
||||
[]
|
||||
@@ -1,7 +0,0 @@
|
||||
// <auto-generated/>
|
||||
namespace Microsoft.CodeAnalysis
|
||||
{
|
||||
internal sealed partial class EmbeddedAttribute : global::System.Attribute
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
0fd3d213865069afa70276e8e0a449eeb6d9ccec5e68af262fd6217090a0beaa
|
||||
@@ -1,67 +0,0 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net10.0
|
||||
build_property.TargetFrameworkIdentifier = .NETCoreApp
|
||||
build_property.TargetFrameworkVersion = v10.0
|
||||
build_property.TargetPlatformMinVersion =
|
||||
build_property.UsingMicrosoftNETSdkWeb = true
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Services.Web.UI
|
||||
build_property.RootNamespace = Services.Web.UI
|
||||
build_property.ProjectDir = D:\_local_git\HomeOnApp\Services.Web.UI\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.RazorLangVersion = 9.0
|
||||
build_property.SupportLocalizedComponentNames =
|
||||
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = D:\_local_git\HomeOnApp\Services.Web.UI
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
build_property.EffectiveAnalysisLevelStyle = 10.0
|
||||
build_property.EnableCodeStyleSeverity =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/App.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Counter.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xDb3VudGVyLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Error.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Home.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xIb21lLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/NotFound.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xOb3RGb3VuZC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Pages/Weather.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xXZWF0aGVyLnJhem9y
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Routes.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/_Imports.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope =
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/MainLayout.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope = b-b7z843j4an
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/NavMenu.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
|
||||
build_metadata.AdditionalFiles.CssScope = b-10f9sjp7g2
|
||||
|
||||
[D:/_local_git/HomeOnApp/Services.Web.UI/Components/Layout/ReconnectModal.razor]
|
||||
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcUmVjb25uZWN0TW9kYWwucmF6b3I=
|
||||
build_metadata.AdditionalFiles.CssScope = b-qecnd4893z
|
||||
@@ -1,18 +0,0 @@
|
||||
// <auto-generated/>
|
||||
global using Microsoft.AspNetCore.Builder;
|
||||
global using Microsoft.AspNetCore.Hosting;
|
||||
global using Microsoft.AspNetCore.Http;
|
||||
global using Microsoft.AspNetCore.Routing;
|
||||
global using Microsoft.Extensions.Configuration;
|
||||
global using Microsoft.Extensions.DependencyInjection;
|
||||
global using Microsoft.Extensions.Hosting;
|
||||
global using Microsoft.Extensions.Logging;
|
||||
global using Microsoft.Extensions.Validation.Embedded;
|
||||
global using System;
|
||||
global using System.Collections.Generic;
|
||||
global using System.IO;
|
||||
global using System.Linq;
|
||||
global using System.Net.Http;
|
||||
global using System.Net.Http.Json;
|
||||
global using System.Threading;
|
||||
global using System.Threading.Tasks;
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
8b253c730d04bcc7f796b1e39e2fd9c50b082df7e5648c5755dd2bbf54d94de6
|
||||
@@ -1,86 +0,0 @@
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\appsettings.Development.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\appsettings.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.staticwebassets.runtime.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.staticwebassets.endpoints.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.exe
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.deps.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.runtimeconfig.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.dll
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\bin\Debug\net10.0\Services.Web.UI.pdb
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\EmbeddedAttribute.cs
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\ValidatableTypeAttribute.cs
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rpswa.dswa.cache.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.GeneratedMSBuildEditorConfig.editorconfig
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.AssemblyInfoInputs.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.AssemblyInfo.cs
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.csproj.CoreCompileInputs.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.MvcApplicationPartsAssemblyInfo.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjimswa.dswa.cache.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\bundle\Services.Web.UI.styles.css
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\scopedcss\projectbundle\Services.Web.UI.bundle.scp.css
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\6inyiqriln-{0}-khy4lop6wu-khy4lop6wu.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\hmbp8a9ulp-{0}-bqjiyaj88i-bqjiyaj88i.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\20jrdl7v0m-{0}-c2jlpeoesf-c2jlpeoesf.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\nxofaul20s-{0}-erw9l3u2r3-erw9l3u2r3.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\gzge0qp92n-{0}-aexeepp0ev-aexeepp0ev.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\tjyakvr08z-{0}-d7shbmvgxk-d7shbmvgxk.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\k6yguwujws-{0}-ausgxo2sd3-ausgxo2sd3.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\3xc5ijmsxl-{0}-k8d9w2qqmf-k8d9w2qqmf.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\8b10j3f4y2-{0}-cosvhxvwiu-cosvhxvwiu.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\7egys43gt0-{0}-ub07r2b239-ub07r2b239.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fmxyhv0omy-{0}-fvhpjtyr6v-fvhpjtyr6v.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\irr29ze55g-{0}-b7pk76d08c-b7pk76d08c.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\j4opn3fa2c-{0}-fsbi9cje9m-fsbi9cje9m.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\2c00zfkiuk-{0}-rzd6atqjts-rzd6atqjts.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fmr0cxw0uu-{0}-ee0r1s7dh0-ee0r1s7dh0.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\zrh7n0790h-{0}-dxx9fxp4il-dxx9fxp4il.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\fgwvpyxxm2-{0}-jd9uben2k1-jd9uben2k1.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ew009nvlkd-{0}-khv3u5hwcm-khv3u5hwcm.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\v481mp9rla-{0}-r4e9w2rdcm-r4e9w2rdcm.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\0sbw7ab88i-{0}-lcd1t2u6c8-lcd1t2u6c8.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\1dgaxq65ea-{0}-c2oey78nd0-c2oey78nd0.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\s914px96k5-{0}-tdbxkamptv-tdbxkamptv.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\vu0y7uz67w-{0}-j5mq2jizvt-j5mq2jizvt.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\p02uz3djyl-{0}-06098lyss8-06098lyss8.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\31xzmz1e90-{0}-nvvlpmu67g-nvvlpmu67g.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\bcv1xa6swt-{0}-s35ty4nyc5-s35ty4nyc5.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\nnvkmv6cxp-{0}-pj5nd1wqec-pj5nd1wqec.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\wmlzz3tays-{0}-46ein0sx1k-46ein0sx1k.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\es4n3sf9n1-{0}-v0zj4ognzu-v0zj4ognzu.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\26ribrs2gi-{0}-37tfw0ft22-37tfw0ft22.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\r9su7mfsvn-{0}-hrwsygsryq-hrwsygsryq.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\rffyskjq5s-{0}-pk9g2wxc8p-pk9g2wxc8p.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ytm89rzqdu-{0}-ft3s53vfgj-ft3s53vfgj.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\hhm818r0kj-{0}-6cfz1n2cew-6cfz1n2cew.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\alztba1cvi-{0}-6pdc2jztkx-6pdc2jztkx.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\td7yorkvlc-{0}-493y06b0oq-493y06b0oq.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\dmmaczyciw-{0}-iovd86k7lj-iovd86k7lj.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5j4tezq3pg-{0}-vr1egmr9el-vr1egmr9el.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\wkac3rph5j-{0}-kbrnm935zg-kbrnm935zg.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\1nclrf1wwj-{0}-jj8uyg4cgr-jj8uyg4cgr.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\ufdyvu9wcl-{0}-y7v9cxd14o-y7v9cxd14o.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\mp7jpy0093-{0}-notf2xhcfb-notf2xhcfb.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\vr6mh8x7t3-{0}-h1s4sie4z3-h1s4sie4z3.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\pzoqk5xx2g-{0}-63fj8s7r0e-63fj8s7r0e.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5osd3ok777-{0}-0j3bgjxly4-0j3bgjxly4.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\o3e6ljboo5-{0}-13ja33weya-13ja33weya.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\5zfzpq56du-{0}-j8lzlu28q6-j8lzlu28q6.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\rudqj3kokb-{0}-u1n4jc5v46-u1n4jc5v46.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\y4l0phloz3-{0}-x276jubixu-x276jubixu.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\compressed\669yyh6ini-{0}-x276jubixu-x276jubixu.gz
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.json.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.development.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.build.endpoints.json
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\swae.build.ex.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\staticwebassets.upToDateCheck.txt
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.dll
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\refint\Services.Web.UI.dll
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.pdb
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\Services.Web.UI.genruntimeconfig.cache
|
||||
D:\_local_git\HomeOnApp\Services.Web.UI\obj\Debug\net10.0\ref\Services.Web.UI.dll
|
||||
Binary file not shown.
@@ -1 +0,0 @@
|
||||
b31a03823e60a345a44794327c62af0180c2fd21b6380425a9542a4b8edf2592
|
||||
Binary file not shown.
@@ -1,9 +0,0 @@
|
||||
// <auto-generated/>
|
||||
namespace Microsoft.Extensions.Validation.Embedded
|
||||
{
|
||||
[global::Microsoft.CodeAnalysis.EmbeddedAttribute]
|
||||
[global::System.AttributeUsage(global::System.AttributeTargets.Class)]
|
||||
internal sealed class ValidatableTypeAttribute : global::System.Attribute
|
||||
{
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user