Добрый. Возможно я не первый, и не последний. Я достаточно не плохо знаю JS но с++ не знаю от слова совсем. 2й день в 100 строчках кода извели меня полностью. Прошу Вашего совета или решения.
В общем есть ESP8266. Надо подружить его с WIFI и Websocket. Необходим для передачи информации от автоматов( кнопок ) на комп по WebSocket.
Подружить - я подружил. Один файл .ino. К вайфаю коннектится, данные пересылает.
Сделал реализацию класса кнопки. По кнопке отрабатывает писанину в Сериал.
До сих пор не пойму зачем мне создавать класс в отдельном файле ( .h ), а Реализацию в .cpp Но скетч компилироваться без этого не хотел.
Встал вопрос о передаче информации по WebSocket. Но я никак не могду получить доступ к уже проинициализированному экземпляру класса WEBSOCKET.
Подскажите, как мне из класса Кнопки получить доступ к экземпляру класса WEBSOCKET? Даже если я его передаю как параметр при инициализации класса кнопки, объект вебсокета в объекте кнопки является пустым.
Пытался сделать SocketIO глобальным - тоже не получилось. Прошу помощи.
Ниже выкладываю свое извращение.
==WS TEST==
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ArduinoJson.h>
#include <WebSocketsClient.h>
#include <SocketIOclient.h>
#include <Hash.h>
#include <D:\INSTALL\NodeMCU\ws_test_2\btn.h>
ESP8266WiFiMulti WiFiMulti;
SocketIOclient socketIO;
#define USE_SERIAL Serial
/// КУЧА ХЛАМА ... ОН НЕ НУЖЕН ///
  unsigned long messageTimestamp = 0;
  boolean wifiLedStatus = false;
void setup() {
    USE_SERIAL.begin( 9600 );
    USE_SERIAL.setDebugOutput( true );
    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();
      for(uint8_t t = 4; t > 0; t--) {
          USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t);
          USE_SERIAL.flush();
          delay(1000);
      }
    // disable AP
    if ( WiFi.getMode() & WIFI_AP ) { WiFi.softAPdisconnect(true); }
    WiFiMulti.addAP("blablabla", "NODE.jsIsTheBest");
    while( WiFiMulti.run() != WL_CONNECTED ) { delay(100); }
    String ip = WiFi.localIP().toString();
    USE_SERIAL.printf( "[SETUP] WiFi Connected %s\n", ip.c_str() );
    socketIO.begin( "192.168.88.2", 3089, "/esp/?EIO=4" );
    socketIO.onEvent( socketIOEvent );
    USE_SERIAL.print( "SocketIO is connected:" );
    USE_SERIAL.print( socketIO.isConnected() );
}
btn inletPumpButton( 5, "INLET_PUMP", socketIO );
void loop() {
    socketIO.loop();
    uint64_t now = millis();
    if ( now - messageTimestamp > 2000 ) {
        messageTimestamp = now;
        inletPumpButton.sendEvent( "hi", "there" );
     }
}
=== btn.h ===
#include "WString.h"
#ifndef btn_h
#define btn_h
#include "Arduino.h" 
#include <ArduinoJson.h>
#include <WebSocketsClient.h>
#include <SocketIOclient.h>
class btn {
  public:
    btn( int pin, String name, SocketIOclient socketIO );
    // btn( int pin, String name );
    int getPin();
    String getName();
    void sendEvent( String event_p, String state_p );
  private: 
    int _pin;  
    String _name;
    JsonArray _signal;
    JsonObject _payload;
    JsonDocument _buttonEvent;
    String _JSON;
    SocketIOclient _socketIO;
};
#endif
=== btn.cpp ===
// LED.cpp
#include "btn.h"
#include <ArduinoJson.h>
btn::btn( int pin, String name, SocketIOclient socketIO ) {
// btn::btn( int pin, String name ) {
  _pin = pin;
  _name = name;
  _signal = _buttonEvent.to<JsonArray>();
  _signal.add( "button" );
  _payload = _signal.add<JsonObject>();
  _socketIO = socketIO;
}
int btn::getPin() {
  return _pin;
}
String btn::getName() {
  return _name;
}
void btn::sendEvent( String event_p, String state_p ) {
  _payload[ "time" ] = millis();
  serializeJson( _buttonEvent, _JSON );
  _socketIO.sendEVENT( _JSON );
  Serial.print( _socketIO.isConnected() );
  Serial.print( " :: " );
  Serial.print( _JSON );
  Serial.print( " :: " );
  Serial.print( event_p );
  Serial.print( " :: " );
  Serial.println( state_p );
}