Bug fixes and switch
This commit is contained in:
114
optoma_rs232.cpp
114
optoma_rs232.cpp
@@ -14,20 +14,19 @@ static const char *QUERIES[] = {
|
||||
"~00150 1\r", // Info
|
||||
};
|
||||
|
||||
template<typename C, typename M> static void publish(C *c, M m) {
|
||||
template<typename C, typename M> static void publish(C *c, const M &m) {
|
||||
if (c)
|
||||
c->publish_state(m);
|
||||
}
|
||||
|
||||
void OptomaRS232Component::publish_input_(const std::string &state) const {
|
||||
#ifdef USE_SELECT
|
||||
if (beamer_input_select_)
|
||||
beamer_input_select_->publish_state(state);
|
||||
#endif
|
||||
#ifdef USE_TEXT_SENSOR
|
||||
if (beamer_input_text_sensor_)
|
||||
beamer_input_text_sensor_->publish_state(state);
|
||||
#endif
|
||||
publish(beamer_input_select_, state);
|
||||
publish(beamer_input_text_sensor_, state);
|
||||
}
|
||||
|
||||
void OptomaRS232Component::publish_power_(const bool state) const {
|
||||
publish(beamer_power_binary_sensor_, state);
|
||||
publish(beamer_power_switch_, state);
|
||||
}
|
||||
|
||||
void OptomaRS232Component::dump_config() {
|
||||
@@ -63,7 +62,7 @@ void OptomaRS232Component::loop() {
|
||||
}
|
||||
|
||||
void OptomaRS232Component::update() {
|
||||
last_query_ = (last_query_ + 1) % sizeof(QUERIES) / sizeof(QUERIES[0]);
|
||||
last_query_ = (last_query_ + 1) % std::size(QUERIES);
|
||||
write_array(reinterpret_cast<const uint8_t *>(QUERIES[last_query_]), strlen(QUERIES[last_query_]));
|
||||
}
|
||||
|
||||
@@ -90,13 +89,16 @@ void OptomaRS232Component::beamer_input_select_changed(const std::string &state,
|
||||
write_array(reinterpret_cast<const uint8_t *>(data), strlen(data));
|
||||
}
|
||||
|
||||
void OptomaRS232Component::beamer_power_switch_changed(const bool state) {
|
||||
const char *cmd = state ? "~0000 1\r" : "~0000 2\r";
|
||||
write_array(reinterpret_cast<const uint8_t *>(cmd), strlen(cmd));
|
||||
}
|
||||
|
||||
void OptomaRS232Component::process_line_(const std::string &str) {
|
||||
// if we are waiting for the projector to respond to a command.
|
||||
// it will respond P (pass) or F (fail) before giving us the actual response to the command.
|
||||
if (str == "P" || str == "F") {
|
||||
ESP_LOGD(TAG, "command response received");
|
||||
if (str == "P" || str == "F")
|
||||
return;
|
||||
}
|
||||
|
||||
// assuming any commands have been dealt with above, we listen for messages from the projector
|
||||
// the OK-something messages are in response to status queries, sometimes these are in caps, sometimes not
|
||||
@@ -104,23 +106,24 @@ void OptomaRS232Component::process_line_(const std::string &str) {
|
||||
// the INFO messages come in automatically when the projector changes state
|
||||
if ( // x == "OK1" || // status query returned power on
|
||||
str == "INFO1") { // warming up
|
||||
publish(beamer_power_binary_sensor_, true);
|
||||
publish_power_(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( // x == "OK0" || // status query returned power off
|
||||
str == "INFO2" || // cooling down
|
||||
str == "INFO0") { // going into standby
|
||||
publish(beamer_power_binary_sensor_, false);
|
||||
publish_power_(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (str_startswith(str, "OK")) {
|
||||
// ESP_LOGD(TAG, "OK-message: %s", str.c_str());
|
||||
process_query_response_(str);
|
||||
return;
|
||||
}
|
||||
|
||||
ESP_LOGD("projector", "unhandled message: %s", str.c_str());
|
||||
// ESP_LOGD("projector", "unhandled message: %s", str.c_str());
|
||||
}
|
||||
|
||||
void OptomaRS232Component::process_query_response_(const std::string &str) {
|
||||
@@ -135,43 +138,44 @@ void OptomaRS232Component::process_query_response_(const std::string &str) {
|
||||
case 2:
|
||||
publish(beamer_fan1_sensor_, strtol(str.c_str() + 2, 0, 10));
|
||||
break;
|
||||
case 3: {
|
||||
char buf[17]{};
|
||||
strncpy(buf, str.c_str(), sizeof(buf));
|
||||
publish(beamer_color_mode_sensor_, strtol(buf + 14, 0, 10));
|
||||
buf[14] = 0;
|
||||
case 3:
|
||||
if (str.length() >= 13) {
|
||||
char buf[17]{};
|
||||
strncpy(buf, str.c_str(), sizeof(buf));
|
||||
publish(beamer_color_mode_sensor_, strtol(buf + 14, 0, 10));
|
||||
buf[14] = 0;
|
||||
|
||||
// publish(beamer_firmware_,strtol(buf + 10, 0, 10));
|
||||
buf[10] = 0;
|
||||
// publish(beamer_firmware_,strtol(buf + 10, 0, 10));
|
||||
buf[10] = 0;
|
||||
|
||||
int input = strtol(buf + 8, 0, 10); // BUGGY
|
||||
switch (input) {
|
||||
case Inputs::HDMI_1:
|
||||
current_input_ = Inputs::HDMI_1;
|
||||
publish_input_("HDMI 1");
|
||||
break;
|
||||
case Inputs::HDMI_2:
|
||||
current_input_ = Inputs::HDMI_2;
|
||||
publish_input_("HDMI 2");
|
||||
break;
|
||||
case Inputs::VGA:
|
||||
current_input_ = Inputs::VGA;
|
||||
publish_input_("VGA");
|
||||
break;
|
||||
default:
|
||||
case Inputs::UNKNOWN:
|
||||
current_input_ = Inputs::UNKNOWN;
|
||||
publish_input_("Unknown");
|
||||
break;
|
||||
int input = strtol(buf + 8, 0, 10); // OK10041700C00900
|
||||
buf[8] = 0;
|
||||
switch (input) {
|
||||
case Inputs::HDMI_1:
|
||||
current_input_ = Inputs::HDMI_1;
|
||||
publish_input_("HDMI 1");
|
||||
break;
|
||||
case Inputs::HDMI_2:
|
||||
current_input_ = Inputs::HDMI_2;
|
||||
publish_input_("HDMI 2");
|
||||
break;
|
||||
case Inputs::VGA:
|
||||
current_input_ = Inputs::VGA;
|
||||
publish_input_("VGA");
|
||||
break;
|
||||
default:
|
||||
case Inputs::UNKNOWN:
|
||||
current_input_ = Inputs::UNKNOWN;
|
||||
publish_input_("Unknown");
|
||||
break;
|
||||
}
|
||||
|
||||
publish(beamer_lamp_time_sensor_, strtol(buf + 3, 0, 10));
|
||||
buf[3] = 0;
|
||||
|
||||
publish_power_(strtol(buf + 2, 0, 10));
|
||||
break;
|
||||
}
|
||||
buf[8] = 0;
|
||||
|
||||
publish(beamer_lamp_time_sensor_, strtol(buf + 3, 0, 10));
|
||||
buf[3] = 0;
|
||||
|
||||
publish(beamer_power_binary_sensor_, strtol(buf + 2, 0, 10));
|
||||
break;
|
||||
}
|
||||
default:;
|
||||
}
|
||||
}
|
||||
@@ -181,10 +185,18 @@ void OptomaRS232Component::process_query_response_(const std::string &str) {
|
||||
void InputSelect::control(const std::string &value) {
|
||||
this->publish_state(value);
|
||||
auto index = this->index_of(value);
|
||||
if (index.has_value())
|
||||
if (index.has_value() && this->parent_)
|
||||
this->parent_->beamer_input_select_changed(value, *index);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_SWITCH
|
||||
void PowerSwitch::write_state(const bool state) {
|
||||
this->publish_state(state);
|
||||
if (this->parent_)
|
||||
this->parent_->beamer_power_switch_changed(state);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace optoma_rs232
|
||||
} // namespace esphome
|
||||
|
||||
Reference in New Issue
Block a user