279 lines
8.6 KiB
C
279 lines
8.6 KiB
C
#include "mssdp/mssdp.h"
|
||
#include "device/device.h"
|
||
#include "camera.h"
|
||
#include "fs/fs.h"
|
||
#include "app_config.h"
|
||
#include "dev_desc.h"
|
||
#include "gpio.h"
|
||
#include "json_c/json.h"
|
||
#include "json_c/json_tokener.h"
|
||
#include "event/event.h"
|
||
|
||
|
||
static char json_buffer[1024];
|
||
static char MassProduction_mode = 0;
|
||
const char *__attribute__((weak))get_dev_desc_doc()
|
||
{
|
||
int ret;
|
||
|
||
memset(json_buffer, 0, 1024);
|
||
memcpy(json_buffer, DEV_DESC_CONTENT, strlen(DEV_DESC_CONTENT));
|
||
|
||
return json_buffer;
|
||
}
|
||
|
||
char get_MassProduction(void)
|
||
{
|
||
#ifdef CONFIG_MASS_PRODUCTION_ENABLE
|
||
#ifdef CONFIG_PRODUCTION_IO_PORT
|
||
char ret = MassProduction_mode;
|
||
|
||
if (!ret) {
|
||
gpio_set_die(CONFIG_PRODUCTION_IO_PORT, 1);
|
||
gpio_set_pull_up(CONFIG_PRODUCTION_IO_PORT, !CONFIG_PRODUCTION_IO_STATE);
|
||
gpio_set_pull_down(CONFIG_PRODUCTION_IO_PORT, CONFIG_PRODUCTION_IO_STATE);
|
||
gpio_direction_input(CONFIG_PRODUCTION_IO_PORT);
|
||
delay(1000);
|
||
ret = gpio_read(CONFIG_PRODUCTION_IO_PORT);
|
||
MassProduction_mode = (ret == CONFIG_PRODUCTION_IO_STATE) ? true : false;
|
||
ret = MassProduction_mode;
|
||
}
|
||
return ret;
|
||
#else
|
||
return 1;//1量产模式
|
||
#endif
|
||
#else
|
||
return 0;
|
||
#endif
|
||
}
|
||
|
||
const char *create_mssdp_notify_msg(char *msg, u16_t dev_online_flag)
|
||
{
|
||
char ip_addr[64];
|
||
extern char wifi_get_rssi(void);
|
||
extern void Get_IPAddress(char is_wireless, char *ipaddr);
|
||
extern int storage_device_ready();
|
||
Get_IPAddress(1, ip_addr);
|
||
|
||
#ifdef CONFIG_VIDEO_720P
|
||
sprintf(msg, "{\"RTSP\":\"rtsp://%s/avi_rt/front.hd\",\
|
||
\"SIGNAL\":\"%d\",\
|
||
\"SD_STATUS\":\"%d\",\
|
||
\"DEV_ONLINE_FLAG\":\"%d\"\
|
||
}", \
|
||
ip_addr, \
|
||
wifi_get_rssi(), \
|
||
storage_device_ready(), \
|
||
dev_online_flag);
|
||
#else
|
||
sprintf(msg, "{\"RTSP\":\"rtsp://%s/avi_rt/front.sd\",\
|
||
\"SIGNAL\":\"%d\",\
|
||
\"SD_STATUS\":\"%d\",\
|
||
\"DEV_ONLINE_FLAG\":\"%d\"\
|
||
}", \
|
||
ip_addr, \
|
||
wifi_get_rssi(), \
|
||
storage_device_ready(), \
|
||
dev_online_flag);
|
||
#endif
|
||
|
||
return msg;
|
||
|
||
}
|
||
u8 video0_dev_wr_reg(u8 addr, u8 data, u8 is_write, u8 close, u8 *logo)
|
||
{
|
||
int cmd;
|
||
int wr_data = 0;
|
||
static void *video_dev = NULL;
|
||
if (!video_dev) {
|
||
video_dev = dev_open("video0.0", NULL); //用来设置摄像头参数
|
||
if (!video_dev) {
|
||
printf("video open err \n");
|
||
return -EINVAL;
|
||
}
|
||
}
|
||
if (logo) {
|
||
dev_ioctl(video_dev, CAMERA_GET_SENSOR_TYPE, (u32)logo);
|
||
} else if (!close) {
|
||
if (is_write) {
|
||
cmd = CAMERA_WITE_BIT | addr;
|
||
wr_data = data;
|
||
dev_ioctl(video_dev, cmd, (u32)wr_data);
|
||
wr_data = 0;
|
||
} else {
|
||
cmd = CAMERA_READ_BIT | addr;
|
||
dev_ioctl(video_dev, cmd, (u32)&wr_data);
|
||
}
|
||
}
|
||
if (close) {
|
||
dev_close(video_dev);
|
||
video_dev = NULL;
|
||
}
|
||
return (u8)wr_data;
|
||
}
|
||
void mssdp_camera_sensor_reg_save(u8 addr, u8 value)
|
||
{
|
||
//addr,value拿到寄存器地址和寄存器值,用户自行保存到flash,这里只能保存1个寄存器地址和值
|
||
//TODO...
|
||
}
|
||
int mssdp_recv_get_param(char *mssdp_buf)
|
||
{
|
||
char *content = mssdp_buf;//MSSDP_TAB;
|
||
json_object *new_obj = NULL;
|
||
json_object *parm = NULL;
|
||
json_object *camera_obj = NULL;
|
||
json_object *addr_opj = NULL;
|
||
json_object *value_obj = NULL;
|
||
json_object *tmp = NULL;
|
||
char buf[32];
|
||
char *wlog = "write_reg";
|
||
char *rlog = "read_reg";
|
||
char *slog = "save_reg";
|
||
char logo[8];
|
||
char *str;
|
||
int str_len;
|
||
int err;
|
||
u8 addr;
|
||
u8 value;
|
||
u8 num = 0;
|
||
u8 read_reg;
|
||
u8 write_reg;
|
||
u32 flash_addr = 0;
|
||
extern int json_object_string_set(struct json_object * jso, const char *s, int len);
|
||
|
||
//分解content字段
|
||
new_obj = json_tokener_parse(content);
|
||
camera_obj = json_object_object_get(new_obj, "camera");
|
||
if (!camera_obj) {
|
||
camera_obj = json_object_object_get(new_obj, "CAMERA");
|
||
if (!camera_obj) {
|
||
printf("err no camera_table\n\n");
|
||
goto exit;
|
||
}
|
||
}
|
||
printf("--->recv cjson\n\n%s\n\n", content);
|
||
video0_dev_wr_reg(0, 0, 0, 0, logo);
|
||
for (char cnt = 0; cnt < 3; cnt++) {
|
||
num = 0;
|
||
do {
|
||
switch (cnt) {
|
||
case 0:
|
||
sprintf(buf, "%s%d", rlog, num++);
|
||
break;
|
||
case 1:
|
||
sprintf(buf, "%s%d", wlog, num++);
|
||
break;
|
||
case 2:
|
||
sprintf(buf, "%s%d", slog, num++);
|
||
break;
|
||
default:
|
||
goto exit;
|
||
}
|
||
parm = json_object_object_get(new_obj, buf);
|
||
if (parm) {
|
||
addr_opj = json_object_object_get(parm, "addr");
|
||
value_obj = json_object_object_get(parm, "value");
|
||
if (addr_opj && value_obj) {
|
||
addr = value = read_reg = 0;
|
||
str = json_object_get_string(addr_opj);
|
||
str_len = json_object_get_string_len(addr_opj);
|
||
if (str && str_len) {
|
||
addr = (u8)strtoul(str, NULL, 16);
|
||
}
|
||
str = json_object_get_string(value_obj);
|
||
str_len = json_object_get_string_len(value_obj);
|
||
if (str && str_len) {
|
||
value = (u8)strtoul(str, NULL, 16);
|
||
}
|
||
if (cnt < 2) {//读写摄像头寄存器
|
||
read_reg = (u8)video0_dev_wr_reg(addr, value, cnt, 0, NULL);
|
||
if (!cnt) {
|
||
if (!str || !str_len || (strstr(str, "0x") || strstr(str, "0X")) || !value) {
|
||
sprintf(buf, "0x%02x", read_reg);
|
||
} else {
|
||
str = json_object_get_string(addr_opj);
|
||
str_len = json_object_get_string_len(addr_opj);
|
||
if (!str || (!value && !(strstr(str, "0x") || strstr(str, "0X")))) {
|
||
sprintf(buf, "0x%02x", read_reg);
|
||
} else {
|
||
sprintf(buf, "%02x", read_reg);
|
||
}
|
||
}
|
||
err = json_object_string_set(value_obj, buf, strlen(buf));
|
||
if (err) {
|
||
printf("err in json_object_string_set = %d \n", err);
|
||
}
|
||
} else {
|
||
read_reg = (u8)video0_dev_wr_reg(addr, value, !cnt, 0, NULL);//读回来校验是否写成功
|
||
if (read_reg != value) {
|
||
video0_dev_wr_reg(addr, value, cnt ? 0 : 1, 0, NULL);//重写
|
||
}
|
||
}
|
||
} else {//addr,value拿到寄存器地址和寄存器值,用户自行保存到flash,这里只能保存1个寄存器地址和值
|
||
mssdp_camera_sensor_reg_save(addr, value);
|
||
}
|
||
}
|
||
}
|
||
} while (num < 32); //最多32项
|
||
}
|
||
sprintf(buf, "%s", logo);
|
||
err = json_object_string_set(camera_obj, buf, strlen(buf));//修改camera
|
||
if (err) {
|
||
printf("err in json_object_string_set = %d \n", err);
|
||
}
|
||
|
||
str = json_object_get_string(new_obj);//获取整个cjson
|
||
video0_dev_wr_reg(0, 0, 0, 1, NULL);
|
||
|
||
mssdp_set_user_msg((const char *)str, 2);
|
||
printf("--->send cjson\n\n%s\n\n", str);
|
||
|
||
exit:
|
||
json_object_put(new_obj);
|
||
return 0;
|
||
|
||
}
|
||
|
||
|
||
static void network_ssdp_cb(u32 dest_ipaddr, enum mssdp_recv_msg_type type, char *buf, void *priv)
|
||
{
|
||
char msg[128];
|
||
switch (type) {
|
||
case MSSDP_SEARCH_MSG:
|
||
printf("ssdp client[0x%x] search, %s\n", dest_ipaddr, buf);
|
||
break;
|
||
case MSSDP_BEFORE_SEND_NOTIFY_MSG:
|
||
if (get_MassProduction()) {
|
||
mssdp_set_notify_msg((const char *)create_mssdp_notify_msg(msg, 0), 2);
|
||
}
|
||
break;
|
||
case MSSDP_USER_MSG:
|
||
mssdp_recv_get_param(buf);
|
||
break;
|
||
default :
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
void network_mssdp_init(void)
|
||
{
|
||
char msg[128];
|
||
puts("mssdp run \n");
|
||
if (get_MassProduction()) {
|
||
mssdp_init("MSSDP_SEARCH ", "MSSDP_NOTIFY ", "MSSDP_REGISTER ", 3333, network_ssdp_cb, NULL);
|
||
mssdp_set_notify_msg((const char *)create_mssdp_notify_msg(msg, 0), 2);
|
||
} else {
|
||
mssdp_init("MSSDP_SEARCH ", "MSSDP_NOTIFY ", "MSSDP_REGISTER ", 3889, network_ssdp_cb, NULL);
|
||
mssdp_set_notify_msg((const char *)get_dev_desc_doc(), 60);
|
||
}
|
||
}
|
||
|
||
void network_mssdp_uninit(void)
|
||
{
|
||
mssdp_uninit();
|
||
}
|
||
|
||
|
||
|