aboutsummaryrefslogtreecommitdiff
path: root/confui/mesh_connector.cpp
blob: f2d5ca2f8817ecc500e21775e26206df24e762ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <cstdio>
#include <cstring>
#include <algorithm>

#include "mesh_connector.h"

using std::pair;

cd_link_t CDMeshConnector::get_new_map_id() {
	return _fresh_map_id++;
}

CDMeshConnector::CDMeshConnector() {
	printf("adding dummy node and automation...\n");

	char* temp_node_berta_name = (char*) malloc(5);
	strncpy(temp_node_berta_name, "berta", 5);

	cd_s_node* temp_node_berta = (cd_s_node*) malloc(sizeof(cd_s_node));
	temp_node_berta->name = temp_node_berta_name;
	temp_node_berta->name_len = 5;
	temp_node_berta->light_on = false;
	temp_node_berta->provisioned = false;
	cd_mac_addr_t temp_node_berta_address = { 0x00, 0xff, 0x21, 0x69, 0xf2, 0x31 };
	strncpy((char*)temp_node_berta->address, (char*)&temp_node_berta_address, 6);

	_nodes.push_back(temp_node_berta);
	set_link(temp_node_berta, temp_node_berta, CD_AUTOMATION_TYPE_TOGGLE);
	return;
}

CDMeshConnector::~CDMeshConnector() {
	map<cd_link_t, cd_s_automation*> links = get_links();
	vector<cd_s_node*> nodes = get_nodes();

	// free all automation structs
	for (pair<cd_link_t, cd_s_automation*> link : links)
		remove_link(link.first);

	// free all node structs
	for (cd_s_node* node : nodes)
		if (node != nullptr) free(node);

	return;
}

void CDMeshConnector::refresh_config_sync() {
	return;
}

void CDMeshConnector::refresh_nodes_sync() {
	return;
}

vector<cd_s_node*> CDMeshConnector::get_nodes() {
	return _nodes;
}

map<cd_link_t, cd_s_automation*> CDMeshConnector::get_links() {
	return _links;
}

vector<cd_s_automation*> CDMeshConnector::get_config() {
	vector<cd_s_automation*> automations;
	map<cd_link_t, cd_s_automation*> links = get_links();
	for (pair<cd_link_t, cd_s_automation*> link : links)
		automations.push_back(link.second);
	return automations;
}

cd_link_t CDMeshConnector::set_link(cd_s_node* button, cd_s_node* light, enum cd_e_automation_type action) {
	cd_s_automation* automation = (cd_s_automation*) malloc(sizeof(cd_s_automation));
	automation->button = button;
	automation->light = light;
	automation->type = action;

	cd_link_t link = get_new_map_id();
	_links[link] = automation;

	printf("new link[%d]: %.*s %s %.*s\n", link, (int) button->name_len, button->name, action == CD_AUTOMATION_TYPE_TOGGLE ? "toggles" : action == CD_AUTOMATION_TYPE_TURN_OFF ? "turns off" : "turns on", (int) light->name_len, light->name);
	return link;
}

void CDMeshConnector::remove_link(cd_link_t link_handle) {
	printf("remove link[%d]\n", link_handle);
	if (_links[link_handle] != nullptr) free(_links[link_handle]);
	_links.erase(link_handle);
	return;
}

cd_s_node* CDMeshConnector::get_node_by_id(cd_mac_addr_t address) {
	cd_s_node* node = std::find_if(_nodes.begin(), _nodes.end(),
		[address] (const cd_s_node* n) {
			return strncmp((char*)n->address, (char*)address, 6);
		})[0];
	return node;
}

void CDMeshConnector::set_node(cd_s_node* node_ptr, bool light_status) {
	node_ptr->light_on = light_status;
	printf("turning %.*s %s\n", (int) node_ptr->name_len, node_ptr->name, node_ptr->light_on ? "on" : "off");
	return;
}

void CDMeshConnector::node_join_network(cd_s_node* node_ptr) {
	node_ptr->provisioned = true;
	printf("join %.*s into network\n", (int) node_ptr->name_len, node_ptr->name);
	return;
}

void CDMeshConnector::node_remove_network(cd_s_node* node_ptr) {
	node_ptr->provisioned = false;
	printf("remove %.*s from network\n", (int) node_ptr->name_len, node_ptr->name);
	return;
}

string cd_node_mac_string(cd_mac_addr_t mac) {
	char* addr = nullptr;
	asprintf(&addr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
	string ret = addr;
	free(addr);
	return ret;
}