Snapshot cc1101 component

This commit is contained in:
2025-05-18 13:01:10 +02:00
parent 2af7d37162
commit 79f531d82c
16 changed files with 3879 additions and 3 deletions
-3
View File
@@ -22,9 +22,6 @@ packages:
external_components:
# Path is relative to the main YAML file, not this device_base template!
- source: components
- source: github://pr#6300
components:
- cc1101
spi:
clk_pin: 14
+2
View File
@@ -0,0 +1,2 @@
This is a snapshot of https://github.com/esphome/esphome/pull/6300 that is
confirmed to work with our hardware.
+406
View File
@@ -0,0 +1,406 @@
from esphome import automation, pins
from esphome.automation import maybe_simple_id
import esphome.codegen as cg
from esphome.components import (
binary_sensor,
remote_base,
sensor,
spi,
text_sensor,
voltage_sampler,
)
import esphome.config_validation as cv
from esphome.const import (
CONF_CHANNEL,
CONF_CODE,
CONF_FREQUENCY,
CONF_ID,
CONF_PROTOCOL,
CONF_SENSOR,
CONF_TEMPERATURE,
CONF_WAIT_TIME,
# DEVICE_CLASS_FREQUENCY,
DEVICE_CLASS_SIGNAL_STRENGTH,
DEVICE_CLASS_TEMPERATURE,
ENTITY_CATEGORY_DIAGNOSTIC,
ICON_CHIP,
STATE_CLASS_MEASUREMENT,
UNIT_CELSIUS,
UNIT_DECIBEL_MILLIWATT,
UNIT_EMPTY,
)
CODEOWNERS = ["@gabest11"]
DEPENDENCIES = ["spi"]
AUTO_LOAD = [
"remote_base",
"voltage_sampler",
"sensor",
"binary_sensor",
"text_sensor",
"number",
"switch",
"select",
"text",
]
MULTI_CONF = True
UNIT_MEGA_HERTZ = "MHz"
UNIT_KILO_HERTZ = "kHz"
UNIT_MILLI_VOLT = "mV"
UNIT_MICRO_AMPERE = "mA"
UNIT_DECIBEL_MICRO_VOLT = "dBuV"
ns = cg.esphome_ns.namespace("cc1101")
CC1101Component = ns.class_("CC1101Component", cg.PollingComponent, spi.SPIDevice)
CONF_CC1101_ID = "cc1101_id"
CONF_GDO0_PIN = "gdo0_pin"
CONF_GDO0_ADC_ID = "gdo0_adc_id"
CONF_OUTPUT_POWER = "output_power"
CONF_RX_ATTENUATION = "rx_attenuation"
CONF_DC_BLOCKING_FILTER = "dc_blocking_filter"
# tuner
CONF_TUNER = "tuner"
# CONF_FREQUENCY = "frequency"
CONF_IF_FREQUENCY = "if_frequency"
CONF_BANDWIDTH = "bandwidth"
# CONF_CHANNEL = "channel"
CONF_CHANNEL_SPACING = "channel_spacing"
CONF_FSK_DEVIATION = "fsk_deviation"
CONF_MSK_DEVIATION = "msk_deviation"
CONF_SYMBOL_RATE = "symbol_rate"
CONF_SYNC_MODE = "sync_mode"
CONF_CARRIER_SENSE_ABOVE_THRESHOLD = "carrier_sense_above_threshold"
CONF_MODULATION = "modulation"
# agc
CONF_AGC = "agc"
CONF_MAGN_TARGET = "magn_target"
CONF_MAX_LNA_GAIN = "max_lna_gain"
CONF_MAX_DVGA_GAIN = "max_dvga_gain"
CONF_CARRIER_SENSE_ABS_THR = "carrier_sense_abs_thr"
CONF_CARRIER_SENSE_REL_THR = "carrier_sense_rel_thr"
CONF_LNA_PRIORITY = "lna_priority"
CONF_FILTER_LENGTH_FSK_MSK = "filter_length_fsk_msk"
CONF_FILTER_LENGTH_ASK_OOK = "filter_length_ask_ook"
CONF_FREEZE = "freeze"
CONF_HYST_LEVEL = "hyst_level"
# sensor
CONF_CHIP_ID = "chip_id"
CONF_RSSI = "rssi"
CONF_LQI = "lqi"
# CONF_TEMPERATURE = "temperature"
SyncMode = ns.enum("SyncMode", True)
SYNC_MODE = {
"None": SyncMode.SYNC_MODE_NONE,
"15/16": SyncMode.SYNC_MODE_15_16,
"16/16": SyncMode.SYNC_MODE_16_16,
"30/32": SyncMode.SYNC_MODE_30_32,
}
Modulation = ns.enum("Modulation", True)
MODULATION = {
"2-FSK": Modulation.MODULATION_2_FSK,
"GFSK": Modulation.MODULATION_GFSK,
"UNUSED 2": Modulation.MODULATION_UNUSED_2,
"ASK/OOK": Modulation.MODULATION_ASK_OOK,
"4-FSK": Modulation.MODULATION_4_FSK,
"UNUSED 5": Modulation.MODULATION_UNUSED_5,
"UNUSED 6": Modulation.MODULATION_UNUSED_6,
"MSK": Modulation.MODULATION_MSK,
}
RxAttenuation = ns.enum("RxAttenuation", True)
RX_ATTENUATION = {
"0dB": RxAttenuation.RX_ATTENUATION_0DB,
"6dB": RxAttenuation.RX_ATTENUATION_6DB,
"12dB": RxAttenuation.RX_ATTENUATION_12DB,
"18dB": RxAttenuation.RX_ATTENUATION_18DB,
}
MagnTarget = ns.enum("MagnTarget", True)
MAGN_TARGET = {
"24dB": MagnTarget.MAGN_TARGET_24DB,
"27dB": MagnTarget.MAGN_TARGET_27DB,
"30dB": MagnTarget.MAGN_TARGET_30DB,
"33dB": MagnTarget.MAGN_TARGET_33DB,
"36dB": MagnTarget.MAGN_TARGET_36DB,
"38dB": MagnTarget.MAGN_TARGET_38DB,
"40dB": MagnTarget.MAGN_TARGET_40DB,
"42dB": MagnTarget.MAGN_TARGET_42DB,
}
MaxLnaGain = ns.enum("MaxLnaGain", True)
MAX_LNA_GAIN = {
"Default": MaxLnaGain.MAX_LNA_GAIN_DEFAULT,
"2.6dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_2P6DB,
"6.1dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_6P1DB,
"7.4dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_7P4DB,
"9.2dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_9P2DB,
"11.5dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_11P5DB,
"14.6dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_14P6DB,
"17.1dB": MaxLnaGain.MAX_LNA_GAIN_MINUS_17P1DB,
}
MaxDvgaGain = ns.enum("MaxDvgaGain", True)
MAX_DVGA_GAIN = {
"Default": MaxDvgaGain.MAX_DVGA_GAIN_DEFAULT,
"-1": MaxDvgaGain.MAX_DVGA_GAIN_MINUS_1,
"-2": MaxDvgaGain.MAX_DVGA_GAIN_MINUS_2,
"-3": MaxDvgaGain.MAX_DVGA_GAIN_MINUS_3,
}
CarrierSenseRelThr = ns.enum("CarrierSenseRelThr", True)
CARRIER_SENSE_REL_THR = {
"Default": CarrierSenseRelThr.CARRIER_SENSE_REL_THR_DEFAULT,
"+6dB": CarrierSenseRelThr.CARRIER_SENSE_REL_THR_PLUS_6DB,
"+10dB": CarrierSenseRelThr.CARRIER_SENSE_REL_THR_PLUS_10DB,
"+14dB": CarrierSenseRelThr.CARRIER_SENSE_REL_THR_PLUS_14DB,
}
FilterLengthFskMsk = ns.enum("FilterLengthFskMsk", True)
FILTER_LENGTH_FSK_MSK = {
"8": FilterLengthFskMsk.FILTER_LENGTH_8,
"16": FilterLengthFskMsk.FILTER_LENGTH_16,
"32": FilterLengthFskMsk.FILTER_LENGTH_32,
"64": FilterLengthFskMsk.FILTER_LENGTH_64,
}
FilterLengthAskOok = ns.enum("FilterLengthAskOok", True)
FILTER_LENGTH_ASK_OOK = {
"4dB": FilterLengthAskOok.FILTER_LENGTH_4DB,
"8dB": FilterLengthAskOok.FILTER_LENGTH_8DB,
"12dB": FilterLengthAskOok.FILTER_LENGTH_12DB,
"16dB": FilterLengthAskOok.FILTER_LENGTH_16DB,
}
Freeze = ns.enum("Freeze", True)
FREEZE = {
"Default": Freeze.AGC_FREEZE_DEFAULT,
"On Sync": Freeze.AGC_FREEZE_ON_SYNC,
"Analog Only": Freeze.AGC_FREEZE_ANALOG_ONLY,
"Analog And Digital": Freeze.AGC_FREEZE_ANALOG_AND_DIGITAL,
}
WaitTime = ns.enum("WaitTime", True)
WAIT_TIME = {
"8": WaitTime.WAIT_TIME_8_SAMPLES,
"16": WaitTime.WAIT_TIME_16_SAMPLES,
"24": WaitTime.WAIT_TIME_24_SAMPLES,
"32": WaitTime.WAIT_TIME_32_SAMPLES,
}
HystLevel = ns.enum("HystLevel", True)
HYST_LEVEL = {
"None": HystLevel.HYST_LEVEL_NONE,
"Low": HystLevel.HYST_LEVEL_LOW,
"Medium": HystLevel.HYST_LEVEL_MEDIUM,
"High": HystLevel.HYST_LEVEL_HIGH,
}
TYPES = {
None: {
CONF_OUTPUT_POWER: [cv.float_range(-70, 11)],
CONF_RX_ATTENUATION: [cv.enum(RX_ATTENUATION)],
CONF_DC_BLOCKING_FILTER: [cv.boolean],
},
CONF_TUNER: {
CONF_FREQUENCY: [cv.float_range(300000, 928000)],
CONF_IF_FREQUENCY: [cv.float_range(25, 788)],
CONF_BANDWIDTH: [cv.float_range(58, 812)],
CONF_CHANNEL: [cv.uint8_t],
CONF_CHANNEL_SPACING: [cv.float_range(25, 405)],
CONF_FSK_DEVIATION: [cv.float_range(1.5, 381)],
CONF_MSK_DEVIATION: [cv.int_range(1, 8)],
CONF_SYMBOL_RATE: [cv.float_range(600, 500000)],
CONF_SYNC_MODE: [cv.enum(SYNC_MODE)],
CONF_CARRIER_SENSE_ABOVE_THRESHOLD: [cv.boolean],
CONF_MODULATION: [cv.enum(MODULATION)],
},
CONF_AGC: {
CONF_MAGN_TARGET: [cv.enum(MAGN_TARGET)],
CONF_MAX_LNA_GAIN: [cv.enum(MAX_LNA_GAIN)],
CONF_MAX_DVGA_GAIN: [cv.enum(MAX_DVGA_GAIN)],
CONF_CARRIER_SENSE_ABS_THR: [cv.int_range(-8, 7)],
CONF_CARRIER_SENSE_REL_THR: [cv.enum(CARRIER_SENSE_REL_THR)],
CONF_LNA_PRIORITY: [cv.boolean],
CONF_FILTER_LENGTH_FSK_MSK: [cv.enum(FILTER_LENGTH_FSK_MSK)],
CONF_FILTER_LENGTH_ASK_OOK: [cv.enum(FILTER_LENGTH_ASK_OOK)],
CONF_FREEZE: [cv.enum(FREEZE)],
CONF_WAIT_TIME: [cv.enum(WAIT_TIME)],
CONF_HYST_LEVEL: [cv.enum(HYST_LEVEL)],
},
CONF_SENSOR: {
CONF_CHIP_ID: [
text_sensor.text_sensor_schema(
# unit_of_measurement=UNIT_,
# accuracy_decimals=3,
# device_class=DEVICE_CLASS_,
# state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
icon=ICON_CHIP,
),
"text_sensor",
],
CONF_RSSI: [
sensor.sensor_schema(
unit_of_measurement=UNIT_DECIBEL_MILLIWATT,
accuracy_decimals=0,
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
# icon=ICON_CHIP,
),
"sensor",
],
CONF_LQI: [
sensor.sensor_schema(
unit_of_measurement=UNIT_EMPTY,
accuracy_decimals=0,
# device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
# icon=ICON_CHIP,
),
"sensor",
],
CONF_TEMPERATURE: [
sensor.sensor_schema(
unit_of_measurement=UNIT_CELSIUS,
accuracy_decimals=1,
device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
# icon=ICON_CHIP,
),
"sensor",
],
},
}
CONFIG_SCHEMA = (
cv.Schema(
{
cv.GenerateID(): cv.declare_id(CC1101Component),
cv.Optional(CONF_GDO0_PIN): cv.All(pins.internal_gpio_output_pin_schema),
cv.Optional(CONF_GDO0_ADC_ID): cv.use_id(voltage_sampler.VoltageSampler),
}
)
.extend(
{cv.Optional(k): v[0] for k, v in TYPES[None].items()},
{
cv.Optional(CONF_TUNER): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_TUNER].items()}
),
cv.Optional(CONF_AGC): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_AGC].items()}
),
cv.Optional(CONF_SENSOR): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_SENSOR].items()}
),
},
)
.extend(cv.polling_component_schema("60s"))
.extend(spi.spi_device_schema(cs_pin_required=True))
)
CC1101_COMPONENT_SCHEMA = cv.Schema(
{
cv.GenerateID(CONF_CC1101_ID): cv.use_id(CC1101Component),
}
)
async def for_each_conf(config, types, callback):
for section in types:
if section is not None and section not in config:
continue
c = config[section] if section is not None else config
for type, args in types[section].items():
if type not in c:
continue
setter = "set_"
if section is not None and section != CONF_SENSOR:
setter += section + "_"
setter += type
# print(setter + "(" + repr(c[type]) + ")")
await callback(c[type], args[1:], setter)
async def to_code(config):
var = cg.new_Pvariable(config[CONF_ID])
await cg.register_component(var, config)
await spi.register_spi_device(var, config)
if CONF_GDO0_PIN in config:
gdo0_pin = await cg.gpio_pin_expression(config[CONF_GDO0_PIN])
cg.add(var.set_config_gdo0_pin(gdo0_pin))
if CONF_GDO0_ADC_ID in config:
gdo0_adc_id = await cg.get_variable(config[CONF_GDO0_ADC_ID])
cg.add(var.set_config_gdo0_adc_pin(gdo0_adc_id))
async def set_var(c, args, setter):
if len(args) > 0:
s = None
if args[0] == "sensor":
s = await sensor.new_sensor(c)
elif args[0] == "binary_sensor":
s = await binary_sensor.new_binary_sensor(c)
elif args[0] == "text_sensor":
s = await text_sensor.new_text_sensor(c)
if s is not None:
cg.add(getattr(var, setter + "_" + args[0])(s))
else:
cg.add(getattr(var, setter)(c))
await for_each_conf(config, TYPES, set_var)
BeginTxAction = ns.class_("BeginTxAction", automation.Action)
EndTxAction = ns.class_("EndTxAction", automation.Action)
CC1101_ACTION_SCHEMA = maybe_simple_id(
{
cv.GenerateID(CONF_ID): cv.use_id(CC1101Component),
}
)
@automation.register_action("cc1101.begin_tx", BeginTxAction, CC1101_ACTION_SCHEMA)
@automation.register_action("cc1101.end_tx", EndTxAction, CC1101_ACTION_SCHEMA)
async def cc1101_action_to_code(config, action_id, template_arg, args):
var = cg.new_Pvariable(action_id, template_arg)
await cg.register_parented(var, config[CONF_ID])
return var
CC1101RawAction = ns.class_("CC1101RawAction", remote_base.RCSwitchRawAction)
CC1101_TRANSMIT_SCHEMA = (
cv.Schema(
{
cv.GenerateID(CONF_CC1101_ID): cv.use_id(CC1101Component),
}
)
.extend(remote_base.REMOTE_TRANSMITTABLE_SCHEMA)
.extend(remote_base.RC_SWITCH_RAW_SCHEMA)
.extend(remote_base.RC_SWITCH_TRANSMITTER)
)
@remote_base.register_action(
"rc_switch_raw_cc1101", CC1101RawAction, CC1101_TRANSMIT_SCHEMA
)
async def rc_switch_raw_cc1101_action(var, config, args):
proto = await cg.templatable(
config[CONF_PROTOCOL],
args,
remote_base.RCSwitchBase,
to_exp=remote_base.build_rc_switch_protocol,
)
cg.add(var.set_protocol(proto))
cg.add(var.set_code(await cg.templatable(config[CONF_CODE], args, cg.std_string)))
await cg.register_parented(var, config[CONF_CC1101_ID])
File diff suppressed because it is too large Load Diff
+125
View File
@@ -0,0 +1,125 @@
#pragma once
#include "esphome/core/component.h"
#include "esphome/core/automation.h"
#include "esphome/components/spi/spi.h"
#include "esphome/components/remote_base/rc_switch_protocol.h"
#include "esphome/components/voltage_sampler/voltage_sampler.h"
#include "esphome/components/sensor/sensor.h"
#include "esphome/components/binary_sensor/binary_sensor.h"
#include "esphome/components/text_sensor/text_sensor.h"
#include "esphome/components/number/number.h"
#include "esphome/components/switch/switch.h"
#include "esphome/components/select/select.h"
#include "esphome/components/text/text.h"
#include <string>
#include "cc1101defs.h"
#include "cc1101sub.h"
namespace esphome {
namespace cc1101 {
class CC1101Component : public PollingComponent,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1KHZ> {
public:
CC1101Component();
void set_config_gdo0_pin(InternalGPIOPin *pin) { gdo0_ = pin; }
void set_config_gdo0_adc_pin(voltage_sampler::VoltageSampler *pin) { gdo0_adc_ = pin; }
void setup() override;
void dump_config() override;
void update() override;
void loop() override;
void begin_tx();
void end_tx();
CC1101_SUB_NUMBER(output_power, float)
CC1101_SUB_SELECT(rx_attenuation, RxAttenuation)
CC1101_SUB_SWITCH(dc_blocking_filter)
// TODO: CC1101_SUB_SWITCH(manchester)
CC1101_SUB_NUMBER(tuner_frequency, float)
CC1101_SUB_NUMBER(tuner_if_frequency, float)
CC1101_SUB_NUMBER(tuner_bandwidth, float)
CC1101_SUB_NUMBER(tuner_channel, uint8_t)
CC1101_SUB_NUMBER(tuner_channel_spacing, float)
CC1101_SUB_NUMBER(tuner_fsk_deviation, float)
CC1101_SUB_NUMBER(tuner_msk_deviation, uint8_t)
CC1101_SUB_NUMBER(tuner_symbol_rate, float)
CC1101_SUB_SELECT(tuner_sync_mode, SyncMode)
CC1101_SUB_SWITCH(tuner_carrier_sense_above_threshold)
CC1101_SUB_SELECT(tuner_modulation, Modulation)
CC1101_SUB_SELECT(agc_magn_target, MagnTarget)
CC1101_SUB_SELECT(agc_max_lna_gain, MaxLnaGain)
CC1101_SUB_SELECT(agc_max_dvga_gain, MaxDvgaGain)
CC1101_SUB_NUMBER(agc_carrier_sense_abs_thr, int8_t)
CC1101_SUB_SELECT(agc_carrier_sense_rel_thr, CarrierSenseRelThr)
CC1101_SUB_SWITCH(agc_lna_priority)
CC1101_SUB_SELECT(agc_filter_length_fsk_msk, FilterLengthFskMsk)
CC1101_SUB_SELECT(agc_filter_length_ask_ook, FilterLengthAskOok)
CC1101_SUB_SELECT(agc_freeze, Freeze)
CC1101_SUB_SELECT(agc_wait_time, WaitTime)
CC1101_SUB_SELECT(agc_hyst_level, HystLevel)
CC1101_SUB_TEXT_SENSOR(chip_id)
// TODO: PARTNUM
// TODO: VERSION
CC1101_SUB_SENSOR(rssi)
CC1101_SUB_SENSOR(lqi)
// TODO: CRC OK
CC1101_SUB_SENSOR(temperature)
protected:
InternalGPIOPin *gdo0_;
voltage_sampler::VoltageSampler *gdo0_adc_;
std::string chip_id_;
bool reset_;
float output_power_requested_;
float output_power_effective_;
uint8_t pa_table_[8];
union {
struct CC1101State state_;
uint8_t regs_[sizeof(struct CC1101State) / sizeof(uint8_t)];
};
void strobe_(Command cmd);
void write_(Register reg);
void write_(Register reg, uint8_t value);
void write_(Register reg, uint8_t *buffer, size_t length);
bool read_(Register reg);
bool read_(Register reg, uint8_t *buffer, size_t length);
// bool send_data_(const uint8_t* data, size_t length);
void send_(Command cmd);
bool wait_(Command cmd);
template<class S, class T> void publish_(S *s, T state);
// template specialization here in the header is not supported by the compiler
void publish_switch_(switch_::Switch *s, bool state);
void publish_select_(select::Select *s, size_t index);
};
template<typename... Ts> class BeginTxAction : public Action<Ts...>, public Parented<CC1101Component> {
public:
void play(Ts... x) override { this->parent_->begin_tx(); }
};
template<typename... Ts> class EndTxAction : public Action<Ts...>, public Parented<CC1101Component> {
public:
void play(Ts... x) override { this->parent_->end_tx(); }
};
template<typename... Ts>
class CC1101RawAction : public remote_base::RCSwitchRawAction<Ts...>, public Parented<CC1101Component> {
protected:
void play(Ts... x) override {
this->parent_->begin_tx();
remote_base::RCSwitchRawAction<Ts...>::play(x...);
this->parent_->end_tx();
}
public:
};
} // namespace cc1101
} // namespace esphome
+693
View File
@@ -0,0 +1,693 @@
#pragma once
#include <cinttypes>
namespace esphome {
namespace cc1101 {
static constexpr float XTAL_FREQUENCY = 26000;
static constexpr float OUTPUT_POWER_MIN = -30;
static constexpr float OUTPUT_POWER_MAX = 11;
static constexpr float FREQUENCY_MIN = 300000;
static constexpr float FREQUENCY_MAX = 928000;
static constexpr float IF_FREQUENCY_MIN = 25;
static constexpr float IF_FREQUENCY_MAX = 788;
static constexpr float BANDWIDTH_MIN = 58;
static constexpr float BANDWIDTH_MAX = 812;
static constexpr uint8_t CHANNEL_MIN = 0;
static constexpr uint8_t CHANNEL_MAX = 255;
static constexpr float CHANNEL_SPACING_MIN = 25;
static constexpr float CHANNEL_SPACING_MAX = 405;
static constexpr float FSK_DEVIATION_MIN = 1.5f;
static constexpr float FSK_DEVIATION_MAX = 381;
static constexpr uint8_t MSK_DEVIATION_MIN = 1;
static constexpr uint8_t MSK_DEVIATION_MAX = 8;
static constexpr float SYMBOL_RATE_MIN = 600;
static constexpr float SYMBOL_RATE_MAX = 500000;
static constexpr int8_t CARRIER_SENSE_ABS_THR_MIN = -8;
static constexpr int8_t CARRIER_SENSE_ABS_THR_MAX = 7;
static constexpr uint8_t BUS_BURST = 0x40;
static constexpr uint8_t BUS_READ = 0x80;
static constexpr uint8_t BUS_WRITE = 0x00;
static constexpr uint8_t BYTES_IN_RXFIFO = 0x7F; // byte number in RXfifo
enum class Register : uint8_t {
IOCFG2, // GDO2 output pin configuration
IOCFG1, // GDO1 output pin configuration
IOCFG0, // GDO0 output pin configuration
FIFOTHR, // RX FIFO and TX FIFO thresholds
SYNC1, // Sync word, high INT8U
SYNC0, // Sync word, low INT8U
PKTLEN, // Packet length
PKTCTRL1, // Packet automation control
PKTCTRL0, // Packet automation control
ADDR, // Device address
CHANNR, // Channel number
FSCTRL1, // Frequency synthesizer control
FSCTRL0, // Frequency synthesizer control
FREQ2, // Frequency control word, high INT8U
FREQ1, // Frequency control word, middle INT8U
FREQ0, // Frequency control word, low INT8U
MDMCFG4, // Modem configuration
MDMCFG3, // Modem configuration
MDMCFG2, // Modem configuration
MDMCFG1, // Modem configuration
MDMCFG0, // Modem configuration
DEVIATN, // Modem deviation setting
MCSM2, // Main Radio Control State Machine configuration
MCSM1, // Main Radio Control State Machine configuration
MCSM0, // Main Radio Control State Machine configuration
FOCCFG, // Frequency Offset Compensation configuration
BSCFG, // Bit Synchronization configuration
AGCCTRL2, // AGC control
AGCCTRL1, // AGC control
AGCCTRL0, // AGC control
WOREVT1, // High INT8U Event 0 timeout
WOREVT0, // Low INT8U Event 0 timeout
WORCTRL, // Wake On Radio control
FREND1, // Front end RX configuration
FREND0, // Front end TX configuration
FSCAL3, // Frequency synthesizer calibration
FSCAL2, // Frequency synthesizer calibration
FSCAL1, // Frequency synthesizer calibration
FSCAL0, // Frequency synthesizer calibration
RCCTRL1, // RC oscillator configuration
RCCTRL0, // RC oscillator configuration
FSTEST, // Frequency synthesizer calibration control
PTEST, // Production test
AGCTEST, // AGC test
TEST2, // Various test settings
TEST1, // Various test settings
TEST0, // Various test settings
UNUSED,
PARTNUM,
VERSION,
FREQEST,
LQI,
RSSI,
MARCSTATE,
WORTIME1,
WORTIME0,
PKTSTATUS,
VCO_VC_DAC,
TXBYTES,
RXBYTES,
RCCTRL1_STATUS,
RCCTRL0_STATUS,
PATABLE,
FIFO,
};
enum class Command : uint8_t {
RES = 0x30, // Reset chip.
FSTXON, // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
// If in RX/TX: Go to a wait state where only the synthesizer is
// running (for quick RX / TX turnaround).
XOFF, // Turn off crystal oscillator.
CAL, // Calibrate frequency synthesizer and turn it off
// (enables quick start).
RX, // Enable RX. Perform calibration first if coming from IDLE and
// MCSM0.FS_AUTOCAL=1.
TX, // In IDLE state: Enable TX. Perform calibration first if
// MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
// Only go to TX if channel is clear.
IDLE, // Exit RX / TX, turn off frequency synthesizer and exit
// Wake-On-Radio mode if applicable.
AFC, // Perform AFC adjustment of the frequency synthesizer
WOR, // Start automatic RX polling sequence (Wake-on-Radio)
PWD, // Enter power down mode when CSn goes high.
FRX, // Flush the RX FIFO buffer.
FTX, // Flush the TX FIFO buffer.
WORRST, // Reset real time clock.
NOP, // No operation. May be used to pad strobe commands to two
// INT8Us for simpler software.
};
enum class State : uint8_t {
SLEEP,
IDLE,
XOFF,
VCOON_MC,
REGON_MC,
MANCAL,
VCOON,
REGON,
STARTCAL,
BWBOOST,
FS_LOCK,
IFADCON,
ENDCAL,
RX,
RX_END,
RX_RST,
TXRX_SWITCH,
RXFIFO_OVERFLOW,
FSTXON,
TX,
TX_END,
RXTX_SWITCH,
TXFIFO_UNDERFLOW,
};
enum class RxAttenuation : uint8_t {
RX_ATTENUATION_0DB,
RX_ATTENUATION_6DB,
RX_ATTENUATION_12DB,
RX_ATTENUATION_18DB,
LAST,
};
// MDMCFG2
enum class SyncMode : uint8_t {
SYNC_MODE_NONE,
SYNC_MODE_15_16,
SYNC_MODE_16_16,
SYNC_MODE_30_32,
LAST,
};
enum class Modulation : uint8_t {
MODULATION_2_FSK,
MODULATION_GFSK,
MODULATION_UNUSED_2,
MODULATION_ASK_OOK,
MODULATION_4_FSK,
MODULATION_UNUSED_5,
MODULATION_UNUSED_6,
MODULATION_MSK,
LAST,
};
// AGCCTRL2
enum class MagnTarget : uint8_t {
MAGN_TARGET_24DB,
MAGN_TARGET_27DB,
MAGN_TARGET_30DB,
MAGN_TARGET_33DB,
MAGN_TARGET_36DB,
MAGN_TARGET_38DB,
MAGN_TARGET_40DB,
MAGN_TARGET_42DB,
LAST,
};
enum class MaxLnaGain : uint8_t {
MAX_LNA_GAIN_DEFAULT,
MAX_LNA_GAIN_MINUS_2P6DB,
MAX_LNA_GAIN_MINUS_6P1DB,
MAX_LNA_GAIN_MINUS_7P4DB,
MAX_LNA_GAIN_MINUS_9P2DB,
MAX_LNA_GAIN_MINUS_11P5DB,
MAX_LNA_GAIN_MINUS_14P6DB,
MAX_LNA_GAIN_MINUS_17P1DB,
LAST,
};
enum class MaxDvgaGain : uint8_t {
MAX_DVGA_GAIN_DEFAULT,
MAX_DVGA_GAIN_MINUS_1,
MAX_DVGA_GAIN_MINUS_2,
MAX_DVGA_GAIN_MINUS_3,
LAST,
};
// AGCCTRL1
// CARRIER_SENSE_ABS_THR => number -7..+7, -8 is disabled
enum class CarrierSenseRelThr : uint8_t {
CARRIER_SENSE_REL_THR_DEFAULT,
CARRIER_SENSE_REL_THR_PLUS_6DB,
CARRIER_SENSE_REL_THR_PLUS_10DB,
CARRIER_SENSE_REL_THR_PLUS_14DB,
LAST,
};
// AGC_LNA_PRIORITY => switch
// AGCCTRL0
enum class FilterLengthFskMsk : uint8_t {
FILTER_LENGTH_8DB,
FILTER_LENGTH_16DB,
FILTER_LENGTH_32DB,
FILTER_LENGTH_64DB,
LAST,
};
enum class FilterLengthAskOok : uint8_t {
FILTER_LENGTH_4DB,
FILTER_LENGTH_8DB,
FILTER_LENGTH_12DB,
FILTER_LENGTH_16DB,
LAST,
};
enum class Freeze : uint8_t {
FREEZE_DEFAULT,
FREEZE_ON_SYNC,
FREEZE_ANALOG_ONLY,
FREEZE_ANALOG_AND_DIGITAL,
LAST,
};
enum class WaitTime : uint8_t {
WAIT_TIME_8_SAMPLES,
WAIT_TIME_16_SAMPLES,
WAIT_TIME_24_SAMPLES,
WAIT_TIME_32_SAMPLES,
LAST,
};
enum class HystLevel : uint8_t {
HYST_LEVEL_NONE,
HYST_LEVEL_LOW,
HYST_LEVEL_MEDIUM,
HYST_LEVEL_HIGH,
LAST,
};
//
struct CC1101State {
// 0x00
union {
uint8_t IOCFG2;
struct {
uint8_t GDO2_CFG : 6;
uint8_t GDO2_INV : 1;
uint8_t : 1;
};
};
// 0x01
union {
uint8_t IOCFG1;
struct {
uint8_t GDO1_CFG : 6;
uint8_t GDO1_INV : 1;
uint8_t GDO_DS : 1; // GDO, not GD0
};
};
// 0x02
union {
uint8_t IOCFG0;
struct {
uint8_t GDO0_CFG : 6;
uint8_t GDO0_INV : 1;
uint8_t TEMP_SENSOR_ENABLE : 1;
};
};
// 0x03
union {
uint8_t FIFOTHR;
struct {
uint8_t FIFO_THR : 4;
uint8_t CLOSE_IN_RX : 2; // RxAttenuation
uint8_t ADC_RETENTION : 1;
uint8_t : 1;
};
};
// 0x04
uint8_t SYNC1;
// 0x05
uint8_t SYNC0;
// 0x06
uint8_t PKTLEN;
// 0x07
union {
uint8_t PKTCTRL1;
struct {
uint8_t ADR_CHK : 2;
uint8_t APPEND_STATUS : 1;
uint8_t CRC_AUTOFLUSH : 1;
uint8_t : 1;
uint8_t PQT : 3;
};
};
// 0x08
union {
uint8_t PKTCTRL0;
struct {
uint8_t LENGTH_CONFIG : 2;
uint8_t CRC_EN : 1;
uint8_t : 1;
uint8_t PKT_FORMAT : 2;
uint8_t WHITE_DATA : 1;
uint8_t : 1;
};
};
// 0x09
uint8_t ADDR;
// 0x0A
uint8_t CHANNR;
// 0x0B
union {
uint8_t FSCTRL1;
struct {
uint8_t FREQ_IF : 5;
uint8_t RESERVED : 1; // hm?
uint8_t : 2;
};
};
// 0x0C
uint8_t FSCTRL0;
// 0x0D
uint8_t FREQ2; // [7:6] always zero
// 0x0E
uint8_t FREQ1;
// 0x0F
uint8_t FREQ0;
// 0x10
union {
uint8_t MDMCFG4;
struct {
uint8_t DRATE_E : 4;
uint8_t CHANBW_M : 2;
uint8_t CHANBW_E : 2;
};
};
// 0x11
union {
uint8_t MDMCFG3;
struct {
uint8_t DRATE_M : 8;
};
};
// 0x12
union {
uint8_t MDMCFG2;
struct {
uint8_t SYNC_MODE : 2;
uint8_t CARRIER_SENSE_ABOVE_THRESHOLD : 1;
uint8_t MANCHESTER_EN : 1;
uint8_t MOD_FORMAT : 3; // Modulation
uint8_t DEM_DCFILT_OFF : 1;
};
};
// 0x13
union {
uint8_t MDMCFG1;
struct {
uint8_t CHANSPC_E : 2;
uint8_t : 2;
uint8_t NUM_PREAMBLE : 3;
uint8_t FEC_EN : 1;
};
};
// 0x14
union {
uint8_t MDMCFG0;
struct {
uint8_t CHANSPC_M : 8;
};
};
// 0x15
union {
uint8_t DEVIATN;
struct {
uint8_t DEVIATION_M : 3;
uint8_t : 1;
uint8_t DEVIATION_E : 3;
uint8_t : 1;
};
};
// 0x16
union {
uint8_t MCSM2;
struct {
uint8_t RX_TIME : 3;
uint8_t RX_TIME_QUAL : 1;
uint8_t RX_TIME_RSSI : 1;
uint8_t : 3;
};
};
// 0x17
union {
uint8_t MCSM1;
struct {
uint8_t TXOFF_MODE : 2;
uint8_t RXOFF_MODE : 2;
uint8_t CCA_MODE : 2;
uint8_t : 2;
};
};
// 0x18
union {
uint8_t MCSM0;
struct {
uint8_t XOSC_FORCE_ON : 1;
uint8_t PIN_CTRL_EN : 1;
uint8_t PO_TIMEOUT : 2;
uint8_t FS_AUTOCAL : 2;
uint8_t : 2;
};
};
// 0x19
union {
uint8_t FOCCFG;
struct {
uint8_t FOC_LIMIT : 2;
uint8_t FOC_POST_K : 1;
uint8_t FOC_PRE_K : 2;
uint8_t FOC_BS_CS_GATE : 1;
uint8_t : 2;
};
};
// 0x1A
union {
uint8_t BSCFG;
struct {
uint8_t BS_LIMIT : 2;
uint8_t BS_POST_KP : 1;
uint8_t BS_POST_KI : 1;
uint8_t BS_PRE_KP : 2;
uint8_t BS_PRE_KI : 2;
};
};
// 0x1B
union {
uint8_t AGCCTRL2;
struct {
uint8_t MAGN_TARGET : 3; // MagnTarget
uint8_t MAX_LNA_GAIN : 3; // MaxLnaGain
uint8_t MAX_DVGA_GAIN : 2; // MaxDvgaGain
};
};
// 0x1C
union {
uint8_t AGCCTRL1;
struct {
uint8_t CARRIER_SENSE_ABS_THR : 4;
uint8_t CARRIER_SENSE_REL_THR : 2; // CarrierSenseRelThr
uint8_t AGC_LNA_PRIORITY : 1;
uint8_t : 1;
};
};
// 0x1D
union {
uint8_t AGCCTRL0;
struct {
uint8_t FILTER_LENGTH : 2; // FilterLengthFskMsk or FilterLengthAskOok
uint8_t AGC_FREEZE : 2; // Freeze
uint8_t WAIT_TIME : 2; // WaitTime
uint8_t HYST_LEVEL : 2; // HystLevel
};
};
// 0x1E
uint8_t WOREVT1;
// 0x1F
uint8_t WOREVT0;
// 0x20
union {
uint8_t WORCTRL;
struct {
uint8_t WOR_RES : 2;
uint8_t : 1;
uint8_t RC_CAL : 1;
uint8_t EVENT1 : 3;
uint8_t RC_PD : 1;
};
};
// 0x21
union {
uint8_t FREND1;
struct {
uint8_t MIX_CURRENT : 2;
uint8_t LODIV_BUF_CURRENT_RX : 2;
uint8_t LNA2MIX_CURRENT : 2;
uint8_t LNA_CURRENT : 2;
};
};
// 0x22
union {
uint8_t FREND0;
struct {
uint8_t PA_POWER : 3;
uint8_t : 1;
uint8_t LODIV_BUF_CURRENT_TX : 2;
uint8_t : 2;
};
};
// 0x23
union {
uint8_t FSCAL3;
struct {
uint8_t FSCAL3_LO : 4;
uint8_t CHP_CURR_CAL_EN : 2; // Disable charge pump calibration stage when 0.
uint8_t FSCAL3_HI : 2;
};
};
// 0x24
union {
// uint8_t FSCAL2;
struct {
uint8_t FSCAL2 : 5;
uint8_t VCO_CORE_H_EN : 1;
uint8_t : 2;
};
};
// 0x25
union {
// uint8_t FSCAL1;
struct {
uint8_t FSCAL1 : 6;
uint8_t : 2;
};
};
// 0x26
union {
// uint8_t FSCAL0;
struct {
uint8_t FSCAL0 : 7;
uint8_t : 1;
};
};
// 0x27
union {
// uint8_t RCCTRL1;
struct {
uint8_t RCCTRL1 : 7;
uint8_t : 1;
};
};
// 0x28
union {
// uint8_t RCCTRL0;
struct {
uint8_t RCCTRL0 : 7;
uint8_t : 1;
};
};
// 0x29
uint8_t FSTEST;
// 0x2A
uint8_t PTEST;
// 0x2B
uint8_t AGCTEST;
// 0x2C
uint8_t TEST2;
// 0x2D
uint8_t TEST1;
// 0x2E
union {
uint8_t TEST0;
struct {
uint8_t TEST0_LO : 1;
uint8_t VCO_SEL_CAL_EN : 1; // Enable VCO selection calibration stage when 1
uint8_t TEST0_HI : 6;
};
};
// 0x2F
uint8_t REG_2F;
// 0x30
uint8_t PARTNUM;
// 0x31
uint8_t VERSION;
// 0x32
union {
uint8_t FREQEST;
struct {
int8_t FREQOFF_EST : 8;
};
};
// 0x33
union {
uint8_t LQI;
struct {
uint8_t LQI_EST : 7;
uint8_t LQI_CRC_OK : 1;
};
};
// 0x34
int8_t RSSI;
// 0x35
union {
// uint8_t MARCSTATE;
struct {
uint8_t MARC_STATE : 5; // State
uint8_t : 3;
};
};
// 0x36
uint8_t WORTIME1;
// 0x37
uint8_t WORTIME0;
// 0x38
union {
uint8_t PKTSTATUS;
struct {
uint8_t GDO0 : 1;
uint8_t : 1;
uint8_t GDO2 : 1;
uint8_t SFD : 1;
uint8_t CCA : 1;
uint8_t PQT_REACHED : 1;
uint8_t CS : 1;
uint8_t CRC_OK : 1; // same as LQI_CRC_OK?
};
};
// 0x39
uint8_t VCO_VC_DAC;
// 0x3A
union {
uint8_t TXBYTES;
struct {
uint8_t NUM_TXBYTES : 7;
uint8_t TXFIFO_UNDERFLOW : 1;
};
};
// 0x3B
union {
uint8_t RXBYTES;
struct {
uint8_t NUM_RXBYTES : 7;
uint8_t RXFIFO_OVERFLOW : 1;
};
};
// 0x3C
union {
// uint8_t RCCTRL1_STATUS;
struct {
uint8_t RCCTRL1_STATUS : 7;
uint8_t : 1;
};
};
// 0x3D
union {
// uint8_t RCCTRL0_STATUS;
struct {
uint8_t RCCTRL0_STATUS : 7;
uint8_t : 1;
};
};
// 0x3E
uint8_t REG_3E;
// 0x3F
uint8_t REG_3F;
};
} // namespace cc1101
} // namespace esphome
+684
View File
@@ -0,0 +1,684 @@
#pragma once
#include <cinttypes>
#include <cmath>
#include <cstdio>
namespace esphome {
namespace cc1101 {
// CC1101 Design Note DN013
// The typical CC1101 output power levels and current consumption for the different PATABLE
// register settings are given in Table 1for 315 MHz, in Table 2 for 433 MHz, in Table 3 for 868
// MHz, and in Table 4 for 915 MHz. It is however not recommended to use the PATABLE
// register settings from 0x61 to 0x6F for CC1101.
struct PowerTableItem {
uint8_t value;
uint8_t dbm_diff; // starts from 12.0, diff to previous entry, scaled by 10
};
struct PowerTable {
public:
static float find(const PowerTableItem *items, size_t count, float &dbm_target) {
int dbmi = 120;
int dbmi_target = (int) std::lround(dbm_target * 10);
for (size_t i = 0; i < count; i++) {
dbmi -= items[i].dbm_diff;
if (dbmi_target >= dbmi) {
if (items[i].value >= 0x61 && items[i].value <= 0x6F)
continue; // see note in the commend above
dbm_target = (float) dbmi / 10;
return items[i].value;
}
}
dbm_target = -30;
return 0x03;
}
};
// filtered tables to save memory
// - at least 1dBm difference
// - 0x61 - 0x6F removed
// - no values below -30dBm
static const PowerTableItem PA_TABLE_315[] = {
{0xC0, 14}, // C0 10.6 -35.3 -44.4 -57.8 -53.8 -58.3 -57.2 -57.8 -56.7 28.5
{0xC3, 10}, // C3 9.6 -39.2 -45.3 -59.0 -54.2 -59.0 -57.5 -58.3 -57.2 26.2
{0xC6, 11}, // C6 8.5 -43.2 -46.3 -59.2 -54.7 -59.1 -57.7 -58.3 -57.4 24.4
{0xC9, 10}, // C9 7.5 -47.0 -47.3 -58.9 -55.0 -59.0 -57.9 -58.4 -57.5 23.0
{0x81, 12}, // 81 6.3 -49.2 -45.7 -57.3 -53.6 -59.0 -56.0 -56.5 -57.5 19.5
{0x85, 13}, // 85 5.0 -51.0 -47.2 -59.8 -54.2 -59.0 -56.9 -57.9 -58.0 18.3
{0x88, 11}, // 88 3.9 -46.6 -48.1 -60.0 -55.0 -58.9 -57.5 -58.2 -58.2 17.4
{0xCF, 11}, // CF 2.8 -49.8 -51.3 -57.6 -56.8 -59.1 -58.4 -58.1 -58.3 18.0
{0x8D, 11}, // 8D 1.7 -43.8 -49.5 -58.9 -56.3 -58.8 -58.2 -58.4 -58.5 15.8
{0x50, 10}, // 50 0.7 -59.2 -51.2 -59.0 -56.5 -59.0 -58.3 -58.3 -58.2 15.3
{0x40, 10}, // 40 -0.3 -58.2 -52.1 -59.4 -56.9 -59.0 -58.4 -58.4 -58.3 14.7
{0x3D, 10}, // 3D -1.3 -54.4 -48.4 -59.8 -57.5 -58.9 -58.3 -58.5 -58.5 19.3
{0x55, 10}, // 55 -2.3 -56.7 -53.6 -59.7 -57.5 -59.1 -58.7 -58.4 -58.4 13.7
{0x39, 11}, // 39 -3.4 -50.9 -49.5 -59.8 -58.0 -59.0 -58.5 -58.4 -58.4 16.8
{0x2B, 15}, // 2B -4.9 -51.2 -50.4 -59.9 -58.0 -58.9 -58.7 -58.3 -58.4 15.6
{0x29, 16}, // 29 -6.5 -51.8 -51.6 -59.9 -58.4 -59.0 -58.8 -58.3 -58.3 14.7
{0x28, 10}, // 28 -7.5 -52.2 -52.5 -60.0 -58.6 -59.0 -58.8 -58.2 -58.4 14.3
{0x27, 11}, // 27 -8.6 -52.9 -53.1 -60.0 -58.8 -59.1 -58.8 -58.3 -58.5 13.9
{0x26, 12}, // 26 -9.8 -53.6 -54.3 -60.1 -58.7 -59.0 -58.7 -58.4 -58.4 13.4
{0x25, 13}, // 25 -11.1 -54.3 -55.5 -60.1 -58.8 -59.1 -58.8 -58.4 -58.4 13.0
{0x33, 11}, // 33 -12.2 -55.0 -56.3 -60.0 -58.7 -59.0 -58.9 -58.4 -58.4 12.8
{0x1F, 11}, // 1F -13.3 -55.6 -57.2 -60.0 -58.8 -58.9 -58.9 -58.3 -58.4 12.4
{0x1D, 12}, // 1D -14.5 -56.0 -58.0 -60.0 -58.8 -59.1 -58.7 -58.4 -58.5 12.1
{0x32, 11}, // 32 -15.6 -56.9 -58.8 -59.9 -58.8 -59.0 -58.8 -58.3 -58.5 12.2
{0x1A, 10}, // 1A -16.6 -57.3 -59.5 -59.9 -58.8 -59.1 -58.8 -58.4 -58.4 11.8
{0x18, 19}, // 18 -18.5 -57.8 -60.3 -60.0 -58.8 -59.0 -58.9 -58.2 -58.5 11.6
{0x17, 11}, // 17 -19.6 -58.7 -60.9 -60.0 -58.7 -58.9 -58.9 -58.5 -58.4 11.4
{0x0C, 11}, // C -20.7 -59.4 -61.1 -60.0 -58.8 -59.1 -58.9 -58.4 -58.3 11.3
{0x0A, 15}, // A -22.2 -59.9 -61.9 -60.0 -58.9 -59.0 -58.9 -58.4 -58.5 11.2
{0x08, 18}, // 8 -24.0 -60.5 -62.5 -60.0 -58.7 -59.1 -58.8 -58.3 -58.5 11.1
{0x07, 11}, // 7 -25.1 -61.3 -62.9 -60.1 -58.8 -59.1 -58.8 -58.4 -58.4 11.0
{0x06, 13}, // 6 -26.4 -61.6 -63.2 -60.1 -58.7 -59.0 -58.9 -58.5 -58.5 11.0
{0x05, 13}, // 5 -27.7 -62.3 -63.4 -60.1 -58.7 -59.2 -58.8 -58.4 -58.5 10.9
{0x04, 19}, // 4 -29.6 -62.7 -63.6 -59.9 -58.7 -59.0 -58.9 -58.4 -58.4 10.8
};
static const PowerTableItem PA_TABLE_433[] = {
{0xC0, 21}, // C0 9.9 -43.4 -45.0 -53.9 -55.2 -55.8 -52.3 -55.6 29.1
{0xC3, 11}, // C3 8.8 -49.3 -45.9 -55.9 -55.4 -57.2 -52.6 -57.5 26.9
{0xC6, 10}, // C6 7.8 -56.2 -46.9 -56.9 -55.6 -58.2 -53.2 -57.9 25.2
{0xC9, 10}, // C9 6.8 -56.1 -47.9 -57.3 -55.9 -58.5 -54.0 -56.9 23.8
{0xCC, 10}, // CC 5.8 -52.8 -48.9 -57.0 -56.1 -58.4 -54.6 -56.2 22.6
{0x85, 10}, // 85 4.8 -54.2 -53.0 -58.3 -55.0 -57.8 -56.8 -58.0 19.1
{0x88, 12}, // 88 3.6 -56.2 -53.8 -58.3 -55.7 -58.1 -57.2 -58.2 18.2
{0x8B, 13}, // 8B 2.3 -57.7 -54.5 -58.0 -56.3 -58.1 -57.5 -58.2 17.3
{0x8E, 19}, // 8E 0.4 -58.0 -55.5 -57.8 -57.4 -58.2 -58.1 -58.4 16.2
{0x40, 12}, // 40 -0.8 -59.7 -56.1 -58.2 -57.7 -58.4 -58.3 -58.2 15.4
{0x3C, 13}, // 3C -2.1 -60.6 -57.3 -58.2 -58.0 -58.5 -58.4 -58.5 19.3
{0x3A, 10}, // 3A -3.1 -59.5 -57.5 -58.3 -58.3 -58.6 -58.1 -58.6 18.1
{0x8F, 15}, // 8F -4.6 -52.2 -57.7 -58.1 -58.8 -58.4 -58.7 -58.3 14.4
{0x37, 10}, // 37 -5.6 -56.8 -58.3 -58.3 -58.8 -58.4 -58.5 -58.4 16.2
{0x36, 12}, // 36 -6.8 -56.8 -58.9 -58.3 -58.8 -58.3 -58.5 -58.5 15.6
{0x28, 10}, // 28 -7.8 -56.6 -59.0 -58.2 -59.0 -58.4 -58.5 -58.4 15.1
{0x26, 21}, // 26 -9.9 -57.0 -59.4 -58.3 -59.0 -58.4 -58.7 -58.4 14.3
{0x25, 15}, // 25 -11.4 -57.3 -59.7 -58.4 -59.0 -58.3 -58.7 -58.5 13.9
{0x24, 19}, // 24 -13.3 -57.9 -59.9 -58.2 -59.0 -58.6 -58.7 -58.5 13.5
{0x1E, 10}, // 1E -14.3 -58.4 -59.8 -58.2 -59.0 -58.4 -58.6 -58.6 13.2
{0x1C, 12}, // 1C -15.5 -58.6 -59.9 -58.4 -58.8 -58.6 -58.8 -58.5 12.9
{0x1A, 15}, // 1A -17.0 -59.4 -59.9 -58.3 -59.1 -58.5 -58.7 -58.4 12.7
{0x18, 18}, // 18 -18.8 -60.2 -59.9 -58.2 -59.0 -58.5 -58.7 -58.6 12.5
{0x17, 10}, // 17 -19.8 -60.6 -59.9 -58.2 -58.9 -58.4 -58.7 -58.4 12.4
{0x0C, 12}, // C -21.0 -61.1 -59.9 -58.4 -59.0 -58.5 -58.7 -58.6 12.3
{0x15, 15}, // 15 -22.5 -61.7 -60.0 -58.2 -59.1 -58.3 -58.6 -58.7 12.2
{0x08, 18}, // 8 -24.3 -62.3 -59.9 -58.3 -59.0 -58.4 -58.8 -58.5 12.1
{0x07, 10}, // 7 -25.3 -62.6 -59.9 -58.2 -59.0 -58.6 -58.7 -58.5 12.0
{0x06, 12}, // 6 -26.5 -63.2 -59.9 -58.3 -58.9 -58.5 -58.6 -58.6 12.0
{0x05, 14}, // 5 -27.9 -63.5 -59.8 -58.3 -59.1 -58.5 -58.7 -58.4 11.9
{0x04, 16}, // 4 -29.5 -63.7 -59.9 -58.3 -58.9 -58.5 -58.5 -58.5 11.9
};
static const PowerTableItem PA_TABLE_868[] = {
{0xC0, 13}, // C0 10.7 -35.1 -58.6 -58.6 -57.5 -50.0 34.2
{0xC3, 11}, // C3 9.6 -41.5 -58.5 -58.3 -57.4 -54.4 31.6
{0xC6, 11}, // C6 8.5 -47.7 -58.5 -58.3 -57.6 -55.0 29.5
{0xC9, 10}, // C9 7.5 -44.4 -58.5 -58.5 -57.7 -53.6 27.8
{0xCC, 10}, // CC 6.5 -40.6 -58.6 -58.4 -57.6 -52.5 26.3
{0xCE, 10}, // CE 5.5 -38.5 -58.5 -58.4 -57.8 -52.2 25.0
{0x84, 11}, // 84 4.4 -35.3 -58.7 -58.5 -57.8 -55.8 20.3
{0x87, 10}, // 87 3.4 -39.4 -58.6 -58.6 -57.8 -55.7 19.5
{0xCF, 10}, // CF 2.4 -36.6 -58.6 -58.4 -57.7 -53.6 22.0
{0x8C, 13}, // 8C 1.1 -50.2 -58.6 -58.5 -57.7 -55.9 17.9
{0x50, 14}, // 50 -0.3 -42.1 -58.5 -58.5 -57.6 -57.1 16.9
{0x40, 12}, // 40 -1.5 -43.2 -58.5 -58.7 -57.7 -57.2 16.1
{0x3F, 11}, // 3F -2.6 -53.7 -58.6 -58.5 -57.8 -57.5 21.4
{0x55, 10}, // 55 -3.6 -44.9 -58.6 -58.4 -57.8 -57.5 15.0
{0x57, 12}, // 57 -4.8 -46.0 -58.6 -58.5 -57.6 -57.4 14.5
{0x8F, 12}, // 8F -6.0 -51.6 -58.5 -58.6 -57.7 -57.1 15.0
{0x2A, 14}, // 2A -7.4 -49.3 -58.5 -58.6 -57.7 -57.4 16.2
{0x28, 16}, // 28 -9.0 -49.0 -58.5 -58.6 -57.7 -57.4 15.4
{0x26, 20}, // 26 -11.0 -49.2 -58.5 -58.5 -57.7 -57.4 14.6
{0x25, 15}, // 25 -12.5 -49.5 -58.6 -58.6 -57.8 -57.3 14.1
{0x24, 18}, // 24 -14.3 -50.2 -58.5 -58.4 -57.8 -57.4 13.7
{0x1D, 14}, // 1D -15.7 -50.7 -58.6 -58.6 -57.8 -57.5 13.3
{0x1B, 13}, // 1B -17.0 -51.3 -58.5 -58.4 -57.7 -57.5 13.1
{0x19, 16}, // 19 -18.6 -52.0 -58.6 -58.5 -57.8 -57.5 12.9
{0x22, 10}, // 22 -19.6 -52.5 -58.5 -58.6 -57.7 -57.4 12.9
{0x0D, 15}, // D -21.1 -53.3 -58.6 -58.6 -57.8 -57.4 12.6
{0x0B, 12}, // B -22.3 -53.9 -58.6 -58.5 -57.8 -57.4 12.5
{0x09, 15}, // 9 -23.8 -54.7 -58.5 -58.5 -57.8 -57.5 12.4
{0x21, 10}, // 21 -24.8 -55.1 -58.5 -58.5 -57.7 -57.5 12.5
{0x13, 17}, // 13 -26.5 -55.9 -58.6 -58.5 -57.6 -57.6 12.3
{0x05, 12}, // 5 -27.7 -56.4 -58.4 -58.4 -57.7 -57.5 12.2
{0x12, 12}, // 12 -28.9 -57.1 -58.4 -58.5 -57.7 -57.3 12.2
};
static const PowerTableItem PA_TABLE_915[] = {
{0xC0, 26}, // C0 9.4 -33.5 -58.5 -58.4 -55.8 -32.6 31.8
{0xC3, 11}, // C3 8.3 -41.5 -58.6 -58.4 -56.3 -38.0 29.3
{0xC6, 11}, // C6 7.2 -42.5 -58.5 -58.4 -56.7 -40.5 27.4
{0xC9, 10}, // C9 6.2 -37.6 -58.6 -58.4 -57.2 -38.8 25.9
{0xCD, 12}, // CD 5.0 -34.2 -58.6 -58.5 -57.5 -37.3 24.3
{0x84, 11}, // 84 3.9 -32.0 -58.6 -58.4 -57.7 -40.1 19.7
{0x87, 10}, // 87 2.9 -36.5 -58.4 -58.5 -57.7 -39.6 18.9
{0x8A, 11}, // 8A 1.8 -42.2 -58.5 -58.4 -57.7 -39.6 18.1
{0x8D, 13}, // 8D 0.5 -46.8 -58.5 -58.5 -57.7 -40.4 17.3
{0x8E, 11}, // 8E -0.6 -46.6 -58.5 -58.5 -57.8 -41.1 16.7
{0x51, 10}, // 51 -1.6 -38.7 -58.4 -58.5 -57.7 -46.9 16.0
{0x3E, 11}, // 3E -2.7 -50.0 -58.5 -58.4 -57.6 -55.3 20.7
{0x3B, 11}, // 3B -3.8 -50.7 -58.6 -58.4 -57.6 -55.2 18.9
{0x39, 13}, // 39 -5.1 -50.0 -58.5 -58.5 -57.6 -54.0 17.7
{0x2B, 13}, // 2B -6.4 -47.6 -58.4 -58.4 -57.8 -52.1 16.5
{0x36, 15}, // 36 -7.9 -46.9 -58.5 -58.4 -57.7 -51.2 15.8
{0x35, 14}, // 35 -9.3 -46.7 -58.6 -58.4 -57.7 -50.7 15.2
{0x26, 16}, // 26 -10.9 -47.0 -58.6 -58.4 -57.8 -50.9 14.5
{0x25, 14}, // 25 -12.3 -47.2 -58.6 -58.3 -57.7 -51.0 14.1
{0x24, 18}, // 24 -14.1 -48.1 -58.4 -58.4 -57.8 -51.4 13.7
{0x1D, 14}, // 1D -15.5 -48.7 -58.4 -58.5 -57.7 -51.9 13.2
{0x1B, 13}, // 1B -16.8 -49.3 -58.6 -58.4 -57.8 -52.3 13.0
{0x19, 15}, // 19 -18.3 -50.2 -58.5 -58.5 -57.6 -52.8 12.8
{0x18, 10}, // 18 -19.3 -50.6 -58.5 -58.5 -57.7 -53.1 12.7
{0x17, 10}, // 17 -20.3 -51.2 -58.6 -58.5 -57.8 -53.1 12.6
{0x0C, 11}, // C -21.4 -51.8 -58.4 -58.5 -57.7 -53.4 12.5
{0x0A, 13}, // A -22.7 -52.6 -58.5 -58.4 -57.7 -53.6 12.4
{0x08, 16}, // 8 -24.3 -53.6 -58.4 -58.4 -57.6 -54.1 12.3
{0x13, 19}, // 13 -26.2 -54.6 -58.4 -58.5 -57.7 -54.3 12.2
{0x05, 11}, // 5 -27.3 -55.3 -58.4 -58.4 -57.8 -54.5 12.1
{0x12, 13}, // 12 -28.6 -55.9 -58.6 -58.5 -57.7 -54.7 12.1
{0x03, 12}, // 3 -29.8 -56.9 -58.5 -58.4 -57.7 -54.7 12.0
};
/*
static const PowerTableItem PA_TABLE_315_FULL[] = {
{0xC0, 4}, // C0 10.6 -35.3 -44.4 -57.8 -53.8 -58.3 -57.2 -57.8 -56.7 28.5
{0xC1, 2}, // C1 10.3 -36.6 -44.7 -58.4 -54.0 -58.5 -57.4 -58.0 -56.8 27.6
{0xC2, 4}, // C2 9.9 -37.8 -45.0 -58.8 -54.1 -59.0 -57.3 -58.3 -56.9 26.9
{0xC3, 3}, // C3 9.6 -39.2 -45.3 -59.0 -54.2 -59.0 -57.5 -58.3 -57.2 26.2
{0xC4, 4}, // C4 9.2 -40.5 -45.7 -59.1 -54.5 -58.9 -57.5 -58.4 -57.2 25.6
{0xC5, 3}, // C5 8.8 -41.9 -46.0 -59.2 -54.6 -58.9 -57.6 -58.4 -57.3 25.0
{0xC6, 3}, // C6 8.5 -43.2 -46.3 -59.2 -54.7 -59.1 -57.7 -58.3 -57.4 24.4
{0xC7, 3}, // C7 8.2 -44.5 -46.6 -59.2 -55.0 -59.1 -57.9 -58.3 -57.3 23.9
{0xC8, 2}, // C8 7.9 -45.7 -47.0 -59.1 -55.0 -59.1 -57.9 -58.4 -57.3 23.4
{0xC9, 4}, // C9 7.5 -47.0 -47.3 -58.9 -55.0 -59.0 -57.9 -58.4 -57.5 23.0
{0xCA, 2}, // CA 7.2 -48.0 -47.7 -58.8 -55.0 -59.0 -57.8 -58.4 -57.7 22.5
{0xCB, 2}, // CB 6.9 -49.1 -47.9 -58.7 -55.4 -58.9 -58.1 -58.3 -57.6 22.1
{0xCC, 3}, // CC 6.6 -50.0 -48.3 -58.7 -55.3 -59.0 -58.1 -58.4 -57.8 21.7
{0x80, 0}, // 80 6.6 -46.9 -45.4 -56.3 -53.7 -59.0 -55.8 -56.3 -57.5 19.8
{0x81, 2}, // 81 6.3 -49.2 -45.7 -57.3 -53.6 -59.0 -56.0 -56.5 -57.5 19.5
{0xCD, 0}, // CD 6.3 -50.9 -48.6 -58.4 -55.5 -58.9 -58.0 -58.1 -57.8 21.3
{0x82, 2}, // 82 6.0 -52.0 -46.2 -58.1 -53.8 -58.9 -56.4 -57.1 -57.7 19.2
{0x83, 2}, // 83 5.8 -53.7 -46.5 -58.7 -53.8 -59.0 -56.6 -57.3 -57.8 18.9
{0xCE, 2}, // CE 5.6 -51.9 -49.2 -58.2 -55.5 -58.9 -58.1 -58.3 -57.9 20.6
{0x84, 1}, // 84 5.4 -53.0 -46.8 -59.5 -54.0 -59.0 -56.9 -57.5 -57.8 18.6
{0x85, 4}, // 85 5.0 -51.0 -47.2 -59.8 -54.2 -59.0 -56.9 -57.9 -58.0 18.3
{0x86, 2}, // 86 4.7 -49.3 -47.5 -60.0 -54.4 -59.0 -57.1 -58.0 -58.1 18.0
{0x87, 4}, // 87 4.3 -47.8 -47.8 -60.0 -54.6 -59.0 -57.2 -58.2 -58.1 17.7
{0x88, 3}, // 88 3.9 -46.6 -48.1 -60.0 -55.0 -58.9 -57.5 -58.2 -58.2 17.4
{0x89, 3}, // 89 3.5 -45.8 -48.4 -59.9 -55.2 -58.9 -57.7 -58.3 -58.3 17.0
{0x8A, 3}, // 8A 3.1 -45.0 -48.7 -59.9 -55.3 -59.0 -57.8 -58.2 -58.3 16.7
{0xCF, 3}, // CF 2.8 -49.8 -51.3 -57.6 -56.8 -59.1 -58.4 -58.1 -58.3 18.0
{0x8B, 0}, // 8B 2.7 -44.5 -48.9 -59.6 -55.8 -58.9 -57.7 -58.5 -58.3 16.4
{0x8C, 5}, // 8C 2.2 -44.1 -49.2 -59.0 -56.1 -58.9 -57.9 -58.3 -58.4 16.1
{0x8D, 5}, // 8D 1.7 -43.8 -49.5 -58.9 -56.3 -58.8 -58.2 -58.4 -58.5 15.8
{0x50, 10}, // 50 0.7 -59.2 -51.2 -59.0 -56.5 -59.0 -58.3 -58.3 -58.2 15.3
{0x8E, 0}, // 8E 0.6 -43.7 -50.0 -58.7 -56.7 -58.9 -58.3 -58.3 -58.5 15.2
{0x60, 0}, // 60 0.5 -59.9 -51.3 -59.0 -56.6 -59.1 -58.2 -58.4 -58.4 15.2
{0x51, 4}, // 51 0.1 -58.9 -51.6 -59.2 -56.8 -59.0 -58.4 -58.5 -58.4 15.0
{0x61, 2}, // 61 -0.1 -59.3 -51.7 -59.2 -56.7 -59.0 -58.5 -58.4 -58.4 14.8
{0x40, 1}, // 40 -0.3 -58.2 -52.1 -59.4 -56.9 -59.0 -58.4 -58.4 -58.3 14.7
{0x52, 2}, // 52 -0.5 -58.2 -52.1 -59.3 -56.7 -58.8 -58.4 -58.4 -58.5 14.6
{0x62, 1}, // 62 -0.7 -58.8 -52.3 -59.3 -57.0 -59.0 -58.4 -58.4 -58.3 14.5
{0x3F, 1}, // 3F -0.8 -57.0 -48.3 -59.9 -57.3 -59.1 -58.3 -58.4 -58.5 20.5
{0x3E, 1}, // 3E -1.0 -55.9 -48.4 -59.8 -57.4 -59.1 -58.4 -58.5 -58.3 19.9
{0x53, 1}, // 53 -1.1 -57.6 -52.7 -59.3 -57.1 -59.1 -58.6 -58.4 -58.4 14.3
{0x3D, 1}, // 3D -1.3 -54.4 -48.4 -59.8 -57.5 -58.9 -58.3 -58.5 -58.5 19.3
{0x63, 0}, // 63 -1.3 -58.0 -52.8 -59.5 -57.3 -59.1 -58.5 -58.3 -58.4 14.2
{0x3C, 3}, // 3C -1.7 -53.2 -48.6 -59.9 -57.6 -59.0 -58.4 -58.4 -58.5 18.6
{0x54, 0}, // 54 -1.7 -57.2 -53.2 -59.3 -57.3 -59.0 -58.5 -58.3 -58.4 14.0
{0x64, 1}, // 64 -1.9 -57.4 -53.3 -59.5 -57.4 -59.0 -58.5 -58.2 -58.3 13.9
{0x3B, 2}, // 3B -2.1 -52.2 -48.7 -59.8 -57.7 -59.2 -58.5 -58.4 -58.5 18.0
{0x55, 1}, // 55 -2.3 -56.7 -53.6 -59.7 -57.5 -59.1 -58.7 -58.4 -58.4 13.7
{0x65, 2}, // 65 -2.5 -57.1 -53.7 -59.7 -57.7 -59.0 -58.7 -58.4 -58.4 13.7
{0x2F, 1}, // 2F -2.6 -51.5 -48.7 -60.0 -57.9 -59.0 -58.4 -58.3 -58.3 17.3
{0x3A, 1}, // 3A -2.7 -51.4 -49.1 -59.8 -57.8 -59.1 -58.5 -58.4 -58.4 17.4
{0x56, 2}, // 56 -3.0 -56.6 -54.1 -59.7 -57.7 -58.9 -58.8 -58.4 -58.5 13.5
{0x2E, 1}, // 2E -3.1 -51.3 -49.1 -60.0 -57.9 -59.0 -58.6 -58.3 -58.4 16.9
{0x66, 0}, // 66 -3.1 -56.9 -54.3 -59.7 -57.8 -58.9 -58.8 -58.4 -58.4 13.4
{0x39, 2}, // 39 -3.4 -50.9 -49.5 -59.8 -58.0 -59.0 -58.5 -58.4 -58.4 16.8
{0x57, 1}, // 57 -3.5 -56.6 -54.4 -59.8 -57.9 -59.0 -58.7 -58.3 -58.4 13.3
{0x2D, 1}, // 2D -3.6 -51.1 -49.4 -60.0 -58.1 -59.1 -58.6 -58.5 -58.4 16.4
{0x67, 1}, // 67 -3.7 -56.8 -54.7 -59.9 -58.0 -59.0 -58.8 -58.4 -58.3 13.2
{0x8F, 5}, // 8F -4.2 -45.9 -52.6 -58.4 -58.5 -59.0 -58.8 -58.3 -58.6 13.3
{0x2C, 0}, // 2C -4.2 -51.0 -49.8 -60.0 -58.0 -59.0 -58.6 -58.4 -58.4 16.0
{0x38, 0}, // 38 -4.3 -50.7 -50.2 -59.8 -58.0 -59.0 -58.6 -58.3 -58.5 16.1
{0x68, 0}, // 68 -4.3 -56.9 -55.1 -59.7 -58.0 -59.0 -58.9 -58.5 -58.5 13.0
{0x2B, 6}, // 2B -4.9 -51.2 -50.4 -59.9 -58.0 -58.9 -58.7 -58.3 -58.4 15.6
{0x69, 0}, // 69 -4.9 -56.9 -55.5 -59.9 -58.3 -59.1 -58.9 -58.3 -58.5 12.8
{0x37, 5}, // 37 -5.4 -51.3 -50.5 -60.0 -58.3 -59.1 -58.7 -58.4 -58.4 15.4
{0x6A, 0}, // 6A -5.5 -56.9 -56.1 -59.8 -58.3 -59.0 -58.8 -58.4 -58.5 12.6
{0x2A, 2}, // 2A -5.7 -51.5 -51.1 -60.0 -58.4 -59.1 -58.7 -58.3 -58.6 15.2
{0x6B, 3}, // 6B -6.1 -57.0 -56.5 -59.9 -58.5 -59.0 -58.9 -58.3 -58.6 12.5
{0x29, 4}, // 29 -6.5 -51.8 -51.6 -59.9 -58.4 -59.0 -58.8 -58.3 -58.3 14.7
{0x6C, 2}, // 6C -6.7 -57.0 -57.0 -59.9 -58.5 -59.1 -58.9 -58.5 -58.4 12.3
{0x36, 0}, // 36 -6.7 -51.9 -51.5 -60.0 -58.2 -59.0 -58.8 -58.4 -58.4 14.7
{0x6D, 5}, // 6D -7.2 -57.3 -57.1 -60.0 -58.6 -58.9 -58.8 -58.4 -58.3 12.2
{0x28, 2}, // 28 -7.5 -52.2 -52.5 -60.0 -58.6 -59.0 -58.8 -58.2 -58.4 14.3
{0x35, 5}, // 35 -8.1 -52.7 -52.7 -60.0 -58.7 -59.0 -58.9 -58.3 -58.5 14.1
{0x6E, 3}, // 6E -8.4 -58.0 -57.9 -60.0 -58.6 -59.1 -58.9 -58.3 -58.5 11.9
{0x27, 1}, // 27 -8.6 -52.9 -53.1 -60.0 -58.8 -59.1 -58.8 -58.3 -58.5 13.9
{0x26, 12}, // 26 -9.8 -53.6 -54.3 -60.1 -58.7 -59.0 -58.7 -58.4 -58.4 13.4
{0x34, 0}, // 34 -9.9 -53.7 -54.4 -59.9 -58.8 -59.0 -58.7 -58.3 -58.4 13.5
{0x25, 11}, // 25 -11.1 -54.3 -55.5 -60.1 -58.8 -59.1 -58.8 -58.4 -58.4 13.0
{0x33, 10}, // 33 -12.2 -55.0 -56.3 -60.0 -58.7 -59.0 -58.9 -58.4 -58.4 12.8
{0x24, 8}, // 24 -13.0 -55.4 -56.9 -60.1 -58.7 -59.1 -59.0 -58.3 -58.5 12.6
{0x6F, 1}, // 6F -13.2 -58.3 -60.7 -59.8 -58.7 -59.1 -58.9 -58.3 -58.5 11.2
{0x1F, 1}, // 1F -13.3 -55.6 -57.2 -60.0 -58.8 -58.9 -58.9 -58.3 -58.4 12.4
{0x1E, 5}, // 1E -13.9 -55.8 -57.4 -60.0 -58.6 -59.1 -58.9 -58.4 -58.5 12.2
{0x1D, 5}, // 1D -14.5 -56.0 -58.0 -60.0 -58.8 -59.1 -58.7 -58.4 -58.5 12.1
{0x1C, 6}, // 1C -15.2 -56.3 -58.3 -60.1 -58.9 -58.9 -58.8 -58.3 -58.4 12.0
{0x23, 2}, // 23 -15.4 -56.8 -58.3 -60.1 -58.7 -59.0 -58.8 -58.3 -58.5 12.1
{0x32, 1}, // 32 -15.6 -56.9 -58.8 -59.9 -58.8 -59.0 -58.8 -58.3 -58.5 12.2
{0x1B, 3}, // 1B -15.9 -56.8 -58.9 -60.0 -58.8 -59.1 -58.7 -58.5 -58.5 11.9
{0x1A, 7}, // 1A -16.6 -57.3 -59.5 -59.9 -58.8 -59.1 -58.8 -58.4 -58.4 11.8
{0x19, 8}, // 19 -17.5 -57.5 -59.6 -60.0 -58.7 -59.0 -58.9 -58.3 -58.5 11.7
{0x18, 10}, // 18 -18.5 -57.8 -60.3 -60.0 -58.8 -59.0 -58.9 -58.2 -58.5 11.6
{0x22, 3}, // 22 -18.8 -58.4 -60.6 -59.9 -58.7 -59.1 -58.9 -58.5 -58.5 11.7
{0x0F, 0}, // F -18.8 -58.3 -60.5 -59.8 -58.7 -59.1 -58.9 -58.2 -58.4 11.5
{0x0E, 5}, // E -19.4 -58.6 -60.9 -59.9 -58.6 -58.9 -58.9 -58.3 -58.5 11.4
{0x17, 2}, // 17 -19.6 -58.7 -60.9 -60.0 -58.7 -58.9 -58.9 -58.5 -58.4 11.4
{0x0D, 3}, // D -20.0 -58.8 -61.0 -60.0 -58.8 -59.0 -58.8 -58.5 -58.4 11.4
{0x0C, 6}, // C -20.7 -59.4 -61.1 -60.0 -58.8 -59.1 -58.9 -58.4 -58.3 11.3
{0x16, 1}, // 16 -20.9 -59.4 -61.4 -59.9 -58.8 -59.1 -58.9 -58.4 -58.3 11.3
{0x31, 4}, // 31 -21.3 -59.2 -61.5 -60.0 -58.6 -59.1 -58.9 -58.3 -58.5 11.5
{0x0B, 0}, // B -21.4 -59.3 -61.8 -60.0 -58.8 -58.9 -58.9 -58.4 -58.5 11.3
{0x0A, 8}, // A -22.2 -59.9 -61.9 -60.0 -58.9 -59.0 -58.9 -58.4 -58.5 11.2
{0x15, 1}, // 15 -22.4 -59.9 -62.3 -60.1 -58.6 -59.1 -59.1 -58.3 -58.4 11.2
{0x09, 6}, // 9 -23.0 -60.3 -62.0 -59.9 -58.7 -59.0 -58.8 -58.4 -58.5 11.1
{0x08, 10}, // 8 -24.0 -60.5 -62.5 -60.0 -58.7 -59.1 -58.8 -58.3 -58.5 11.1
{0x14, 3}, // 14 -24.3 -60.6 -62.7 -60.0 -58.9 -59.2 -58.9 -58.2 -58.4 11.1
{0x21, 1}, // 21 -24.5 -60.7 -62.4 -59.9 -58.9 -58.9 -58.8 -58.3 -58.5 11.2
{0x07, 6}, // 7 -25.1 -61.3 -62.9 -60.1 -58.8 -59.1 -58.8 -58.4 -58.4 11.0
{0x06, 12}, // 6 -26.4 -61.6 -63.2 -60.1 -58.7 -59.0 -58.9 -58.5 -58.5 11.0
{0x13, 2}, // 13 -26.6 -61.8 -63.1 -59.9 -58.7 -59.1 -58.8 -58.4 -58.6 11.0
{0x05, 10}, // 5 -27.7 -62.3 -63.4 -60.1 -58.7 -59.2 -58.8 -58.4 -58.5 10.9
{0x04, 19}, // 4 -29.6 -62.7 -63.6 -59.9 -58.7 -59.0 -58.9 -58.4 -58.4 10.8
{0x12, 1}, // 12 -29.8 -62.8 -63.5 -60.0 -58.7 -59.1 -58.8 -58.3 -58.6 10.9
{0x03, 18}, // 3 -31.7 -63.4 -63.9 -60.1 -58.8 -59.1 -58.7 -58.3 -58.5 10.8
{0x02, 29}, // 2 -34.6 -64.0 -64.0 -59.9 -58.7 -58.9 -58.8 -58.4 -58.6 10.7
{0x11, 0}, // 11 -34.6 -64.0 -64.0 -59.9 -58.7 -59.0 -58.9 -58.3 -58.4 10.8
{0x01, 36}, // 1 -38.3 -64.9 -63.9 -60.0 -58.9 -58.9 -58.9 -58.4 -58.5 10.7
{0x10, 29}, // 10 -41.2 -65.3 -64.0 -59.9 -58.6 -59.0 -58.9 -58.4 -58.5 10.6
{0x30, 0}, // 30 -41.3 -65.5 -63.9 -60.0 -58.7 -59.1 -58.8 -58.4 -58.6 10.9
{0x20, 0}, // 20 -41.3 -65.3 -64.0 -60.1 -58.8 -59.1 -58.9 -58.4 -58.3 10.8
{0x00, 225}, // 0 -63.8 -65.4 -64.0 -59.9 -58.9 -58.9 -58.8 -58.3 -58.5 10.3
};
static const PowerTableItem PA_TABLE_433_FULL[] = {
{0xC0, 10}, // C0 9.9 -43.4 -45.0 -53.9 -55.2 -55.8 -52.3 -55.6 29.1
{0xC1, 4}, // C1 9.5 -45.2 -45.3 -54.6 -55.2 -56.5 -52.5 -56.5 28.3
{0xC2, 3}, // C2 9.2 -47.1 -45.5 -55.2 -55.1 -56.9 -52.4 -57.1 27.6
{0xC3, 3}, // C3 8.8 -49.3 -45.9 -55.9 -55.4 -57.2 -52.6 -57.5 26.9
{0xC4, 3}, // C4 8.5 -51.8 -46.2 -56.3 -55.3 -57.7 -52.9 -57.9 26.3
{0xC5, 4}, // C5 8.1 -54.6 -46.5 -56.6 -55.4 -58.1 -53.2 -57.9 25.7
{0xC6, 2}, // C6 7.8 -56.2 -46.9 -56.9 -55.6 -58.2 -53.2 -57.9 25.2
{0xC7, 3}, // C7 7.4 -57.0 -47.2 -57.0 -55.7 -58.3 -53.5 -57.6 24.7
{0xC8, 3}, // C8 7.1 -57.4 -47.6 -57.2 -55.9 -58.4 -53.5 -57.2 24.2
{0xC9, 2}, // C9 6.8 -56.1 -47.9 -57.3 -55.9 -58.5 -54.0 -56.9 23.8
{0xCA, 3}, // CA 6.4 -54.9 -48.3 -57.2 -56.1 -58.6 -54.2 -56.7 23.4
{0x80, 1}, // 80 6.3 -50.3 -51.7 -57.7 -53.8 -56.4 -56.3 -57.1 20.6
{0xCB, 2}, // CB 6.1 -53.8 -48.6 -57.0 -56.1 -58.5 -54.3 -56.7 23.0
{0x81, 0}, // 81 6.0 -51.4 -52.0 -58.0 -54.0 -56.6 -56.1 -57.4 20.3
{0xCC, 2}, // CC 5.8 -52.8 -48.9 -57.0 -56.1 -58.4 -54.6 -56.2 22.6
{0x82, 0}, // 82 5.8 -52.3 -52.1 -58.2 -54.2 -57.0 -56.3 -57.5 20.0
{0xCD, 2}, // CD 5.5 -52.1 -49.2 -56.9 -56.2 -58.2 -54.8 -56.2 22.3
{0x83, 0}, // 83 5.5 -53.0 -52.5 -58.3 -54.4 -57.4 -56.4 -57.8 19.7
{0x84, 4}, // 84 5.1 -53.7 -52.9 -58.1 -54.6 -57.5 -56.6 -57.9 19.4
{0xCE, 1}, // CE 4.9 -50.6 -49.9 -56.6 -56.3 -58.4 -55.4 -55.8 21.6
{0x85, 1}, // 85 4.8 -54.2 -53.0 -58.3 -55.0 -57.8 -56.8 -58.0 19.1
{0x86, 3}, // 86 4.4 -54.9 -53.1 -58.2 -55.1 -57.8 -56.9 -58.1 18.8
{0x87, 4}, // 87 4.0 -55.6 -53.5 -58.2 -55.3 -58.1 -56.9 -58.2 18.5
{0x88, 3}, // 88 3.6 -56.2 -53.8 -58.3 -55.7 -58.1 -57.2 -58.2 18.2
{0x89, 3}, // 89 3.2 -56.8 -53.9 -58.2 -55.8 -58.1 -57.3 -58.0 17.9
{0x8A, 4}, // 8A 2.8 -57.4 -54.1 -58.2 -56.0 -58.3 -57.7 -58.1 17.6
{0x8B, 5}, // 8B 2.3 -57.7 -54.5 -58.0 -56.3 -58.1 -57.5 -58.2 17.3
{0xCF, 2}, // CF 2.0 -48.3 -52.4 -56.0 -57.0 -57.7 -57.3 -56.4 19.3
{0x8C, 1}, // 8C 1.9 -58.2 -54.7 -58.1 -56.7 -58.3 -58.0 -58.2 17.1
{0x8D, 5}, // 8D 1.4 -58.4 -54.9 -58.0 -56.8 -58.2 -58.2 -58.1 16.8
{0x8E, 9}, // 8E 0.4 -58.0 -55.5 -57.8 -57.4 -58.2 -58.1 -58.4 16.2
{0x50, 0}, // 50 0.4 -59.0 -55.2 -58.2 -57.4 -58.4 -57.8 -58.4 16.0
{0x60, 3}, // 60 0.1 -59.1 -55.4 -58.1 -57.4 -58.4 -57.7 -58.3 15.9
{0x51, 4}, // 51 -0.3 -59.2 -55.8 -58.2 -57.5 -58.4 -57.9 -58.3 15.7
{0x61, 2}, // 61 -0.5 -59.3 -55.8 -58.2 -57.8 -58.3 -58.1 -58.3 15.6
{0x40, 3}, // 40 -0.8 -59.7 -56.1 -58.2 -57.7 -58.4 -58.3 -58.2 15.4
{0x52, 0}, // 52 -0.9 -59.6 -56.1 -58.3 -57.7 -58.3 -58.3 -58.3 15.3
{0x3F, 2}, // 3F -1.1 -61.3 -56.9 -58.2 -57.9 -58.5 -58.2 -58.6 21.1
{0x62, 0}, // 62 -1.1 -59.6 -56.2 -58.2 -57.8 -58.4 -58.2 -58.3 15.3
{0x3E, 2}, // 3E -1.4 -61.4 -57.0 -58.3 -57.9 -58.5 -58.2 -58.5 20.5
{0x53, 1}, // 53 -1.5 -59.7 -56.5 -58.3 -57.9 -58.4 -58.1 -58.3 15.0
{0x3D, 1}, // 3D -1.7 -61.1 -57.2 -58.3 -57.9 -58.6 -58.3 -58.5 19.9
{0x63, 0}, // 63 -1.7 -59.8 -56.7 -58.3 -57.9 -58.4 -58.4 -58.3 15.0
{0x3C, 4}, // 3C -2.1 -60.6 -57.3 -58.2 -58.0 -58.5 -58.4 -58.5 19.3
{0x54, 1}, // 54 -2.2 -60.0 -56.8 -58.3 -58.1 -58.5 -58.4 -58.5 14.8
{0x64, 0}, // 64 -2.3 -60.1 -57.0 -58.2 -58.2 -58.5 -58.6 -58.5 14.7
{0x3B, 2}, // 3B -2.5 -60.4 -57.5 -58.3 -58.1 -58.5 -58.2 -58.5 18.7
{0x55, 2}, // 55 -2.8 -60.3 -57.2 -58.3 -58.2 -58.3 -58.4 -58.6 14.5
{0x65, 1}, // 65 -2.9 -60.2 -57.2 -58.3 -58.3 -58.4 -58.4 -58.4 14.5
{0x2F, 1}, // 2F -3.0 -58.4 -57.6 -58.3 -58.1 -58.6 -58.4 -58.5 17.9
{0x3A, 1}, // 3A -3.1 -59.5 -57.5 -58.3 -58.3 -58.6 -58.1 -58.6 18.1
{0x56, 1}, // 56 -3.3 -60.2 -57.5 -58.4 -58.6 -58.5 -58.4 -58.3 14.3
{0x2E, 2}, // 2E -3.5 -58.0 -57.8 -58.3 -58.4 -58.3 -58.3 -58.5 17.5
{0x66, 0}, // 66 -3.5 -60.3 -57.6 -58.2 -58.4 -58.3 -58.5 -58.5 14.2
{0x39, 2}, // 39 -3.8 -58.7 -57.8 -58.3 -58.3 -58.4 -58.4 -58.5 17.5
{0x57, 2}, // 57 -4.0 -60.3 -57.7 -58.4 -58.4 -58.4 -58.7 -58.4 14.1
{0x2D, 0}, // 2D -4.0 -57.6 -58.0 -58.2 -58.5 -58.4 -58.6 -58.5 17.1
{0x67, 0}, // 67 -4.1 -60.1 -57.8 -58.1 -58.6 -58.4 -58.7 -58.6 14.0
{0x8F, 5}, // 8F -4.6 -52.2 -57.7 -58.1 -58.8 -58.4 -58.7 -58.3 14.4
{0x2C, 1}, // 2C -4.7 -57.4 -58.3 -58.3 -58.7 -58.5 -58.5 -58.5 16.7
{0x38, 0}, // 38 -4.7 -58.2 -58.0 -58.3 -58.6 -58.4 -58.5 -58.5 16.9
{0x68, 0}, // 68 -4.7 -60.4 -57.8 -58.4 -58.7 -58.4 -58.7 -58.5 13.8
{0x2B, 5}, // 2B -5.3 -57.0 -58.7 -58.4 -58.6 -58.4 -58.5 -58.5 16.3
{0x69, 0}, // 69 -5.3 -60.6 -58.4 -58.3 -58.8 -58.4 -58.7 -58.5 13.6
{0x37, 2}, // 37 -5.6 -56.8 -58.3 -58.3 -58.8 -58.4 -58.5 -58.4 16.2
{0x6A, 3}, // 6A -5.9 -60.8 -58.6 -58.3 -58.7 -58.5 -58.6 -58.5 13.5
{0x2A, 0}, // 2A -6.0 -56.8 -58.6 -58.4 -58.8 -58.4 -58.6 -58.3 15.9
{0x6B, 5}, // 6B -6.5 -60.5 -58.9 -58.3 -58.6 -58.5 -58.7 -58.3 13.3
{0x36, 2}, // 36 -6.8 -56.8 -58.9 -58.3 -58.8 -58.3 -58.5 -58.5 15.6
{0x29, 1}, // 29 -6.9 -56.7 -58.9 -58.1 -58.6 -58.5 -58.6 -58.5 15.5
{0x6C, 1}, // 6C -7.1 -60.5 -58.9 -58.2 -58.9 -58.5 -58.6 -58.6 13.2
{0x6D, 6}, // 6D -7.7 -60.4 -59.2 -58.4 -59.0 -58.5 -58.6 -58.5 13.0
{0x28, 0}, // 28 -7.8 -56.6 -59.0 -58.2 -59.0 -58.4 -58.5 -58.4 15.1
{0x35, 5}, // 35 -8.3 -56.8 -59.1 -58.4 -58.9 -58.5 -58.6 -58.5 15.0
{0x27, 3}, // 27 -8.7 -56.8 -59.2 -58.2 -58.9 -58.5 -58.6 -58.4 14.7
{0x6E, 2}, // 6E -8.9 -60.2 -59.3 -58.3 -58.8 -58.5 -58.7 -58.5 12.8
{0x26, 10}, // 26 -9.9 -57.0 -59.4 -58.3 -59.0 -58.4 -58.7 -58.4 14.3
{0x34, 1}, // 34 -10.1 -57.0 -59.4 -58.4 -58.9 -58.3 -58.7 -58.5 14.4
{0x25, 13}, // 25 -11.4 -57.3 -59.7 -58.4 -59.0 -58.3 -58.7 -58.5 13.9
{0x33, 9}, // 33 -12.3 -57.8 -59.8 -58.4 -58.9 -58.3 -58.7 -58.6 13.8
{0x24, 10}, // 24 -13.3 -57.9 -59.9 -58.2 -59.0 -58.6 -58.7 -58.5 13.5
{0x1F, 3}, // 1F -13.7 -57.9 -59.9 -58.4 -59.0 -58.5 -58.7 -58.5 13.3
{0x1E, 6}, // 1E -14.3 -58.4 -59.8 -58.2 -59.0 -58.4 -58.6 -58.6 13.2
{0x1D, 5}, // 1D -14.9 -58.6 -59.8 -58.3 -59.0 -58.5 -58.7 -58.5 13.1
{0x6F, 5}, // 6F -15.5 -59.1 -59.9 -58.3 -59.1 -58.5 -58.7 -58.6 12.4
{0x1C, 0}, // 1C -15.5 -58.6 -59.9 -58.4 -58.8 -58.6 -58.8 -58.5 12.9
{0x23, 0}, // 23 -15.6 -59.0 -59.9 -58.1 -59.0 -58.4 -58.6 -58.5 13.1
{0x32, 0}, // 32 -15.7 -59.0 -59.8 -58.2 -58.8 -58.5 -58.6 -58.5 13.1
{0x1B, 5}, // 1B -16.2 -59.1 -59.9 -58.3 -59.0 -58.5 -58.6 -58.4 12.8
{0x1A, 8}, // 1A -17.0 -59.4 -59.9 -58.3 -59.1 -58.5 -58.7 -58.4 12.7
{0x19, 8}, // 19 -17.8 -59.7 -59.9 -58.3 -59.0 -58.4 -58.6 -58.5 12.6
{0x18, 10}, // 18 -18.8 -60.2 -59.9 -58.2 -59.0 -58.5 -58.7 -58.6 12.5
{0x22, 1}, // 22 -19.0 -60.4 -59.9 -58.3 -59.0 -58.5 -58.6 -58.5 12.6
{0x0F, 3}, // F -19.3 -60.4 -59.8 -58.4 -59.0 -58.6 -58.6 -58.5 12.4
{0x17, 5}, // 17 -19.8 -60.6 -59.9 -58.2 -58.9 -58.4 -58.7 -58.4 12.4
{0x0E, 0}, // E -19.8 -60.5 -59.9 -58.3 -59.1 -58.5 -58.8 -58.6 12.4
{0x0D, 5}, // D -20.4 -60.7 -60.0 -58.4 -59.0 -58.5 -58.5 -58.5 12.3
{0x0C, 6}, // C -21.0 -61.1 -59.9 -58.4 -59.0 -58.5 -58.7 -58.6 12.3
{0x16, 0}, // 16 -21.0 -61.2 -59.9 -58.3 -59.1 -58.5 -58.7 -58.4 12.3
{0x31, 3}, // 31 -21.3 -61.3 -60.0 -58.3 -59.0 -58.5 -58.7 -58.5 12.5
{0x0B, 3}, // B -21.7 -61.3 -59.9 -58.2 -58.9 -58.5 -58.8 -58.4 12.2
{0x15, 8}, // 15 -22.5 -61.7 -60.0 -58.2 -59.1 -58.3 -58.6 -58.7 12.2
{0x0A, 0}, // A -22.5 -61.8 -60.0 -58.2 -58.9 -58.6 -58.6 -58.6 12.2
{0x09, 8}, // 9 -23.3 -61.8 -60.0 -58.2 -59.0 -58.6 -58.6 -58.4 12.1
{0x08, 10}, // 8 -24.3 -62.3 -59.9 -58.3 -59.0 -58.4 -58.8 -58.5 12.1
{0x14, 0}, // 14 -24.3 -62.1 -59.9 -58.4 -59.1 -58.5 -58.7 -58.5 12.1
{0x21, 1}, // 21 -24.5 -62.4 -59.9 -58.3 -59.1 -58.4 -58.6 -58.4 12.2
{0x07, 8}, // 7 -25.3 -62.6 -59.9 -58.2 -59.0 -58.6 -58.7 -58.5 12.0
{0x06, 11}, // 6 -26.5 -63.2 -59.9 -58.3 -58.9 -58.5 -58.6 -58.6 12.0
{0x13, 0}, // 13 -26.5 -63.0 -59.8 -58.3 -59.0 -58.4 -58.7 -58.4 12.0
{0x05, 13}, // 5 -27.9 -63.5 -59.8 -58.3 -59.1 -58.5 -58.7 -58.4 11.9
{0x04, 16}, // 4 -29.5 -63.7 -59.9 -58.3 -58.9 -58.5 -58.5 -58.5 11.9
{0x12, 1}, // 12 -29.6 -63.6 -59.7 -58.3 -59.1 -58.6 -58.6 -58.5 11.9
{0x03, 17}, // 3 -31.4 -64.2 -60.1 -58.4 -59.0 -58.6 -58.8 -58.6 11.8
{0x11, 23}, // 11 -33.8 -64.3 -59.9 -58.3 -58.9 -58.6 -58.6 -58.5 11.8
{0x02, 0}, // 2 -33.8 -64.4 -59.9 -58.3 -59.1 -58.4 -58.8 -58.6 11.7
{0x01, 27}, // 1 -36.5 -64.2 -59.9 -58.4 -59.0 -58.6 -58.6 -58.5 11.7
{0x10, 17}, // 10 -38.3 -64.4 -59.9 -58.4 -59.0 -58.5 -58.8 -58.5 11.7
{0x20, 0}, // 20 -38.3 -64.6 -59.9 -58.3 -59.0 -58.6 -58.7 -58.5 11.8
{0x30, 1}, // 30 -38.4 -64.4 -59.9 -58.3 -59.1 -58.5 -58.7 -58.6 11.9
{0x00, 243}, // 0 -62.7 -64.5 -59.8 -58.2 -58.9 -58.5 -58.7 -58.6 11.3
};
static const PowerTableItem PA_TABLE_868_FULL[] = {
{0xC0, 3}, // C0 10.7 -35.1 -58.6 -58.6 -57.5 -50.0 34.2
{0xC1, 3}, // C1 10.3 -37.0 -58.5 -58.6 -57.5 -51.4 33.3
{0xC2, 3}, // C2 10.0 -39.2 -58.3 -58.5 -57.4 -53.2 32.4
{0xC3, 4}, // C3 9.6 -41.5 -58.5 -58.3 -57.4 -54.4 31.6
{0xC4, 4}, // C4 9.2 -44.0 -58.6 -58.5 -57.4 -55.2 30.9
{0xC5, 2}, // C5 8.9 -46.2 -58.5 -58.6 -57.6 -55.4 30.2
{0xC6, 4}, // C6 8.5 -47.7 -58.5 -58.3 -57.6 -55.0 29.5
{0xC7, 3}, // C7 8.2 -47.3 -58.5 -58.5 -57.7 -54.5 28.9
{0xC8, 3}, // C8 7.8 -45.9 -58.5 -58.4 -57.7 -54.1 28.3
{0xC9, 2}, // C9 7.5 -44.4 -58.5 -58.5 -57.7 -53.6 27.8
{0xCA, 2}, // CA 7.2 -42.9 -58.6 -58.4 -57.6 -53.2 27.3
{0xCB, 4}, // CB 6.8 -41.7 -58.5 -58.4 -57.8 -52.8 26.8
{0xCC, 2}, // CC 6.5 -40.6 -58.6 -58.4 -57.6 -52.5 26.3
{0xCD, 2}, // CD 6.2 -39.8 -58.4 -58.6 -57.6 -52.3 25.9
{0xCE, 7}, // CE 5.5 -38.5 -58.5 -58.4 -57.8 -52.2 25.0
{0x80, 2}, // 80 5.2 -31.9 -58.5 -58.4 -57.8 -56.2 21.2
{0x81, 2}, // 81 5.0 -32.6 -58.5 -58.6 -57.8 -56.2 21.0
{0x82, 2}, // 82 4.8 -33.4 -58.4 -58.4 -57.7 -56.2 20.8
{0x83, 2}, // 83 4.6 -34.3 -58.4 -58.5 -57.7 -56.1 20.5
{0x84, 1}, // 84 4.4 -35.3 -58.7 -58.5 -57.8 -55.8 20.3
{0x85, 3}, // 85 4.1 -36.5 -58.7 -58.6 -57.7 -55.8 20.0
{0x86, 3}, // 86 3.7 -37.8 -58.6 -58.5 -57.8 -55.8 19.7
{0x87, 3}, // 87 3.4 -39.4 -58.6 -58.6 -57.8 -55.7 19.5
{0x88, 3}, // 88 3.0 -41.0 -58.5 -58.5 -57.7 -55.7 19.1
{0x89, 3}, // 89 2.6 -43.0 -58.5 -58.6 -57.6 -55.8 18.8
{0xCF, 2}, // CF 2.4 -36.6 -58.6 -58.4 -57.7 -53.6 22.0
{0x8A, 2}, // 8A 2.1 -45.1 -58.5 -58.5 -57.6 -55.8 18.5
{0x8B, 4}, // 8B 1.7 -47.5 -58.5 -58.4 -57.8 -55.8 18.2
{0x8C, 5}, // 8C 1.1 -50.2 -58.6 -58.5 -57.7 -55.9 17.9
{0x8D, 5}, // 8D 0.6 -52.6 -58.5 -58.5 -57.8 -55.8 17.6
{0x50, 9}, // 50 -0.3 -42.1 -58.5 -58.5 -57.6 -57.1 16.9
{0x60, 2}, // 60 -0.5 -42.3 -58.6 -58.5 -57.6 -57.2 16.8
{0x8E, 0}, // 8E -0.5 -55.5 -58.5 -58.6 -57.7 -56.2 17.0
{0x51, 4}, // 51 -0.9 -42.6 -58.6 -58.6 -57.6 -57.1 16.5
{0x61, 2}, // 61 -1.1 -42.8 -58.3 -58.5 -57.6 -57.1 16.4
{0x40, 3}, // 40 -1.5 -43.2 -58.5 -58.7 -57.7 -57.2 16.1
{0x52, 1}, // 52 -1.6 -43.2 -58.5 -58.5 -57.7 -57.2 16.1
{0x62, 1}, // 62 -1.8 -43.2 -58.4 -58.6 -57.7 -57.0 16.0
{0x53, 4}, // 53 -2.3 -43.7 -58.6 -58.6 -57.7 -57.2 15.7
{0x63, 1}, // 63 -2.4 -43.8 -58.6 -58.4 -57.6 -57.1 15.6
{0x3F, 2}, // 3F -2.6 -53.7 -58.6 -58.5 -57.8 -57.5 21.4
{0x3E, 1}, // 3E -2.8 -54.2 -58.6 -58.5 -57.7 -57.5 20.8
{0x54, 1}, // 54 -2.9 -44.4 -58.5 -58.6 -57.8 -57.4 15.3
{0x64, 2}, // 64 -3.1 -44.3 -58.6 -58.6 -57.7 -57.4 15.3
{0x3D, 1}, // 3D -3.2 -54.7 -58.6 -58.5 -57.7 -57.5 20.2
{0x3C, 2}, // 3C -3.5 -55.0 -58.6 -58.5 -57.7 -57.5 19.6
{0x55, 1}, // 55 -3.6 -44.9 -58.6 -58.4 -57.8 -57.5 15.0
{0x65, 1}, // 65 -3.7 -44.9 -58.6 -58.5 -57.7 -57.5 15.0
{0x3B, 2}, // 3B -4.0 -55.0 -58.5 -58.5 -57.7 -57.3 19.0
{0x56, 2}, // 56 -4.2 -45.4 -58.5 -58.5 -57.7 -57.5 14.7
{0x66, 2}, // 66 -4.4 -45.4 -58.5 -58.5 -57.7 -57.4 14.7
{0x2F, 0}, // 2F -4.5 -52.6 -58.6 -58.6 -57.6 -57.4 18.2
{0x3A, 0}, // 3A -4.5 -54.1 -58.6 -58.5 -57.8 -57.5 18.4
{0x57, 2}, // 57 -4.8 -46.0 -58.6 -58.5 -57.6 -57.4 14.5
{0x2E, 1}, // 2E -4.9 -51.8 -58.6 -58.4 -57.7 -57.4 17.8
{0x67, 0}, // 67 -5.0 -46.0 -58.5 -58.5 -57.8 -57.5 14.4
{0x39, 2}, // 39 -5.2 -52.9 -58.6 -58.6 -57.7 -57.5 17.8
{0x2D, 2}, // 2D -5.5 -50.9 -58.6 -58.5 -57.7 -57.4 17.4
{0x68, 2}, // 68 -5.7 -46.6 -58.5 -58.5 -57.7 -57.5 14.2
{0x8F, 2}, // 8F -6.0 -51.6 -58.5 -58.6 -57.7 -57.1 15.0
{0x2C, 0}, // 2C -6.0 -50.3 -58.6 -58.5 -57.7 -57.3 17.0
{0x38, 0}, // 38 -6.1 -51.8 -58.6 -58.5 -57.7 -57.3 17.1
{0x69, 2}, // 69 -6.3 -47.3 -58.4 -58.6 -57.6 -57.5 14.0
{0x2B, 4}, // 2B -6.7 -49.8 -58.5 -58.5 -57.7 -57.5 16.6
{0x6A, 2}, // 6A -6.9 -48.1 -58.6 -58.5 -57.7 -57.5 13.8
{0x37, 0}, // 37 -6.9 -49.5 -58.5 -58.5 -57.6 -57.3 16.4
{0x2A, 5}, // 2A -7.4 -49.3 -58.5 -58.6 -57.7 -57.4 16.2
{0x6B, 0}, // 6B -7.5 -49.5 -58.5 -58.6 -57.7 -57.4 13.8
{0x36, 5}, // 36 -8.1 -49.0 -58.5 -58.5 -57.7 -57.3 15.8
{0x29, 0}, // 29 -8.2 -49.1 -58.6 -58.5 -57.8 -57.4 15.8
{0x6C, 5}, // 6C -8.7 -52.2 -58.6 -58.5 -57.6 -57.4 14.0
{0x28, 3}, // 28 -9.0 -49.0 -58.5 -58.6 -57.7 -57.4 15.4
{0x35, 4}, // 35 -9.4 -48.9 -58.5 -58.5 -57.8 -57.3 15.2
{0x27, 4}, // 27 -9.8 -49.0 -58.5 -58.5 -57.7 -57.3 15.0
{0x26, 11}, // 26 -11.0 -49.2 -58.5 -58.5 -57.7 -57.4 14.6
{0x34, 0}, // 34 -11.1 -49.2 -58.6 -58.6 -57.7 -57.3 14.6
{0x25, 14}, // 25 -12.5 -49.5 -58.6 -58.6 -57.8 -57.3 14.1
{0x33, 8}, // 33 -13.3 -49.7 -58.6 -58.5 -57.8 -57.5 14.0
{0x24, 10}, // 24 -14.3 -50.2 -58.5 -58.4 -57.8 -57.4 13.7
{0x6D, 1}, // 6D -14.5 -55.3 -58.6 -58.5 -57.7 -57.5 14.7
{0x1F, 0}, // 1F -14.6 -50.3 -58.6 -58.6 -57.7 -57.5 13.5
{0x1E, 5}, // 1E -15.1 -50.6 -58.6 -58.5 -57.6 -57.4 13.4
{0x1D, 5}, // 1D -15.7 -50.7 -58.6 -58.6 -57.8 -57.5 13.3
{0x1C, 6}, // 1C -16.4 -51.1 -58.6 -58.4 -57.6 -57.3 13.2
{0x23, 1}, // 23 -16.5 -51.0 -58.6 -58.6 -57.8 -57.4 13.3
{0x32, 0}, // 32 -16.5 -51.0 -58.6 -58.5 -57.7 -57.4 13.4
{0x1B, 5}, // 1B -17.0 -51.3 -58.5 -58.4 -57.7 -57.5 13.1
{0x1A, 8}, // 1A -17.8 -51.6 -58.6 -58.5 -57.7 -57.3 13.0
{0x19, 8}, // 19 -18.6 -52.0 -58.6 -58.5 -57.8 -57.5 12.9
{0x18, 8}, // 18 -19.5 -52.6 -58.5 -58.5 -57.8 -57.4 12.8
{0x22, 1}, // 22 -19.6 -52.5 -58.5 -58.6 -57.7 -57.4 12.9
{0x0F, 3}, // F -20.0 -52.8 -58.5 -58.5 -57.7 -57.6 12.7
{0x0E, 5}, // E -20.5 -53.0 -58.5 -58.6 -57.7 -57.6 12.7
{0x17, 0}, // 17 -20.5 -52.9 -58.6 -58.6 -57.7 -57.5 12.7
{0x0D, 6}, // D -21.1 -53.3 -58.6 -58.6 -57.8 -57.4 12.6
{0x0C, 5}, // C -21.7 -53.6 -58.6 -58.5 -57.7 -57.5 12.6
{0x16, 0}, // 16 -21.7 -53.6 -58.5 -58.6 -57.6 -57.5 12.6
{0x31, 1}, // 31 -21.9 -53.7 -58.5 -58.4 -57.8 -57.3 12.8
{0x0B, 4}, // B -22.3 -53.9 -58.6 -58.5 -57.8 -57.4 12.5
{0x0A, 6}, // A -23.0 -54.3 -58.6 -58.5 -57.8 -57.4 12.5
{0x15, 0}, // 15 -23.0 -54.3 -58.5 -58.5 -57.8 -57.4 12.5
{0x09, 8}, // 9 -23.8 -54.7 -58.5 -58.5 -57.8 -57.5 12.4
{0x08, 8}, // 8 -24.6 -55.0 -58.6 -58.6 -57.7 -57.6 12.3
{0x14, 0}, // 14 -24.7 -55.0 -58.5 -58.5 -57.7 -57.5 12.4
{0x21, 1}, // 21 -24.8 -55.1 -58.5 -58.5 -57.7 -57.5 12.5
{0x07, 6}, // 7 -25.5 -55.4 -58.6 -58.5 -57.7 -57.5 12.3
{0x13, 10}, // 13 -26.5 -55.9 -58.6 -58.5 -57.6 -57.6 12.3
{0x06, 0}, // 6 -26.5 -55.9 -58.5 -58.5 -57.6 -57.5 12.2
{0x05, 11}, // 5 -27.7 -56.4 -58.4 -58.4 -57.7 -57.5 12.2
{0x12, 11}, // 12 -28.9 -57.1 -58.4 -58.5 -57.7 -57.3 12.2
{0x04, 0}, // 4 -28.9 -57.0 -58.6 -58.4 -57.7 -57.5 12.1
{0x03, 13}, // 3 -30.2 -57.3 -58.5 -58.5 -57.7 -57.5 12.1
{0x02, 15}, // 2 -31.7 -57.9 -58.5 -58.5 -57.7 -57.3 12.0
{0x11, 0}, // 11 -31.7 -58.0 -58.5 -58.5 -57.8 -57.3 12.1
{0x01, 14}, // 1 -33.1 -58.4 -58.6 -58.5 -57.8 -57.5 12.0
{0x10, 10}, // 10 -34.1 -58.2 -58.7 -58.3 -57.7 -57.5 11.9
{0x20, 0}, // 20 -34.1 -58.2 -58.5 -58.5 -57.7 -57.5 12.1
{0x30, 1}, // 30 -34.2 -58.4 -58.6 -58.5 -57.8 -57.5 12.2
{0x6E, 115}, // 6E -45.8 -57.9 -58.6 -58.5 -57.7 -57.5 16.1
{0x00, 135}, // 0 -59.3 -58.3 -58.4 -58.5 -57.8 -57.4 11.3
{0x6F, 99}, // 6F -69.2 -58.2 -58.5 -58.4 -57.6 -57.4 10.8
};
static const PowerTableItem PA_TABLE_915_FULL[] = {
{0xC0, 15}, // C0 9.4 -33.5 -58.5 -58.4 -55.8 -32.6 31.8
{0xC1, 4}, // C1 9.0 -35.9 -58.3 -58.5 -56.1 -34.4 30.9
{0xC2, 4}, // C2 8.6 -38.6 -58.5 -58.4 -56.1 -36.2 30.0
{0xC3, 2}, // C3 8.3 -41.5 -58.6 -58.4 -56.3 -38.0 29.3
{0xC4, 4}, // C4 7.9 -43.6 -58.5 -58.4 -56.5 -39.6 28.6
{0xC5, 3}, // C5 7.6 -43.9 -58.5 -58.5 -56.7 -40.5 28.0
{0xC6, 3}, // C6 7.2 -42.5 -58.5 -58.4 -56.7 -40.5 27.4
{0xC7, 2}, // C7 6.9 -40.7 -58.5 -58.5 -56.8 -40.0 26.9
{0xC8, 3}, // C8 6.6 -39.0 -58.5 -58.4 -56.9 -39.4 26.4
{0xC9, 3}, // C9 6.2 -37.6 -58.6 -58.4 -57.2 -38.8 25.9
{0xCA, 2}, // CA 5.9 -36.5 -58.6 -58.4 -57.3 -38.2 25.5
{0xCB, 3}, // CB 5.6 -35.6 -58.4 -58.4 -57.3 -37.8 25.1
{0xCC, 2}, // CC 5.3 -34.8 -58.6 -58.3 -57.3 -37.5 24.7
{0xCD, 2}, // CD 5.0 -34.2 -58.6 -58.5 -57.5 -37.3 24.3
{0x80, 0}, // 80 4.9 -27.8 -58.5 -58.4 -57.7 -40.6 20.7
{0x81, 2}, // 81 4.7 -28.7 -58.4 -58.5 -57.7 -40.6 20.5
{0x82, 2}, // 82 4.5 -29.6 -58.5 -58.4 -57.7 -40.5 20.2
{0xCE, 2}, // CE 4.3 -33.2 -58.5 -58.3 -57.5 -37.2 23.7
{0x83, 0}, // 83 4.2 -30.7 -58.5 -58.4 -57.7 -40.4 20.0
{0x84, 3}, // 84 3.9 -32.0 -58.6 -58.4 -57.7 -40.1 19.7
{0x85, 2}, // 85 3.6 -33.3 -58.5 -58.5 -57.8 -39.9 19.4
{0x86, 3}, // 86 3.3 -34.8 -58.5 -58.5 -57.6 -39.8 19.2
{0x87, 3}, // 87 2.9 -36.5 -58.4 -58.5 -57.7 -39.6 18.9
{0x88, 3}, // 88 2.5 -38.3 -58.6 -58.4 -57.8 -39.5 18.6
{0x89, 2}, // 89 2.2 -40.2 -58.6 -58.5 -57.6 -39.6 18.3
{0x8A, 4}, // 8A 1.8 -42.2 -58.5 -58.4 -57.7 -39.6 18.1
{0xCF, 1}, // CF 1.6 -31.3 -58.7 -58.3 -57.6 -40.0 21.4
{0x8B, 3}, // 8B 1.3 -44.0 -58.5 -58.4 -57.7 -39.8 17.8
{0x8C, 4}, // 8C 0.9 -45.8 -58.4 -58.4 -57.6 -40.0 17.5
{0x8D, 4}, // 8D 0.5 -46.8 -58.5 -58.5 -57.7 -40.4 17.3
{0x8E, 11}, // 8E -0.6 -46.6 -58.5 -58.5 -57.8 -41.1 16.7
{0x50, 3}, // 50 -0.9 -37.9 -58.5 -58.5 -57.8 -45.9 16.5
{0x60, 2}, // 60 -1.1 -38.0 -58.4 -58.4 -57.7 -46.1 16.4
{0x51, 5}, // 51 -1.6 -38.7 -58.4 -58.5 -57.7 -46.9 16.0
{0x61, 1}, // 61 -1.8 -38.7 -58.5 -58.4 -57.7 -47.0 15.9
{0x40, 3}, // 40 -2.1 -39.4 -58.6 -58.5 -57.7 -47.5 15.7
{0x52, 1}, // 52 -2.2 -39.3 -58.5 -58.4 -57.7 -47.4 15.6
{0x62, 1}, // 62 -2.4 -39.4 -58.5 -58.5 -57.8 -47.6 15.6
{0x3F, 1}, // 3F -2.5 -49.6 -58.4 -58.4 -57.6 -55.1 21.3
{0x3E, 2}, // 3E -2.7 -50.0 -58.5 -58.4 -57.6 -55.3 20.7
{0x53, 1}, // 53 -2.9 -40.1 -58.5 -58.4 -57.8 -47.7 15.3
{0x3D, 1}, // 3D -3.0 -50.3 -58.4 -58.5 -57.7 -55.2 20.1
{0x63, 0}, // 63 -3.0 -40.1 -58.4 -58.4 -57.8 -47.7 15.2
{0x3C, 3}, // 3C -3.4 -50.7 -58.4 -58.5 -57.7 -55.3 19.5
{0x54, 1}, // 54 -3.5 -40.8 -58.5 -58.5 -57.7 -48.0 15.0
{0x64, 2}, // 64 -3.7 -40.8 -58.5 -58.5 -57.6 -48.1 14.9
{0x3B, 0}, // 3B -3.8 -50.7 -58.6 -58.4 -57.6 -55.2 18.9
{0x55, 2}, // 55 -4.1 -41.6 -58.5 -58.4 -57.7 -49.2 14.7
{0x2F, 1}, // 2F -4.2 -50.3 -58.5 -58.4 -57.7 -54.1 18.1
{0x65, 0}, // 65 -4.3 -41.6 -58.6 -58.4 -57.6 -49.2 14.6
{0x3A, 1}, // 3A -4.4 -50.5 -58.6 -58.4 -57.7 -54.8 18.3
{0x2E, 2}, // 2E -4.7 -49.4 -58.5 -58.4 -57.7 -53.6 17.7
{0x56, 0}, // 56 -4.7 -42.3 -58.5 -58.5 -57.8 -50.5 14.4
{0x66, 2}, // 66 -4.9 -42.3 -58.5 -58.4 -57.7 -50.6 14.4
{0x39, 1}, // 39 -5.1 -50.0 -58.5 -58.5 -57.6 -54.0 17.7
{0x2D, 1}, // 2D -5.2 -48.8 -58.5 -58.4 -57.7 -53.0 17.3
{0x57, 2}, // 57 -5.4 -43.1 -58.6 -58.4 -57.8 -51.9 14.2
{0x67, 1}, // 67 -5.6 -43.1 -58.5 -58.4 -57.8 -52.1 14.1
{0x8F, 1}, // 8F -5.7 -46.0 -58.6 -58.4 -57.6 -45.5 14.9
{0x2C, 0}, // 2C -5.8 -48.1 -58.5 -58.4 -57.7 -52.4 16.9
{0x38, 1}, // 38 -5.9 -49.2 -58.6 -58.4 -57.7 -53.3 17.1
{0x68, 2}, // 68 -6.2 -43.9 -58.5 -58.5 -57.6 -51.6 13.9
{0x2B, 2}, // 2B -6.4 -47.6 -58.4 -58.4 -57.8 -52.1 16.5
{0x37, 2}, // 37 -6.7 -47.4 -58.6 -58.4 -57.7 -51.7 16.4
{0x69, 0}, // 69 -6.8 -44.9 -58.5 -58.4 -57.7 -51.8 13.8
{0x2A, 4}, // 2A -7.2 -47.2 -58.6 -58.4 -57.8 -51.6 16.1
{0x6A, 2}, // 6A -7.4 -46.2 -58.5 -58.4 -57.9 -53.1 13.7
{0x36, 5}, // 36 -7.9 -46.9 -58.5 -58.4 -57.7 -51.2 15.8
{0x29, 0}, // 29 -8.0 -47.0 -58.6 -58.4 -57.8 -51.2 15.7
{0x6B, 4}, // 6B -8.4 -49.0 -58.5 -58.4 -57.8 -55.4 13.9
{0x28, 4}, // 28 -8.8 -46.8 -58.4 -58.5 -57.6 -50.9 15.3
{0x35, 5}, // 35 -9.3 -46.7 -58.6 -58.4 -57.7 -50.7 15.2
{0x27, 3}, // 27 -9.7 -46.7 -58.5 -58.4 -57.6 -50.7 14.9
{0x26, 12}, // 26 -10.9 -47.0 -58.6 -58.4 -57.8 -50.9 14.5
{0x34, 0}, // 34 -10.9 -47.0 -58.5 -58.4 -57.8 -50.8 14.5
{0x25, 14}, // 25 -12.3 -47.2 -58.6 -58.3 -57.7 -51.0 14.1
{0x6C, 0}, // 6C -12.4 -54.4 -58.6 -58.4 -57.8 -55.3 14.6
{0x33, 6}, // 33 -13.1 -47.6 -58.5 -58.4 -57.8 -51.2 14.0
{0x24, 10}, // 24 -14.1 -48.1 -58.4 -58.4 -57.8 -51.4 13.7
{0x1F, 3}, // 1F -14.4 -48.2 -58.5 -58.4 -57.7 -51.5 13.5
{0x1E, 5}, // 1E -14.9 -48.4 -58.5 -58.4 -57.8 -51.7 13.4
{0x1D, 5}, // 1D -15.5 -48.7 -58.4 -58.5 -57.7 -51.9 13.2
{0x1C, 6}, // 1C -16.1 -49.0 -58.4 -58.4 -57.7 -52.2 13.1
{0x23, 1}, // 23 -16.3 -49.1 -58.4 -58.5 -57.8 -51.9 13.3
{0x32, 0}, // 32 -16.4 -49.0 -58.5 -58.5 -57.7 -52.0 13.3
{0x1B, 4}, // 1B -16.8 -49.3 -58.6 -58.4 -57.8 -52.3 13.0
{0x1A, 6}, // 1A -17.5 -49.7 -58.5 -58.4 -57.8 -52.6 12.9
{0x19, 8}, // 19 -18.3 -50.2 -58.5 -58.5 -57.6 -52.8 12.8
{0x18, 10}, // 18 -19.3 -50.6 -58.5 -58.5 -57.7 -53.1 12.7
{0x22, 0}, // 22 -19.4 -50.7 -58.5 -58.5 -57.8 -53.1 12.8
{0x0F, 3}, // F -19.7 -50.9 -58.5 -58.5 -57.7 -52.9 12.6
{0x0E, 5}, // E -20.2 -51.2 -58.6 -58.5 -57.8 -53.3 12.6
{0x17, 1}, // 17 -20.3 -51.2 -58.6 -58.5 -57.8 -53.1 12.6
{0x0D, 5}, // D -20.8 -51.4 -58.5 -58.5 -57.8 -53.2 12.5
{0x0C, 5}, // C -21.4 -51.8 -58.4 -58.5 -57.7 -53.4 12.5
{0x16, 0}, // 16 -21.4 -51.9 -58.5 -58.5 -57.7 -53.4 12.5
{0x31, 3}, // 31 -21.7 -52.0 -58.5 -58.4 -57.8 -53.4 12.7
{0x0B, 3}, // B -22.0 -52.2 -58.5 -58.4 -57.9 -53.6 12.4
{0x0A, 6}, // A -22.7 -52.6 -58.5 -58.4 -57.7 -53.6 12.4
{0x15, 1}, // 15 -22.8 -52.7 -58.5 -58.4 -57.8 -53.6 12.4
{0x09, 6}, // 9 -23.5 -53.1 -58.5 -58.5 -57.7 -54.0 12.3
{0x6D, 3}, // 6D -23.8 -50.2 -58.5 -58.4 -57.6 -55.3 15.5
{0x08, 5}, // 8 -24.3 -53.6 -58.4 -58.4 -57.6 -54.1 12.3
{0x14, 0}, // 14 -24.4 -53.7 -58.6 -58.4 -57.8 -53.9 12.3
{0x21, 2}, // 21 -24.6 -53.6 -58.6 -58.4 -57.8 -53.9 12.4
{0x07, 5}, // 7 -25.2 -54.1 -58.6 -58.4 -57.7 -54.0 12.2
{0x13, 10}, // 13 -26.2 -54.6 -58.4 -58.5 -57.7 -54.3 12.2
{0x06, 0}, // 6 -26.2 -54.6 -58.5 -58.3 -57.7 -54.3 12.2
{0x05, 11}, // 5 -27.3 -55.3 -58.4 -58.4 -57.8 -54.5 12.1
{0x12, 13}, // 12 -28.6 -55.9 -58.6 -58.5 -57.7 -54.7 12.1
{0x04, 0}, // 4 -28.6 -56.1 -58.5 -58.4 -57.8 -54.5 12.0
{0x03, 11}, // 3 -29.8 -56.9 -58.5 -58.4 -57.7 -54.7 12.0
{0x02, 13}, // 2 -31.2 -57.5 -58.4 -58.4 -57.9 -54.7 11.9
{0x11, 1}, // 11 -31.3 -57.6 -58.6 -58.3 -57.8 -54.7 12.0
{0x01, 14}, // 1 -32.7 -58.4 -58.4 -58.4 -57.7 -54.7 11.9
{0x10, 8}, // 10 -33.6 -58.6 -58.5 -58.3 -57.8 -54.8 11.9
{0x20, 1}, // 20 -33.7 -58.6 -58.5 -58.3 -57.9 -54.6 12.0
{0x30, 0}, // 30 -33.7 -58.5 -58.5 -58.4 -57.7 -54.9 12.1
{0x00, 245}, // 0 -58.2 -58.5 -58.6 -58.3 -57.6 -54.1 11.2
{0x6E, 62}, // 6E -64.5 -58.8 -58.5 -58.4 -57.7 -55.5 16.0
{0x6F, 52}, // 6F -69.7 -58.6 -58.6 -58.4 -57.7 -55.3 10.7
};
*/
} // namespace cc1101
} // namespace esphome
+57
View File
@@ -0,0 +1,57 @@
#pragma once
namespace esphome {
namespace cc1101 {
#ifndef SUB_TEXT
#define SUB_TEXT(name) \
protected: \
text::Text *name##_text_{nullptr}; \
\
public: \
void set_##name##_text(text::Text *text) { this->name##_text_ = text; }
#endif
#define CC1101_SUB_NUMBER(name, type) \
SUB_NUMBER(name) \
void publish_##name() { this->publish_(this->name##_number_, (float) this->get_##name()); } \
void set_##name(type value); \
type get_##name();
#define CC1101_SUB_SWITCH(name) \
SUB_SWITCH(name) \
void publish_##name() { this->publish_switch_(this->name##_switch_, this->get_##name()); } \
void set_##name(bool value); \
bool get_##name();
#define CC1101_SUB_SELECT(name, type) \
SUB_SELECT(name) \
void publish_##name() { this->publish_select_(this->name##_select_, (size_t) this->get_##name()); } \
void set_##name(type value); \
type get_##name();
#define CC1101_SUB_TEXT(name) \
SUB_TEXT(name) \
void publish_##name() { this->publish_(this->name##_text_, this->get_##name()); } \
void set_##name(const std::string &value); \
std::string get_##name();
#define CC1101_SUB_SENSOR(name) \
SUB_SENSOR(name) \
void publish_##name##_sensor() { this->publish_(this->name##_sensor_, (float) this->get_##name##_sensor()); } \
float get_##name##_sensor();
#define CC1101_SUB_BINARY_SENSOR(name) \
SUB_BINARY_SENSOR(name) \
void publish_##name##_binary_sensor() { \
this->publish_(this->name##_binary_sensor_, this->get_##name##_binary_sensor()); \
} \
bool get_##name##_binary_sensor();
#define CC1101_SUB_TEXT_SENSOR(name) \
SUB_TEXT_SENSOR(name) \
void publish_##name##_text_sensor() { this->publish_(this->name##_text_sensor_, this->get_##name##_text_sensor()); } \
std::string get_##name##_text_sensor();
} // namespace cc1101
} // namespace esphome
+204
View File
@@ -0,0 +1,204 @@
import esphome.codegen as cg
from esphome.components import number
import esphome.config_validation as cv
from esphome.const import (
CONF_CHANNEL,
CONF_FREQUENCY,
CONF_MODE,
DEVICE_CLASS_FREQUENCY,
DEVICE_CLASS_SIGNAL_STRENGTH,
ENTITY_CATEGORY_CONFIG,
UNIT_DECIBEL,
UNIT_DECIBEL_MILLIWATT,
)
from .. import (
CC1101_COMPONENT_SCHEMA,
CONF_AGC,
CONF_BANDWIDTH,
CONF_CARRIER_SENSE_ABS_THR,
CONF_CC1101_ID,
CONF_CHANNEL_SPACING,
CONF_FSK_DEVIATION,
CONF_IF_FREQUENCY,
CONF_MSK_DEVIATION,
CONF_OUTPUT_POWER,
CONF_SYMBOL_RATE,
CONF_TUNER,
UNIT_KILO_HERTZ,
for_each_conf,
ns,
)
NumberMode = number.NumberMode
OutputPowerNumber = ns.class_("OutputPowerNumber", number.Number)
TunerFrequencyNumber = ns.class_("TunerFrequencyNumber", number.Number)
TunerIfFrequencyNumber = ns.class_("TunerIfFrequencyNumber", number.Number)
TunerBandwidthNumber = ns.class_("TunerBandwidthNumber", number.Number)
TunerChannelNumber = ns.class_("TunerChannelNumber", number.Number)
TunerChannelSpacingNumber = ns.class_("TunerChannelSpacingNumber", number.Number)
TunerFskDeviationNumber = ns.class_("TunerFskDeviationNumber", number.Number)
TunerMskDeviationNumber = ns.class_("TunerMskDeviationNumber", number.Number)
TunerSymbolRateNumber = ns.class_("TunerSymbolRateNumber", number.Number)
AgcCarrierSenseAbsThrNumber = ns.class_("AgcCarrierSenseAbsThrNumber", number.Number)
TYPES = {
None: {
CONF_OUTPUT_POWER: [
number.number_schema(
OutputPowerNumber,
unit_of_measurement=UNIT_DECIBEL_MILLIWATT,
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.OUTPUT_POWER_MIN,
ns.OUTPUT_POWER_MAX,
0.1,
NumberMode.NUMBER_MODE_SLIDER,
],
},
CONF_TUNER: {
CONF_FREQUENCY: [
number.number_schema(
TunerFrequencyNumber,
unit_of_measurement=UNIT_KILO_HERTZ,
device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.FREQUENCY_MIN,
ns.FREQUENCY_MAX,
1,
],
CONF_IF_FREQUENCY: [
number.number_schema(
TunerIfFrequencyNumber,
unit_of_measurement=UNIT_KILO_HERTZ,
device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.IF_FREQUENCY_MIN,
ns.IF_FREQUENCY_MAX,
0.001,
],
CONF_BANDWIDTH: [
number.number_schema(
TunerBandwidthNumber,
unit_of_measurement=UNIT_KILO_HERTZ,
device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.BANDWIDTH_MIN,
ns.BANDWIDTH_MAX,
0.001,
],
CONF_CHANNEL: [
number.number_schema(
TunerChannelNumber,
# unit_of_measurement=,
# device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.CHANNEL_MIN,
ns.CHANNEL_MAX,
1,
# NumberMode.NUMBER_MODE_BOX,
],
CONF_CHANNEL_SPACING: [
number.number_schema(
TunerChannelSpacingNumber,
unit_of_measurement=UNIT_KILO_HERTZ,
device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.CHANNEL_SPACING_MIN,
ns.CHANNEL_SPACING_MAX,
0.001,
],
CONF_FSK_DEVIATION: [
number.number_schema(
TunerFskDeviationNumber,
unit_of_measurement=UNIT_KILO_HERTZ,
device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.FSK_DEVIATION_MIN,
ns.FSK_DEVIATION_MAX,
0.001,
],
CONF_MSK_DEVIATION: [
number.number_schema(
TunerMskDeviationNumber,
# unit_of_measurement=,
# device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.MSK_DEVIATION_MIN,
ns.MSK_DEVIATION_MAX,
1,
],
CONF_SYMBOL_RATE: [
number.number_schema(
TunerSymbolRateNumber,
# unit_of_measurement=,
# device_class=DEVICE_CLASS_FREQUENCY,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.SYMBOL_RATE_MIN,
ns.SYMBOL_RATE_MAX,
1,
],
},
CONF_AGC: {
CONF_CARRIER_SENSE_ABS_THR: [
number.number_schema(
AgcCarrierSenseAbsThrNumber,
unit_of_measurement=UNIT_DECIBEL,
device_class=DEVICE_CLASS_SIGNAL_STRENGTH,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
ns.CARRIER_SENSE_ABS_THR_MIN,
ns.CARRIER_SENSE_ABS_THR_MAX,
1,
],
},
}
CONFIG_SCHEMA = CC1101_COMPONENT_SCHEMA.extend(
{cv.Optional(k): v[0] for k, v in TYPES[None].items()},
{
cv.Optional(CONF_TUNER): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_TUNER].items()}
),
cv.Optional(CONF_AGC): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_AGC].items()}
),
},
)
async def to_code(config):
parent = await cg.get_variable(config[CONF_CC1101_ID])
async def new_number(c, args, setter):
# only override mode when it's set to auto in user config
if CONF_MODE not in c or c[CONF_MODE] == NumberMode.NUMBER_MODE_AUTO:
if len(args) > 3 and args[3] is not None:
c[CONF_MODE] = args[3]
n = await number.new_number(
c, min_value=args[0], max_value=args[1], step=args[2]
)
await cg.register_parented(n, parent)
cg.add(getattr(parent, setter + "_number")(n))
await for_each_conf(config, TYPES, new_number)
+51
View File
@@ -0,0 +1,51 @@
#pragma once
#include "esphome/components/number/number.h"
#include "../cc1101.h"
#include <cmath>
namespace esphome {
namespace cc1101 {
// maybe there is a way to specialize type dependent member pointers
template<void (CC1101Component::*F)(float)>
class NumberFloat : public number::Number, public Parented<CC1101Component> {
protected:
void control(float value) override {
this->publish_state(value);
(this->parent_->*F)(value);
}
};
template<void (CC1101Component::*F)(uint8_t)>
class NumberUInt8 : public number::Number, public Parented<CC1101Component> {
protected:
void control(float value) override {
this->publish_state(value);
(this->parent_->*F)((uint8_t) lround(value));
}
};
template<void (CC1101Component::*F)(int8_t)>
class NumberInt8 : public number::Number, public Parented<CC1101Component> {
protected:
void control(float value) override {
this->publish_state(value);
(this->parent_->*F)((int8_t) lround(value));
}
};
using OutputPowerNumber = NumberFloat<&CC1101Component::set_output_power>;
using TunerFrequencyNumber = NumberFloat<&CC1101Component::set_tuner_frequency>;
using TunerIfFrequencyNumber = NumberFloat<&CC1101Component::set_tuner_if_frequency>;
using TunerBandwidthNumber = NumberFloat<&CC1101Component::set_tuner_bandwidth>;
using TunerChannelNumber = NumberUInt8<&CC1101Component::set_tuner_channel>;
using TunerChannelSpacingNumber = NumberFloat<&CC1101Component::set_tuner_channel_spacing>;
using TunerFskDeviationNumber = NumberFloat<&CC1101Component::set_tuner_fsk_deviation>;
using TunerMskDeviationNumber = NumberUInt8<&CC1101Component::set_tuner_msk_deviation>;
using TunerSymbolRateNumber = NumberFloat<&CC1101Component::set_tuner_symbol_rate>;
using AgcCarrierSenseAbsThrNumber = NumberInt8<&CC1101Component::set_agc_carrier_sense_abs_thr>;
} // namespace cc1101
} // namespace esphome
+178
View File
@@ -0,0 +1,178 @@
import esphome.codegen as cg
from esphome.components import select
import esphome.config_validation as cv
from esphome.const import CONF_WAIT_TIME, ENTITY_CATEGORY_CONFIG
from .. import (
CARRIER_SENSE_REL_THR,
CC1101_COMPONENT_SCHEMA,
CONF_AGC,
CONF_CARRIER_SENSE_REL_THR,
CONF_CC1101_ID,
CONF_FILTER_LENGTH_ASK_OOK,
CONF_FILTER_LENGTH_FSK_MSK,
CONF_FREEZE,
CONF_HYST_LEVEL,
CONF_MAGN_TARGET,
CONF_MAX_DVGA_GAIN,
CONF_MAX_LNA_GAIN,
CONF_MODULATION,
CONF_RX_ATTENUATION,
CONF_SYNC_MODE,
CONF_TUNER,
FILTER_LENGTH_ASK_OOK,
FILTER_LENGTH_FSK_MSK,
FREEZE,
HYST_LEVEL,
MAGN_TARGET,
MAX_DVGA_GAIN,
MAX_LNA_GAIN,
MODULATION,
RX_ATTENUATION,
SYNC_MODE,
WAIT_TIME,
for_each_conf,
ns,
)
RxAttenuationSelect = ns.class_("RxAttenuationSelect", select.Select)
TunerSyncModeSelect = ns.class_("TunerSyncModeSelect", select.Select)
TunerModulationSelect = ns.class_("TunerModulationSelect", select.Select)
AgcMagnTargetSelect = ns.class_("AgcMagnTargetSelect", select.Select)
AgcMaxLnaGainSelect = ns.class_("AgcMaxLnaGainSelect", select.Select)
AgcMaxDvgaGainSelect = ns.class_("AgcMaxDvgaGainSelect", select.Select)
AgcCarrierSenseRelThrSelect = ns.class_("AgcCarrierSenseRelThrSelect", select.Select)
AgcFilterLengthFskMskSelect = ns.class_("AgcFilterLengthFskMskSelect", select.Select)
AgcFilterLengthAskOokSelect = ns.class_("AgcFilterLengthAskOokSelect", select.Select)
AgcFreezeSelect = ns.class_("AgcFreezeSelect", select.Select)
AgcWaitTimeSelect = ns.class_("AgcWaitTimeSelect", select.Select)
AgcHystLevelSelect = ns.class_("AgcHystLevelSelect", select.Select)
TYPES = {
None: {
CONF_RX_ATTENUATION: [
select.select_schema(
RxAttenuationSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
RX_ATTENUATION,
],
},
CONF_TUNER: {
CONF_SYNC_MODE: [
select.select_schema(
TunerSyncModeSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
SYNC_MODE,
],
CONF_MODULATION: [
select.select_schema(
TunerModulationSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
MODULATION,
],
},
CONF_AGC: {
CONF_MAGN_TARGET: [
select.select_schema(
AgcMagnTargetSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
MAGN_TARGET,
],
CONF_MAX_LNA_GAIN: [
select.select_schema(
AgcMaxLnaGainSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
MAX_LNA_GAIN,
],
CONF_MAX_DVGA_GAIN: [
select.select_schema(
AgcMaxDvgaGainSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
MAX_DVGA_GAIN,
],
CONF_CARRIER_SENSE_REL_THR: [
select.select_schema(
AgcCarrierSenseRelThrSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
CARRIER_SENSE_REL_THR,
],
CONF_FILTER_LENGTH_FSK_MSK: [
select.select_schema(
AgcFilterLengthFskMskSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
FILTER_LENGTH_FSK_MSK,
],
CONF_FILTER_LENGTH_ASK_OOK: [
select.select_schema(
AgcFilterLengthAskOokSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
FILTER_LENGTH_ASK_OOK,
],
CONF_FREEZE: [
select.select_schema(
AgcFreezeSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
FREEZE,
],
CONF_WAIT_TIME: [
select.select_schema(
AgcWaitTimeSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
WAIT_TIME,
],
CONF_HYST_LEVEL: [
select.select_schema(
AgcHystLevelSelect,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
HYST_LEVEL,
],
},
}
CONFIG_SCHEMA = CC1101_COMPONENT_SCHEMA.extend(
{cv.Optional(k): v[0] for k, v in TYPES[None].items()},
{
cv.Optional(CONF_TUNER): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_TUNER].items()}
),
cv.Optional(CONF_AGC): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_AGC].items()}
),
},
)
async def to_code(config):
parent = await cg.get_variable(config[CONF_CC1101_ID])
async def new_select(c, args, setter):
s = await select.new_select(c, options=list(args[0].keys()))
await cg.register_parented(s, parent)
cg.add(getattr(parent, setter + "_select")(s))
await for_each_conf(config, TYPES, new_select)
+34
View File
@@ -0,0 +1,34 @@
#pragma once
#include "esphome/components/select/select.h"
#include "../cc1101.h"
namespace esphome {
namespace cc1101 {
template<class T, void (CC1101Component::*F)(T)>
class Select : public select::Select, public Parented<CC1101Component> {
protected:
void control(const std::string &value) override {
this->publish_state(value);
if (auto index = this->active_index()) {
(this->parent_->*F)((T) *index);
}
}
};
using RxAttenuationSelect = Select<RxAttenuation, &CC1101Component::set_rx_attenuation>;
using TunerSyncModeSelect = Select<SyncMode, &CC1101Component::set_tuner_sync_mode>;
using TunerModulationSelect = Select<Modulation, &CC1101Component::set_tuner_modulation>;
using AgcMagnTargetSelect = Select<MagnTarget, &CC1101Component::set_agc_magn_target>;
using AgcMaxLnaGainSelect = Select<MaxLnaGain, &CC1101Component::set_agc_max_lna_gain>;
using AgcMaxDvgaGainSelect = Select<MaxDvgaGain, &CC1101Component::set_agc_max_dvga_gain>;
using AgcCarrierSenseRelThrSelect = Select<CarrierSenseRelThr, &CC1101Component::set_agc_carrier_sense_rel_thr>;
using AgcFilterLengthFskMskSelect = Select<FilterLengthFskMsk, &CC1101Component::set_agc_filter_length_fsk_msk>;
using AgcFilterLengthAskOokSelect = Select<FilterLengthAskOok, &CC1101Component::set_agc_filter_length_ask_ook>;
using AgcFreezeSelect = Select<Freeze, &CC1101Component::set_agc_freeze>;
using AgcWaitTimeSelect = Select<WaitTime, &CC1101Component::set_agc_wait_time>;
using AgcHystLevelSelect = Select<HystLevel, &CC1101Component::set_agc_hyst_level>;
} // namespace cc1101
} // namespace esphome
+78
View File
@@ -0,0 +1,78 @@
import esphome.codegen as cg
from esphome.components import switch
import esphome.config_validation as cv
from esphome.const import DEVICE_CLASS_SWITCH, ENTITY_CATEGORY_CONFIG
from .. import (
CC1101_COMPONENT_SCHEMA,
CONF_AGC,
CONF_CARRIER_SENSE_ABOVE_THRESHOLD,
CONF_CC1101_ID,
CONF_DC_BLOCKING_FILTER,
CONF_LNA_PRIORITY,
CONF_TUNER,
for_each_conf,
ns,
)
DcBlockingFilterSwitch = ns.class_("DcBlockingFilterSwitch", switch.Switch)
CarrierSenseAboveThresholdSwitch = ns.class_(
"CarrierSenseAboveThresholdSwitch", switch.Switch
)
AgcLnaPrioritySwitch = ns.class_("AgcLnaPrioritySwitch", switch.Switch)
TYPES = {
None: {
CONF_DC_BLOCKING_FILTER: [
switch.switch_schema(
DcBlockingFilterSwitch,
device_class=DEVICE_CLASS_SWITCH,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
],
},
CONF_TUNER: {
CONF_CARRIER_SENSE_ABOVE_THRESHOLD: [
switch.switch_schema(
CarrierSenseAboveThresholdSwitch,
device_class=DEVICE_CLASS_SWITCH,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
],
},
CONF_AGC: {
CONF_LNA_PRIORITY: [
switch.switch_schema(
AgcLnaPrioritySwitch,
device_class=DEVICE_CLASS_SWITCH,
entity_category=ENTITY_CATEGORY_CONFIG,
# icon=ICON_,
),
],
},
}
CONFIG_SCHEMA = CC1101_COMPONENT_SCHEMA.extend(
{cv.Optional(k): v[0] for k, v in TYPES[None].items()},
{
cv.Optional(CONF_TUNER): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_TUNER].items()}
),
cv.Optional(CONF_AGC): cv.Schema(
{cv.Optional(k): v[0] for k, v in TYPES[CONF_AGC].items()}
),
},
)
async def to_code(config):
parent = await cg.get_variable(config[CONF_CC1101_ID])
async def new_switch(c, args, setter):
s = await switch.new_switch(c)
await cg.register_parented(s, parent)
cg.add(getattr(parent, setter + "_switch")(s))
await for_each_conf(config, TYPES, new_switch)
+22
View File
@@ -0,0 +1,22 @@
#pragma once
#include "esphome/components/switch/switch.h"
#include "../cc1101.h"
namespace esphome {
namespace cc1101 {
template<void (CC1101Component::*F)(bool)> class Switch : public switch_::Switch, public Parented<CC1101Component> {
protected:
void write_state(bool value) override {
this->publish_state(value);
(this->parent_->*F)(value);
}
};
using DcBlockingFilterSwitch = Switch<&CC1101Component::set_dc_blocking_filter>;
using CarrierSenseAboveThresholdSwitch = Switch<&CC1101Component::set_tuner_carrier_sense_above_threshold>;
using AgcLnaPrioritySwitch = Switch<&CC1101Component::set_agc_lna_priority>;
} // namespace cc1101
} // namespace esphome
+133
View File
@@ -0,0 +1,133 @@
from typing import Optional
import esphome.codegen as cg
from esphome.components import mqtt, text, web_server
import esphome.config_validation as cv
from esphome.const import (
CONF_ENTITY_CATEGORY,
CONF_ICON,
CONF_ID,
CONF_MQTT_ID,
CONF_WEB_SERVER,
ENTITY_CATEGORY_CONFIG,
)
from esphome.core import CORE
from esphome.cpp_generator import MockObjClass
from esphome.cpp_helpers import setup_entity
from .. import CC1101_COMPONENT_SCHEMA, CONF_CC1101_ID, for_each_conf, ns
CONF_DUMMY_TEXT = "dummy_text"
ICON_FORMAT_TEXT = "mdi:format-text"
DummyText = ns.class_("DummyText", text.Text)
# The text component isn't implemented the same way as switch, select, number.
# It is not possible to create our own text platform as it is now, so I adopted
# the necessary code from those.
_TEXT_SCHEMA = (
cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA)
.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA)
.extend(
{
cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTTextComponent),
}
)
)
_UNDEF = object()
def text_schema(
class_: MockObjClass = _UNDEF,
*,
entity_category: str = _UNDEF,
device_class: str = _UNDEF,
icon: str = _UNDEF,
):
schema = _TEXT_SCHEMA
if class_ is not _UNDEF:
schema = schema.extend({cv.GenerateID(): cv.declare_id(class_)})
if entity_category is not _UNDEF:
schema = schema.extend(
{
cv.Optional(
CONF_ENTITY_CATEGORY, default=entity_category
): cv.entity_category
}
)
if icon is not _UNDEF:
schema = schema.extend({cv.Optional(CONF_ICON, default=icon): cv.icon})
return schema
TEXT_SCHEMA = text_schema() # for compatibility
async def setup_text_core_(
var,
config,
*,
min_length: Optional[int],
max_length: Optional[int],
pattern: Optional[str],
):
await setup_entity(var, config)
cg.add(var.traits.set_min_length(min_length))
cg.add(var.traits.set_max_length(max_length))
if pattern is not None:
cg.add(var.traits.set_pattern(pattern))
if (mqtt_id := config.get(CONF_MQTT_ID)) is not None:
mqtt_ = cg.new_Pvariable(mqtt_id, var)
await mqtt.register_mqtt_component(mqtt_, config)
if web_server_config := config.get(CONF_WEB_SERVER):
await web_server.add_entity_config(var, web_server_config)
async def register_text(
var,
config,
min_length: Optional[int] = 0,
max_length: Optional[int] = 255,
pattern: Optional[str] = None,
):
if not CORE.has_id(config[CONF_ID]):
var = cg.Pvariable(config[CONF_ID], var)
cg.add(cg.App.register_text(var))
await setup_text_core_(
var, config, min_length=min_length, max_length=max_length, pattern=pattern
)
TYPES = {
None: {
CONF_DUMMY_TEXT: [
text_schema(
DummyText,
entity_category=ENTITY_CATEGORY_CONFIG,
icon=ICON_FORMAT_TEXT,
),
0,
64,
]
},
}
CONFIG_SCHEMA = CC1101_COMPONENT_SCHEMA.extend(
{cv.Optional(k): v[0] for k, v in TYPES[None].items()},
)
async def to_code(config):
parent = await cg.get_variable(config[CONF_CC1101_ID])
async def new_text(c, args, setter):
var = cg.new_Pvariable(c[CONF_ID])
await register_text(var, c, min_length=args[0], max_length=args[1])
await cg.register_parented(var, parent)
cg.add(getattr(parent, setter + "_text")(var))
await for_each_conf(config, TYPES, new_text)
+18
View File
@@ -0,0 +1,18 @@
#pragma once
#include "esphome/components/text/text.h"
#include "../cc1101.h"
namespace esphome {
namespace cc1101 {
class DummyText : public text::Text, public Parented<CC1101Component> {
protected:
void control(const std::string &value) override {
this->publish_state(value);
// this->parent_->set_dummy_text(value);
}
};
} // namespace cc1101
} // namespace esphome