88 enum BaudRate : uint32_t {
106 enum class EventType {
253 float thdi(
float phi = 0)
const;
276 bool operator==(
const Metrics& other)
const;
278 bool operator!=(
const Metrics& other)
const {
return !(*
this == other); }
282 void operator=(
const Metrics& other);
284#ifdef MYCILA_JSON_SUPPORT
285 void toJson(
const JsonObject& root)
const;
291 uint8_t address = MYCILA_JSY_ADDRESS_UNKNOWN;
292 uint16_t model = MYCILA_JSY_MK_UNKNOWN;
301 const Metrics& single()
const {
return _metrics[0]; }
304 const Metrics& channel1()
const {
return _metrics[0]; }
306 const Metrics& channel2()
const {
return _metrics[1]; }
308 const Metrics& channel(
size_t index)
const {
return _metrics[index]; }
311 const Metrics& phaseA()
const {
return _metrics[0]; }
313 const Metrics& phaseB()
const {
return _metrics[1]; }
315 const Metrics& phaseC()
const {
return _metrics[2]; }
317 const Metrics& phase(
size_t index)
const {
return _metrics[index]; }
323 bool operator==(
const Data& other)
const;
325 bool operator!=(
const Data& other)
const {
return !(*
this == other); }
327 void operator=(
const Data& other);
329#ifdef MYCILA_JSON_SUPPORT
330 void toJson(
const JsonObject& root)
const;
338 typedef std::function<void(EventType eventType,
const Data& data)> Callback;
357 uint8_t core = MYCILA_JSY_ASYNC_CORE,
358 uint32_t stackSize = MYCILA_JSY_ASYNC_STACK_SIZE,
359 uint32_t pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS) {
360 begin(serial, rxPin, txPin, BaudRate::UNKNOWN, MYCILA_JSY_ADDRESS_BROADCAST, MYCILA_JSY_MK_UNKNOWN, async, core, stackSize, pause);
376 void begin(HardwareSerial& serial,
379 BaudRate baudRate = BaudRate::UNKNOWN,
380 uint8_t destinationAddress = MYCILA_JSY_ADDRESS_BROADCAST,
381 uint16_t model = MYCILA_JSY_MK_UNKNOWN,
383 uint8_t core = MYCILA_JSY_ASYNC_CORE,
384 uint32_t stackSize = MYCILA_JSY_ASYNC_STACK_SIZE,
385 uint32_t pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS);
432 const char* getModelName()
const {
return getModelName(_model); }
439 static const char* getModelName(uint16_t model);
446 Mode
readMode() {
return _readMode(_destinationAddress, _model); }
462 bool setMode(Mode mode) {
return _setMode(_destinationAddress, _model, mode); }
471 bool setMode(uint8_t address, Mode mode) {
return _setMode(address,
readModel(address), mode); }
478 bool read() {
return _read(_destinationAddress, _model); }
521 bool setBaudRate(uint8_t address, BaudRate baudRate);
523#ifdef MYCILA_JSON_SUPPORT
524 void toJson(
const JsonObject& root)
const;
527 gpio_num_t getRXPin()
const {
return _pinRX; }
528 gpio_num_t getTXPin()
const {
return _pinTX; }
529 bool isEnabled()
const {
return _enabled; }
530 BaudRate getBaudRate()
const {
return _baudRate; }
538 BaudRate getMinAvailableBaudRate()
const;
539 static BaudRate getMinAvailableBaudRate(uint16_t model);
567 bool isConnected()
const {
return _data.aggregate.
frequency > 0; }
569 void setCallback(Callback callback) { _callback = std::move(callback); }
572 Callback _callback =
nullptr;
573 gpio_num_t _pinRX = GPIO_NUM_NC;
574 gpio_num_t _pinTX = GPIO_NUM_NC;
575 HardwareSerial* _serial =
nullptr;
577 TaskHandle_t _taskHandle;
579 uint32_t _pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS;
580 uint8_t _destinationAddress = MYCILA_JSY_ADDRESS_BROADCAST;
581 uint8_t _lastAddress = MYCILA_JSY_ADDRESS_UNKNOWN;
582 BaudRate _baudRate = BaudRate::UNKNOWN;
583 bool _enabled =
false;
584 uint16_t _model = MYCILA_JSY_MK_UNKNOWN;
588 uint8_t _buffer[224];
592 enum class ReadResult {
600 bool _set(uint8_t address, uint8_t newAddress, BaudRate newBaudRate);
601 bool _read(uint8_t address, uint16_t model);
602 Mode _readMode(uint8_t address, uint16_t model);
603 bool _setMode(uint8_t address, uint16_t model, Mode mode);
605 bool _canRead(uint8_t address, BaudRate baudRate);
606 ReadResult _timedRead(uint8_t expectedAddress,
size_t expectedLen, BaudRate baudRate);
607 void _send(uint8_t address,
size_t len);
609 void _openSerial(BaudRate baudRate);
610 BaudRate _detectBauds(uint8_t address);
612 static uint16_t _crc16(
const uint8_t* buffer,
size_t len);
613 static uint8_t _register8(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress, uint8_t index = 0);
614 static uint16_t _register16(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress);
615 static uint32_t _register32(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress);
616 static void _jsyTask(
void* pvParameters);
void begin(HardwareSerial &serial, int8_t rxPin, int8_t txPin, bool async, uint8_t core=MYCILA_JSY_ASYNC_CORE, uint32_t stackSize=MYCILA_JSY_ASYNC_STACK_SIZE, uint32_t pause=MYCILA_JSY_ASYNC_READ_PAUSE_MS)
Initialize the JSY with the given RX and TX pins.