87 enum BaudRate : uint32_t {
105 enum class EventType {
252 float thdi(
float phi = 0)
const;
275 bool operator==(
const Metrics& other)
const;
277 bool operator!=(
const Metrics& other)
const {
return !(*
this == other); }
281 void operator=(
const Metrics& other);
283#ifdef MYCILA_JSON_SUPPORT
284 void toJson(
const JsonObject& root)
const;
290 uint8_t address = MYCILA_JSY_ADDRESS_UNKNOWN;
291 uint16_t model = MYCILA_JSY_MK_UNKNOWN;
300 const Metrics& single()
const {
return _metrics[0]; }
303 const Metrics& channel1()
const {
return _metrics[0]; }
305 const Metrics& channel2()
const {
return _metrics[1]; }
307 const Metrics& channel(
size_t index)
const {
return _metrics[index]; }
310 const Metrics& phaseA()
const {
return _metrics[0]; }
312 const Metrics& phaseB()
const {
return _metrics[1]; }
314 const Metrics& phaseC()
const {
return _metrics[2]; }
316 const Metrics& phase(
size_t index)
const {
return _metrics[index]; }
322 bool operator==(
const Data& other)
const;
324 bool operator!=(
const Data& other)
const {
return !(*
this == other); }
326 void operator=(
const Data& other);
328#ifdef MYCILA_JSON_SUPPORT
329 void toJson(
const JsonObject& root)
const;
337 typedef std::function<void(EventType eventType,
const Data& data)> Callback;
356 uint8_t core = MYCILA_JSY_ASYNC_CORE,
357 uint32_t stackSize = MYCILA_JSY_ASYNC_STACK_SIZE,
358 uint32_t pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS) {
359 begin(serial, rxPin, txPin, BaudRate::UNKNOWN, MYCILA_JSY_ADDRESS_BROADCAST, MYCILA_JSY_MK_UNKNOWN, async, core, stackSize, pause);
375 void begin(HardwareSerial& serial,
378 BaudRate baudRate = BaudRate::UNKNOWN,
379 uint8_t destinationAddress = MYCILA_JSY_ADDRESS_BROADCAST,
380 uint16_t model = MYCILA_JSY_MK_UNKNOWN,
382 uint8_t core = MYCILA_JSY_ASYNC_CORE,
383 uint32_t stackSize = MYCILA_JSY_ASYNC_STACK_SIZE,
384 uint32_t pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS);
431 const char* getModelName()
const {
return getModelName(_model); }
438 static const char* getModelName(uint16_t model);
445 Mode
readMode() {
return _readMode(_destinationAddress, _model); }
461 bool setMode(Mode mode) {
return _setMode(_destinationAddress, _model, mode); }
470 bool setMode(uint8_t address, Mode mode) {
return _setMode(address,
readModel(address), mode); }
477 bool read() {
return _read(_destinationAddress, _model); }
520 bool setBaudRate(uint8_t address, BaudRate baudRate);
522#ifdef MYCILA_JSON_SUPPORT
523 void toJson(
const JsonObject& root)
const;
526 gpio_num_t getRXPin()
const {
return _pinRX; }
527 gpio_num_t getTXPin()
const {
return _pinTX; }
528 bool isEnabled()
const {
return _enabled; }
529 BaudRate getBaudRate()
const {
return _baudRate; }
537 BaudRate getMinAvailableBaudRate()
const;
538 static BaudRate getMinAvailableBaudRate(uint16_t model);
566 bool isConnected()
const {
return _data.aggregate.
frequency > 0; }
568 void setCallback(Callback callback) { _callback = callback; }
571 Callback _callback =
nullptr;
572 gpio_num_t _pinRX = GPIO_NUM_NC;
573 gpio_num_t _pinTX = GPIO_NUM_NC;
574 HardwareSerial* _serial =
nullptr;
576 TaskHandle_t _taskHandle;
578 uint32_t _pause = MYCILA_JSY_ASYNC_READ_PAUSE_MS;
579 uint8_t _destinationAddress = MYCILA_JSY_ADDRESS_BROADCAST;
580 uint8_t _lastAddress = MYCILA_JSY_ADDRESS_UNKNOWN;
581 BaudRate _baudRate = BaudRate::UNKNOWN;
582 bool _enabled =
false;
583 uint16_t _model = MYCILA_JSY_MK_UNKNOWN;
587 uint8_t _buffer[224];
591 enum class ReadResult {
599 bool _set(uint8_t address, uint8_t newAddress, BaudRate newBaudRate);
600 bool _read(uint8_t address, uint16_t model);
601 Mode _readMode(uint8_t address, uint16_t model);
602 bool _setMode(uint8_t address, uint16_t model, Mode mode);
604 bool _canRead(uint8_t address, BaudRate baudRate);
605 ReadResult _timedRead(uint8_t expectedAddress,
size_t expectedLen, BaudRate baudRate);
606 void _send(uint8_t address,
size_t len);
608 void _openSerial(BaudRate baudRate);
609 BaudRate _detectBauds(uint8_t address);
611 static uint16_t _crc16(
const uint8_t* buffer,
size_t len);
612 static uint8_t _register8(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress, uint8_t index = 0);
613 static uint16_t _register16(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress);
614 static uint32_t _register32(
const uint8_t* buffer, uint16_t registerStart, uint16_t registerSize, uint16_t registerAddress);
615 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.