Merge branch 'oopuuu:master' into master

This commit is contained in:
wsuow
2025-03-19 14:21:22 +08:00
committed by GitHub
8 changed files with 133 additions and 24 deletions

View File

@@ -163,7 +163,7 @@ static int HttpGetTc1Status(httpd_request_t *req) {
user_config->ap_name, user_config->ap_key, MQTT_SERVER, MQTT_SERVER_PORT,
MQTT_SERVER_USR, MQTT_SERVER_PWD,
VERSION, ip_status.ip, ip_status.mask, ip_status.gateway, user_config->mqtt_report_freq,
user_config->power_led_enabled, 0L,socket_names);
user_config->power_led_enabled, 0L,socket_names,childLockEnabled);
OSStatus err = kNoErr;
send_http(tc1_status, strlen(tc1_status), exit, &err);
@@ -213,6 +213,27 @@ static int HttpSetSocketName(httpd_request_t *req) {
return err;
}
static int HttpSetChildLock(httpd_request_t *req) {
OSStatus err = kNoErr;
int buf_size = 32;
char *buf = malloc(buf_size);
err = httpd_get_data(req, buf, buf_size);
require_noerr(err, exit);
int enableLock;
sscanf(buf, "%d",&enableLock);
user_config->user[0] = enableLock;
childLockEnabled = enableLock;
mico_system_context_update(sys_config);
UserMqttSendChildLockState();
send_http("OK", 2, exit, &err);
exit:
if (buf) free(buf);
return err;
}
static int HttpGetPowerInfo(httpd_request_t *req) {
OSStatus err = kNoErr;
char buf[16];
@@ -243,7 +264,7 @@ static int HttpGetPowerInfo(httpd_request_t *req) {
user_config->socket_names[4],
user_config->socket_names[5]);
sprintf(power_info_json, POWER_INFO_JSON, sockets, power_record.idx, PW_NUM, p_count, powers,
up_time,user_config->power_led_enabled,RelayOut()?1:0,socket_names,user_config->p_count_1_day_ago,user_config->p_count_2_days_ago);
up_time,user_config->power_led_enabled,RelayOut()?1:0,socket_names,user_config->p_count_1_day_ago,user_config->p_count_2_days_ago,childLockEnabled);
send_http(power_info_json, strlen(power_info_json), exit, &err);
if (socket_names) free(socket_names);
exit:
@@ -546,6 +567,7 @@ const struct httpd_wsgi_call g_app_handlers[] = {
{"/led", HTTPD_HDR_DEFORT, 0, LedStatus, LedSetEnabled, NULL, NULL},
{"/socketAll", HTTPD_HDR_DEFORT, 0, NULL, TotalSocketSetEnabled, NULL, NULL},
{"/socketNames", HTTPD_HDR_DEFORT, 0, NULL, HttpSetSocketName, NULL, NULL},
{"/childLock", HTTPD_HDR_DEFORT, 0, NULL, HttpSetChildLock, NULL, NULL},
};
static int g_app_handlers_no = sizeof(g_app_handlers) / sizeof(struct httpd_wsgi_call);

View File

@@ -65,10 +65,11 @@
'reportFreq':'%d',\
'ledEnabled':%d,\
'up_time':%ld,\
'socketNames':'%s'\
'socketNames':'%s',\
'child_lock_enabled':%d\
}"
#define POWER_INFO_JSON "{'sockets':'%s','idx':%d,'len':%d,'p_count':%ld,'powers':[%s],'up_time':'%s','led_enabled':%d,'total_switch_on':%d,'socketNames':'%s','p_count_today':%ld,'p_count_yesterday':%ld}"
#define POWER_INFO_JSON "{'sockets':'%s','idx':%d,'len':%d,'p_count':%ld,'powers':[%s],'up_time':'%s','led_enabled':%d,'total_switch_on':%d,'socketNames':'%s','p_count_1_day_ago':%ld,'p_count_2_days_ago':%ld,'child_lock_enabled':%d}"
int AppHttpdStart(void);

View File

