diff options
Diffstat (limited to 'confui')
| -rw-r--r-- | confui/mesh_connector.cpp | 26 | ||||
| -rw-r--r-- | confui/mesh_connector.h | 21 | ||||
| -rw-r--r-- | confui/ui_automation.cpp | 4 | ||||
| -rw-r--r-- | confui/ui_node.cpp | 2 | 
4 files changed, 34 insertions, 19 deletions
| diff --git a/confui/mesh_connector.cpp b/confui/mesh_connector.cpp index 2630da6..c77c159 100644 --- a/confui/mesh_connector.cpp +++ b/confui/mesh_connector.cpp @@ -4,6 +4,7 @@  #include <cstring>  #include <stdio.h> +#include "../shared/pclient.h"  #include "mesh_connector.h"  using std::pair; @@ -99,7 +100,7 @@ map<cd_link_t, cd_s_automation *> CDMeshConnector::get_links(bool valid) {  	return links;  } -void CDMeshConnector::update_link(cd_s_automation *automation) { +void CDMeshConnector::update_link(cd_s_automation *automation, bool publish) {  	printf("link[%d]", automation->id);  	if (automation->valid) {  		printf(" = %.*s %s %.*s", (int)automation->button->name_len, automation->button->name, @@ -111,9 +112,16 @@ void CDMeshConnector::update_link(cd_s_automation *automation) {  		printf(" (invalid)");  	}  	printf("\n"); + +	if (!publish) return; +	if (!automation->valid) return; + +	cd_s_bin* msg = cd_cmd_gen_post_link_add(automation->button->uuid, automation->light->uuid, automation->type); +	cd_pclient_send(msg); +	free(msg);  } -cd_link_t CDMeshConnector::create_link(cd_uid_t button, cd_uid_t light, enum cd_e_automation_type type) { +cd_link_t CDMeshConnector::create_link(cd_uid_t button, cd_uid_t light, cd_e_automation_type type) {  	cd_link_t id = get_new_link_id();  	cd_s_automation *automation = (cd_s_automation *)malloc(sizeof(cd_s_automation)); @@ -147,11 +155,17 @@ cd_link_t CDMeshConnector::create_link() {  	return id;  } -void CDMeshConnector::remove_link(cd_link_t link_handle) { +void CDMeshConnector::remove_link(cd_link_t link_handle, bool publish) {  	printf("remove link[%d]\n", link_handle); -	if (_links[link_handle] != nullptr) free(_links[link_handle]); +	if (_links.count(link_handle) == 0) return; // invalid handle +	if (_links[link_handle] == nullptr) return; // already removed link + +	cd_s_bin* msg = cd_cmd_gen_post_link_rm(_links[link_handle]->button->uuid, _links[link_handle]->light->uuid); +	cd_pclient_send(msg); +	free(msg); + +	free(_links[link_handle]);  	_links[link_handle] = nullptr; -	return;  }  void CDMeshConnector::remove_node(cd_uid_t node_handle) { @@ -161,7 +175,7 @@ void CDMeshConnector::remove_node(cd_uid_t node_handle) {  	return;  } -void CDMeshConnector::update_node(cd_s_node *node_ptr) { +void CDMeshConnector::update_node(cd_s_node *node_ptr, bool publish) {  	printf("turning %.*s %s\n", (int)node_ptr->name_len, node_ptr->name, node_ptr->light_on ? "on" : "off");  	return;  } diff --git a/confui/mesh_connector.h b/confui/mesh_connector.h index 64ab471..8c1fc91 100644 --- a/confui/mesh_connector.h +++ b/confui/mesh_connector.h @@ -18,12 +18,10 @@ typedef uint32_t cd_uid_t;  /** @brief link/automation id type */  typedef uint32_t cd_link_t; -/** @brief automation types/actions */ -enum cd_e_automation_type { -	CD_AUTOMATION_TYPE_TOGGLE,	 /** @brief button toggles light */ -	CD_AUTOMATION_TYPE_TURN_ON,	 /** @brief button always turns on light (regardless of previous state) */ -	CD_AUTOMATION_TYPE_TURN_OFF, /** @brief button always turns off light (regardless of previous state) */ -}; +typedef cd_e_cmd_link_type cd_e_automation_type; +#define CD_AUTOMATION_TYPE_TOGGLE CD_CMD_LINK_TYPE_TOGGLE +#define CD_AUTOMATION_TYPE_TURN_ON CD_CMD_LINK_TYPE_TURN_ON +#define CD_AUTOMATION_TYPE_TURN_OFF CD_CMD_LINK_TYPE_TURN_OFF  /** @brief GUI node representation */  typedef struct { @@ -117,7 +115,7 @@ public:  	 * @param light  node id for node whose light will be used for this automation.  	 * @param action  action/automation type (toggle, on, off).  	 */ -	virtual cd_link_t create_link(cd_uid_t button, cd_uid_t light, enum cd_e_automation_type action); +	virtual cd_link_t create_link(cd_uid_t button, cd_uid_t light, cd_e_automation_type action);  	/**  	 * @brief overwrite link id with new automation and update on network.  	 * @@ -126,14 +124,16 @@ public:  	 * properties.  	 *  	 * @param automation  pointer to automation struct (with new/modified values) +	 * @param publish  `true` to send POST_LINK command  	 */ -	virtual void update_link(cd_s_automation *automation); +	virtual void update_link(cd_s_automation *automation, bool publish = false);  	/**  	 * @brief remove automation and update on network.  	 *  	 * @param link_handle  automation id +	 * @param publish  `true` to send POST_LINK command  	 */ -	virtual void remove_link(cd_link_t link_handle); +	virtual void remove_link(cd_link_t link_handle, bool publish = false);  	/**  	 * @brief overwrite node id with new node and update on network. @@ -142,8 +142,9 @@ public:  	 * allocated using malloc()). used to update existing node properties.  	 *  	 * @param node_ptr  pointer to node struct (with new/modified state) +	 * @param publish  `true` to send POST_LED command  	 */ -	virtual void update_node(cd_s_node *node_ptr); +	virtual void update_node(cd_s_node *node_ptr, bool publish = false);  	/**  	 * @brief provision node into network  	 * diff --git a/confui/ui_automation.cpp b/confui/ui_automation.cpp index eb6e1f6..2ade734 100644 --- a/confui/ui_automation.cpp +++ b/confui/ui_automation.cpp @@ -74,11 +74,11 @@ void CDAutomationWidget::apply() {  	if (!conf_valid()) return;  	_automation->button = g_cd_mesh_connector->get_node(dropdown_button->findData(dropdown_button->currentIndex())); -	_automation->type	= (enum cd_e_automation_type)dropdown_action->findData(dropdown_action->currentIndex()); +	_automation->type	= (cd_e_automation_type) dropdown_action->findData(dropdown_action->currentIndex());  	_automation->light	= g_cd_mesh_connector->get_node(dropdown_light->findData(dropdown_light->currentIndex()));  	_automation->valid	= true; -	g_cd_mesh_connector->update_link(_automation); +	g_cd_mesh_connector->update_link(_automation, true);  }  void CDAutomationWidget::remove() { diff --git a/confui/ui_node.cpp b/confui/ui_node.cpp index 552b62a..56ff004 100644 --- a/confui/ui_node.cpp +++ b/confui/ui_node.cpp @@ -54,7 +54,7 @@ void CDNodeWidget::toggle_provision() {  void CDNodeWidget::update_led(bool on) {  	_node->light_on = on; -	g_cd_mesh_connector->update_node(_node); +	g_cd_mesh_connector->update_node(_node, true);  	update();  } |