mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-12 21:18:13 +08:00
209 lines
4.4 KiB
C
209 lines
4.4 KiB
C
#define os_log(format, ...) custom_log("KEY", format, ##__VA_ARGS__)
|
|
|
|
#include "main.h"
|
|
#include "user_gpio.h"
|
|
#include "user_mqtt_client.h"
|
|
#include "user_udp.h"
|
|
#include "cJSON/cJSON.h"
|
|
|
|
mico_gpio_t relay[Relay_NUM] = { Relay_0, Relay_1, Relay_2, Relay_3, Relay_4, Relay_5 };
|
|
|
|
void user_led_set(char x)
|
|
{
|
|
if (x == -1)
|
|
MicoGpioOutputTrigger(Led);
|
|
else if (x)
|
|
MicoGpioOutputHigh(Led);
|
|
else
|
|
MicoGpioOutputLow(Led);
|
|
}
|
|
|
|
bool relay_out(void)
|
|
{
|
|
int i;
|
|
for (i = 0; i < PLUG_NUM; i++)
|
|
{
|
|
if (user_config->plug[i].on != 0)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const unsigned char* get_socket_status()
|
|
{
|
|
sprintf(socket_status, "%d,%d,%d,%d,%d,%d",
|
|
user_config->plug[0].on,
|
|
user_config->plug[1].on,
|
|
user_config->plug[2].on,
|
|
user_config->plug[3].on,
|
|
user_config->plug[4].on,
|
|
user_config->plug[5].on);
|
|
return (const unsigned char*)socket_status;
|
|
}
|
|
|
|
void set_socket_status(char* socket_status)
|
|
{
|
|
int ons[6] = { 0 };
|
|
sscanf(socket_status, "%d,%d,%d,%d,%d,%d,",
|
|
&ons[0], &ons[1], &ons[2], &ons[3], &ons[4], &ons[5]);
|
|
int i = 0;
|
|
for (i = 0; i < PLUG_NUM; i++)
|
|
{
|
|
user_relay_set(i, ons[i]);
|
|
}
|
|
}
|
|
|
|
/*user_relay_set
|
|
* 设置继电器开关
|
|
* i:编号 0-5
|
|
* on:开关 0:关 1:开
|
|
*/
|
|
void user_relay_set(unsigned char i, unsigned char on)
|
|
{
|
|
if (i >= PLUG_NUM) return;
|
|
|
|
if (on == Relay_ON)
|
|
{
|
|
MicoGpioOutputHigh(relay[i]);
|
|
}
|
|
else
|
|
{
|
|
MicoGpioOutputLow(relay[i]);
|
|
}
|
|
|
|
user_config->plug[i].on = on;
|
|
|
|
if (relay_out())
|
|
{
|
|
user_led_set(1);
|
|
}
|
|
else
|
|
{
|
|
user_led_set(0);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* 设置所有继电器开关
|
|
* y: 0:全部关 1:全部开
|
|
*
|
|
*/
|
|
void user_relay_set_all(char y)
|
|
{
|
|
int i;
|
|
for (i = 0; i < PLUG_NUM; i++)
|
|
user_relay_set(i, y);
|
|
}
|
|
|
|
static void key_long_press(void)
|
|
{
|
|
// os_log("key_long_press");
|
|
// user_led_set(1);
|
|
// user_mqtt_send("mqtt test");
|
|
}
|
|
|
|
static void key_long_10s_press(void)
|
|
{
|
|
os_log("WARNGIN: user params restored!");
|
|
// char i = 0;
|
|
// for (i = 0; i < 3; i++)
|
|
// {
|
|
// user_led_set(1);
|
|
// mico_rtos_thread_msleep(100);
|
|
// user_led_set(0);
|
|
// }
|
|
//
|
|
appRestoreDefault_callback(user_config, sizeof(user_config_t));
|
|
sys_config->micoSystemConfig.ssid[0] = 0;
|
|
mico_system_context_update(mico_system_context_get());
|
|
}
|
|
static void key_short_press(void)
|
|
{
|
|
char i;
|
|
|
|
if (relay_out())
|
|
{
|
|
user_relay_set_all(0);
|
|
}
|
|
else
|
|
{
|
|
user_relay_set_all(1);
|
|
}
|
|
|
|
for (i = 0; i < PLUG_NUM; i++)
|
|
{
|
|
user_mqtt_send_plug_state(i);
|
|
}
|
|
}
|
|
mico_timer_t user_key_timer;
|
|
uint16_t key_time = 0;
|
|
#define BUTTON_LONG_PRESS_TIME 10 //100ms*10=1s
|
|
|
|
static void key_timeout_handler(void* arg)
|
|
{
|
|
static char key_trigger, key_continue;
|
|
//按键扫描程序
|
|
char tmp = ~(0xfe | MicoGpioInputGet(Button));
|
|
key_trigger = tmp & (tmp ^ key_continue);
|
|
key_continue = tmp;
|
|
// os_log("button scan:%02x %02x",key_trigger,key_continue);
|
|
if (key_trigger != 0) key_time = 0; //新按键按下时,重新开始按键计时
|
|
if (key_continue != 0)
|
|
{
|
|
//any button pressed
|
|
key_time++;
|
|
if (key_time <= BUTTON_LONG_PRESS_TIME)
|
|
{
|
|
os_log("button long pressed:%d",key_time);
|
|
|
|
if (key_time == 30)
|
|
{
|
|
key_long_press();
|
|
}
|
|
else if (key_time == 100)
|
|
{
|
|
key_long_10s_press();
|
|
}
|
|
else if (key_time == 102)
|
|
{
|
|
user_led_set(1);
|
|
}
|
|
else if (key_time == 103)
|
|
{
|
|
user_led_set(0);
|
|
key_time = 101;
|
|
}
|
|
}
|
|
|
|
} else
|
|
{
|
|
//button released
|
|
if (key_time < BUTTON_LONG_PRESS_TIME)
|
|
{ //100ms*10=1s 大于1s为长按
|
|
key_time = 0;
|
|
os_log("button short pressed:%d",key_time);
|
|
key_short_press();
|
|
} else if (key_time > 100)
|
|
{
|
|
MicoSystemReboot();
|
|
}
|
|
mico_rtos_stop_timer(&user_key_timer);
|
|
}
|
|
}
|
|
|
|
static void key_falling_irq_handler(void* arg)
|
|
{
|
|
mico_rtos_start_timer(&user_key_timer);
|
|
}
|
|
void key_init(void)
|
|
{
|
|
MicoGpioInitialize(Button, INPUT_PULL_UP);
|
|
mico_rtos_init_timer(&user_key_timer, 100, key_timeout_handler, NULL);
|
|
|
|
MicoGpioEnableIRQ(Button, IRQ_TRIGGER_FALLING_EDGE, key_falling_irq_handler, NULL);
|
|
|
|
}
|
|
|