@@ -122,6 +122,18 @@
-->
<ul id="socket_ul" class="demo-list-control mdl-list">
<li class="mdl-list__item">
<span class="mdl-list__item-primary-content">
<span class="lang" langKey="ChildLock">启用童锁</span>
</span>
<span class="mdl-list__item-secondary-action">
<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect"
for="list-switch-child-lock">
<input type="checkbox" id="list-switch-child-lock" class="mdl-switch__input"
checked/>
</label>
</span>
</li>
<li class="mdl-list__item">
<span class="mdl-list__item-primary-content">
<span class="lang" langKey="Led">电源指示灯</span>
</span>
@@ -696,7 +708,8 @@
//主页
Socket: {en: "Socket", cn: "插座"},
Led:{en: "PowerLed", cn: "电源指示灯"},
SocketAll:{en: "Total switch", cn: "总开关"}
SocketAll:{en: "Total Switch", cn: "总开关"},
ChildLock:{en: "Child Lock", cn: "童锁"}
}
function ChangeLanguage(lang) {
if (lang == "jp") {
@@ -783,15 +796,15 @@
var names_arr = status.socketNames.split(",");
var switchTexts = document.querySelectorAll('.mdl-list__item-primary-content');
for (var i = 0; i < status_arr.length; i++) {
var langSpan = switchTexts[i+2].querySelector('.lang');
var indexSpan = switchTexts[i+2].querySelector('.socket-index');
var langSpan = switchTexts[i+3].querySelector('.lang');
var indexSpan = switchTexts[i+3].querySelector('.socket-index');
if (langSpan) langSpan.textContent = names_arr[i]; // 修改插座名称
if (indexSpan) indexSpan.textContent = ""; // 修改序号,可自定义起始数字
//checkboxs[i].checked = status_arr[i] == "1";
if (status_arr[i] == "1") {
switch_lables[i+2].MaterialSwitch.on();
switch_lables[i+3].MaterialSwitch.on();
} else {
switch_lables[i+2].MaterialSwitch.off();
switch_lables[i+3].MaterialSwitch.off();
}
}
@@ -856,17 +869,17 @@
var checkboxs = socket_ul.getElementsByClassName("mdl-switch__input");
var switch_lables = socket_ul.getElementsByClassName("mdl-switch");
$(".mdl-switch__input").on("click", function() {
if("list-switch-all" == this.id){
if("list-switch-all" == this.id||"list-switch-child-lock"== this.id){
return;
}
var sockets_st = "";
for (var i = 2; i < checkboxs.length; i++) {
for (var i = 3; i < checkboxs.length; i++) {
sockets_st += (checkboxs[i].checked ? "1," : "0,");
}
HttpPost("/socket", function (re) {
}, sockets_st);
HttpPost("/led", function (re) {
}, checkboxs[0].checked ? "1" : "0");
}, checkboxs[1].checked ? "1" : "0");
});
@@ -904,7 +917,11 @@
document.getElementById("list-switch-all").addEventListener("click", function() {
HttpPost("/socketAll", function (re) {
}, checkboxs[1].checked ? "1" : "0");});
}, checkboxs[2].checked ? "1" : "0");});
document.getElementById("list-switch-child-lock").addEventListener("click", function() {
HttpPost("/childLock", function (re) {
}, checkboxs[0].checked ? "1" : "0");});
//Socket-end
@@ -1058,34 +1075,41 @@
$("#uptime").html(power.up_time);
var w_v = (17.1 * power.p_count) / 1000 / 36000;
w.innerHTML = w_v.toFixed(2);
var w_v_t = (17.1 * power.p_count_today) / 1000 / 36000;
w_t.innerHTML = w_v_t.toFixed(2);
var w_v_y = (17.1 * power.p_count_yesterday) / 1000 / 36000;
w_y.innerHTML = w_v_y.toFixed(2);
if (power.led_enabled == 1) {
w.innerHTML = w_v.toFixed(3);
var w_v_t = (17.1 * (power.p_count - power.p_count_1_day_ago)) / 1000 / 36000;
w_v_t = w_v_t < 0 ? 0 : w_v_t;
w_t.innerHTML = w_v_t.toFixed(3);
var w_v_y = (17.1 * power.p_count_1_day_ago - power.p_count_2_days_ago) / 1000 / 36000;
w_v_y = w_v_y < 0 ? 0 : w_v_t;
w_y.innerHTML = w_v_y.toFixed(3);
if (power.child_lock_enabled == 1) {
switch_lables[0].MaterialSwitch.on();
} else {
switch_lables[0].MaterialSwitch.off();
}
if (power.total_switch_on == 1) {
if (power.led_enabled == 1) {
switch_lables[1].MaterialSwitch.on();
} else {
switch_lables[1].MaterialSwitch.off();
}
if (power.total_switch_on == 1) {
switch_lables[2].MaterialSwitch.on();
} else {
switch_lables[2].MaterialSwitch.off();
}
var status_arr = power.sockets.split(",");
var names_arr = power.socketNames.split(",");
var switchTexts = document.querySelectorAll('.mdl-list__item-primary-content');
for (var i = 0; i < status_arr.length; i++) {
//checkboxs[i].checked = status_arr[i] == "1";
var langSpan = switchTexts[i+2].querySelector('.lang');
var indexSpan = switchTexts[i+2].querySelector('.socket-index');
var langSpan = switchTexts[i+3].querySelector('.lang');
var indexSpan = switchTexts[i+3].querySelector('.socket-index');
if (langSpan) langSpan.textContent = names_arr[i]; // 修改插座名称
if (indexSpan) indexSpan.textContent = ""; // 修改序号,可自定义起始数字
if (status_arr[i] == "1") {
switch_lables[i+2].MaterialSwitch.on();
switch_lables[i+3].MaterialSwitch.on();
} else {
switch_lables[i+2].MaterialSwitch.off();
switch_lables[i+3].MaterialSwitch.off();
}
}

View File

@@ -145,6 +145,7 @@ int application_start(void) {
}
MicoSysLed(0);
childLockEnabled = (int)user_config->user[0];
if (user_config->version != USER_CONFIG_VERSION) { tc1_log("WARNGIN: user params restored!");
err = mico_system_context_restore(sys_config);
require_noerr(err, exit);

View File

@@ -75,6 +75,7 @@ extern char str_mac[16];
extern system_config_t* sys_config;
extern user_config_t* user_config;
extern mico_gpio_t Relay[Relay_NUM];
extern int childLockEnabled;
#endif

View File

@@ -76,6 +76,7 @@ void UserMqttTimerFunc(void *arg) {
case 0:
UserMqttHassAutoLed();
UserMqttHassAutoTotalSocket();
UserMqttHassAutoChildLock();
break;
case 1:
case 2:
@@ -264,6 +265,7 @@ void MqttClientThread(mico_thread_arg_t arg) {
UserMqttSendLedState();
UserMqttSendTotalSocketState();
UserMqttSendChildLockState();
mico_init_timer(&timer_handle, 150, UserMqttTimerFunc, &arg);
registerMqttEvents();
@@ -411,6 +413,14 @@ void ProcessHaCmd(char *cmd) {
UserMqttSendSocketState(i);
}
UserMqttSendTotalSocketState();
}else if (strcmp(cmd, "set childLock") == ' ') {
int on;
sscanf(cmd, "set childLock %s %d", mac, &on);
if (strcmp(mac, str_mac)) return;mqtt_log("set childLock on[%d]", on);
user_config->user[0] = on;
childLockEnabled = on;
UserMqttSendChildLockState();
mico_system_context_update(sys_config);
}
}
@@ -499,6 +509,21 @@ OSStatus UserMqttSendLedState(void) {
return oss_status;
}
OSStatus UserMqttSendChildLockState(void) {
char *send_buf = malloc(64);
char *topic_buf = malloc(64);
OSStatus oss_status = kUnknownErr;
if (send_buf != NULL && topic_buf != NULL) {
sprintf(topic_buf, "homeassistant/switch/%s/childLock/state", str_mac);
sprintf(send_buf, "set childLock %s %d", str_mac, childLockEnabled);
oss_status = UserMqttSendTopic(topic_buf, send_buf, 1);
}
if (send_buf) free(send_buf);
if (topic_buf) free(topic_buf);
return oss_status;
}
//hass mqtt鑷姩鍙戠幇鏁版嵁寮<E5B581>鍏冲彂閫<E5BD82>
void UserMqttHassAuto(char socket_id) {
socket_id--;
@@ -561,6 +586,35 @@ void UserMqttHassAutoLed(void) {
free(topic_buf);
}
void UserMqttHassAutoChildLock(void) {
char *send_buf = NULL;
char *topic_buf = NULL;
send_buf = (char *) malloc(600);
topic_buf = (char *) malloc(64);
if (send_buf != NULL && topic_buf != NULL) {
sprintf(topic_buf, "homeassistant/switch/%s/childLock/config", str_mac);
sprintf(send_buf,
"{\"name\":\"童锁\","
"\"uniq_id\":\"tc1_%s_child_lock\","
"\"object_id\":\"tc1_%s_child_lock\","
"\"stat_t\":\"homeassistant/switch/%s/childLock/state\","
"\"cmd_t\":\"device/ztc1/set\","
"\"pl_on\":\"set childLock %s 1\","
"\"pl_off\":\"set childLock %s 0\","
"\"device\":{"
"\"identifiers\":[\"tc1_%s\"],"
"\"name\":\"TC1\","
"\"model\":\"TC1\","
"\"manufacturer\":\"PHICOMM\"}}",
str_mac,str_mac,str_mac, str_mac, str_mac, str_mac);
UserMqttSendTopic(topic_buf, send_buf, 1);
}
if (send_buf)
free(send_buf);
if (topic_buf)
free(topic_buf);
}
void UserMqttHassAutoTotalSocket(void) {
char *send_buf = NULL;
char *topic_buf = NULL;

View File

@@ -31,6 +31,8 @@ extern OSStatus UserMqttSendSocketState(char socket_id);
extern OSStatus UserMqttSendLedState(void);
extern OSStatus UserMqttSendChildLockState(void);
extern OSStatus UserMqttSendTotalSocketState(void);
extern void UserMqttHassAuto(char socket_id);
@@ -41,6 +43,8 @@ extern void UserMqttHassAutoPower(void);
extern void UserMqttHassAutoLed(void);
extern void UserMqttHassAutoChildLock(void);
extern void UserMqttHassAutoTotalSocket(void);
extern void registerMqttEvents(void);

View File

@@ -122,6 +122,8 @@ uint16_t key_time = 0;
#define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s
static void KeyTimeoutHandler(void *arg) {
if(childLockEnabled)
return;
static char key_trigger, key_continue;
//按键扫描程序
char tmp = ~(0xfe | MicoGpioInputGet(Button));