chore: migrate project into clean repository

This commit is contained in:
yuuux
2026-08-13 16:50:52 +08:00
commit d1d25a09e7
27405 changed files with 9422808 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(lsc_connect)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c)
add_subdirectory(net_conn)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,54 @@
.. _lsc_connect_sample:
平台连接
================================
概述
---------------------------
该示例演示如何和云端大模型建立连接
.. toctree::
:hidden:
../sample_build
.. include:: ../sample_build.rst
出现以下日志表示示例成功运行
.. code-block:: bash
[lsc_conn] ws data: 81, {"action":"connected","cid":"9a0b421aef94","code":"0","data":"","desc":"success"}
[lsc_core] [_lsc_core_conn_evt_cb] evt:conn data cjson
[main] evt : lsc connected
调用方法
---------------------------
- 初始化lsc服务并设置设备ID、产品ID、secret ID以及是否自动重连
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
.if_auto_reconn = true,
.reconn_interval_ms = 3000,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD
| LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
示例中所使用的API文档见 ::ref:`lsc_connect`

View File

@@ -0,0 +1,89 @@
#define TAG "main"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "lsc.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#include "lisa_semaphore.h"
extern int net_init(void);
extern int net_up(void);
extern int net_down(void);
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
lisa_semaphore_t *sem_connected;
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("evt : %s", STRINGS_LSC_EVT(evt));
switch (evt) {
case LSC_CONNECTED:
lisa_semaphore_give(sem_connected);
break;
default:
break;
}
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
int ret = 0;
net_init();
net_up();
sem_connected = lisa_semaphore_create(1);
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
.if_auto_reconn = true,
.reconn_interval_ms = 3000,
};
ret = lsc_init(&cfg);
if (ret) {
LISA_NLOGE("lsc_init faild(ret = %d)", ret);
return 0;
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
ret = lisa_semaphore_take(sem_connected, 3000);
if (ret) {
LISA_NLOGW("lsc_connect faild");
return 0;
}
lisa_thread_delay(3);
net_down();
lisa_thread_delay(10);
net_up();
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,4 @@
tests:
samples.lsc_connect.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,73 @@
编译
--------------------------------------
.. warning::
使用本例程前,需要正确配置宏 :literal:`DEVICE_ID_STRING`请先联系FAE注册对应的设备ID
各个sample中默认未定义 :literal:`DEVICE_ID_STRING`,若不手动定义此宏,示例代码是无法正常编译通过的。
.. note::
编译命令中的 :literal:`${SAMPLE_PATH}` 需要根据实际代码路径进行填写,如::literal:`samples/lsc_connect`
1. 方式一, 通过修改代码的方式在 :literal:`main.c` 中定义 :literal:`DEVICE_ID_STRING`
.. code-block:: c
#define DEVICE_ID_STRING "XXXXX"
定义:literal:`DEVICE_ID_STRING` 宏后再编译代码
.. tabs::
.. group-tab:: Ubuntu
.. code-block:: bash
cmake -B build -DDEFCONF_FILE=prj-linux.conf -S ${SAMPLE_PATH}
cmake --build build
.. group-tab:: Zephyr
.. code-block:: bash
west build -p -b csk6_duomotai_devkit ${SAMPLE_PATH}
2. 方式二,通过编译命令进行传递
或者通过通过编译命令传递
.. tabs::
.. group-tab:: Ubuntu
.. code-block:: bash
cmake -B build -DDEFCONF_FILE=prj-linux.conf -DDEVICE_ID_STRING="XXXXX" -S ${SAMPLE_PATH}
cmake --build build
.. group-tab:: Zephyr
.. code-block:: bash
west build -p -b csk6_duomotai_devkit ${SAMPLE_PATH} -- -DDEVICE_ID_STRING="XXXXX"
运行
---------------------------
.. tabs::
.. group-tab:: Ubuntu
成功编译后直接运行build目录下的可执行程序
.. code-block:: bash
./build/xxxxx
.. group-tab:: Zephyr
zephyr环境下将板子的DAP-USB连接电脑进行烧录和查看日志
.. code-block:: bash
west flash

View File

@@ -0,0 +1,10 @@
示例程序
===============================
.. toctree::
:maxdepth: 1
:caption: 示例程序
:glob:
*/README
*/*/README

View File

@@ -0,0 +1,47 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(objrec)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c)
add_subdirectory(net_conn)
target_link_libraries(app PRIVATE ls_chat)
set(gen_dir ${ZEPHYR_BINARY_DIR}/include/generated/)
generate_inc_file_for_target(app test.jpg ${gen_dir}/test.jpg.inc)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_compile_options(-ffunction-sections -fdata-sections)
add_executable(${PROJECT_NAME} main.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
set(gen_dir ${CMAKE_BINARY_DIR}/)
generate_inc_file_for_target(${PROJECT_NAME} test.jpg ${gen_dir}/test.jpg.inc)
target_include_directories(${PROJECT_NAME} PRIVATE ${gen_dir})
target_link_libraries(${PROJECT_NAME} PRIVATE "-Wl,--gc-sections")
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,83 @@
.. _objrec_sample:
==============================
物体识别
==============================
该示例演示了如何将一张jpg图片进行识别并获取识别的结果。
.. toctree::
:hidden:
../sample_build
.. include:: ../sample_build.rst
演示图片:
.. image:: test.jpg
在成功连接大模型平台后通过session_objrec_run接口将图片上传至大模型平台并同步等待平台下发结果
.. code-block:: c
......
err = session_objrec_run(objrec, test_img, sizeof(test_img), result, 10 * 1000);
if (err) {
LISA_NLOGE("session_objrec_run failed, err:%d", err);
session_objrec_delete(objrec);
lisa_mem_free(result);
return;
}
......
成功获取到识别结果后需要将结果中的text_url再次向云端进行请求获取到最终的文本结果
具体的文本数据会在lsc_sse_evt_cb_handle中进行回调
.. code-block:: c
struct lsc_stream_text_request_ctx *ctx =
lsc_stream_text_request_new(result->text_url, lsc_sse_evt_cb_handle, NULL);
if (ctx) {
err = lsc_stream_text_request_start(ctx, 10);
if (err) {
LISA_NLOGE("lsc_stream_text_request failed, err:%d", err);
}
lsc_stream_text_request_delete(ctx);
} else {
LISA_NLOGE("lsc_stream_text_request_ctx new failed");
}
成功请求数据后,将会打印以下日志
.. code-block:: bash
[stream_text] response content: event: data
data: 图片
[main] sse evt:0, data:图片
[stream_text] response content: event: data
data: 里面有一些
[main] sse evt:0, data:里面有一些
[stream_text] response content: event: data
data: 紫色的圆形
[main] sse evt:0, data:紫色的圆形
[stream_text] response content: event: data
data: 物体,看起来像是
[main] sse evt:0, data:物体,看起来像是
[stream_text] response content: event: data
data: 葡萄。
[main] sse evt:0, data:葡萄。
[stream_text] response content: event: done
data: [DONE]
示例中所使用的API文档见 ::ref:`session_objrec`

View File

@@ -0,0 +1,173 @@
#include "lisa_mem.h"
#define TAG "main"
#include "lsc.h"
#include "lsc_objrec.h"
#include "lsc_stream_text.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#include "lisa_semaphore.h"
#include <stdint.h>
#include <stddef.h>
#define PID "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SID "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
const uint8_t test_img[] = {
#include "test.jpg.inc"
};
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("lsc event:%d", evt);
if (evt == LSC_CONNECTED) {
lisa_semaphore_t *sem = usr;
if (sem) {
lisa_semaphore_give(sem);
}
}
}
static void lsc_sse_evt_cb_handle(int evt, const char *data, void *user)
{
LISA_NLOGI("sse evt:%d, data:%s", evt, data);
}
void sample_session_objrec_sync(void)
{
int err;
session_objrec_t objrec = session_objrec_new();
if (objrec == NULL) {
LISA_NLOGE("session_objrec_init failed");
return;
}
struct session_objrec_result *result = lisa_mem_alloc(sizeof(struct session_objrec_result));
if (result == NULL) {
LISA_NLOGE("session_objrec_result alloc failed");
session_objrec_delete(objrec);
return;
}
err = session_objrec_run(objrec, test_img, sizeof(test_img), result, 10 * 1000);
if (err) {
LISA_NLOGE("session_objrec_run failed, err:%d", err);
session_objrec_delete(objrec);
lisa_mem_free(result);
return;
}
/* got result, request the text */
struct lsc_stream_text_request_ctx *ctx =
lsc_stream_text_request_new(result->text_url, lsc_sse_evt_cb_handle, NULL);
if (ctx) {
err = lsc_stream_text_request_start(ctx, 10);
if (err) {
LISA_NLOGE("lsc_stream_text_request failed, err:%d", err);
}
lsc_stream_text_request_delete(ctx);
} else {
LISA_NLOGE("lsc_stream_text_request_ctx new failed");
}
session_objrec_delete(objrec);
lisa_mem_free(result);
LISA_NLOGI("session object sync run done");
}
static void sample_session_objrec_evt_cb_handle(session_objrec_t s, int evt, void *data, uint32_t data_len, void *user)
{
LISA_NLOGI("sample session objrec, evt:%d, data:%s", evt, (char *)data);
}
void sample_session_objrec_async(void)
{
int err;
session_objrec_t objrec = session_objrec_new();
if (objrec == NULL) {
LISA_NLOGE("session_objrec_init failed");
return;
}
err = session_objrec_run_async(objrec, test_img, sizeof(test_img), sample_session_objrec_evt_cb_handle, NULL);
if (err) {
LISA_NLOGE("session_objrec_run failed, err:%d", err);
session_objrec_delete(objrec);
return;
}
LISA_NLOGI("session object async run successfully");
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
int err;
lisa_semaphore_t *connected_sem = NULL;
connected_sem = lisa_semaphore_create(1);
if (connected_sem == NULL) {
LISA_NLOGE("connected semaphore creation failed");
return -1;
}
/* network connection */
net_init();
net_up();
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PID,
.secret_id = SID,
};
err = lsc_init(&cfg);
if (err) {
LISA_NLOGE("lsc_init failed, err:%d", err);
return -1;
}
err = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
connected_sem);
if (err) {
LISA_NLOGE("lsc_add_callback failed, err:%d", err);
return -1;
}
err = lsc_connect();
if (err) {
LISA_NLOGE("lsc_connect failed, err:%d", err);
return -1;
}
err = lisa_semaphore_take(connected_sem, 10 * 1000);
if (err) {
LISA_NLOGE("lisa_semaphore_take failed, err:%d", err);
return -1;
}
sample_session_objrec_sync();
sample_session_objrec_async();
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "testap", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=10240
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=40960
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,4 @@
tests:
samples.session_objrec.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,40 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(session_request)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c)
add_subdirectory(net_conn)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,56 @@
.. _session_request_sample:
服务请求
######################
概述
****
该示例演示了如何使用云端的语音合成服务将指定的本文进行语音合成并获取URL
.. toctree::
:hidden:
../sample_build
.. include:: ../sample_build.rst
调用方法
********
初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD
| LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
初始化请求会话
.. code-block:: c
session_request_init()
请求语音合成, 传入文本和超时时间云端将合成结果下发至request_url
.. code-block:: c
char text[] = "深圳天气";
session_request_xtts(text, request_url, 30000);
示例中所使用的API文档见 ::ref:`session_request`

View File

@@ -0,0 +1,98 @@
#define TAG "session_request"
#include "lisa_log.h"
#include "lisa_semaphore.h"
#include "lisa_thread.h"
#include "lsc.h"
#include "lsc_session_request.h"
#include "lsc_errno.h"
#include "lisa_mem.h"
#include <string.h>
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
char request_url[256];
lisa_semaphore_t *sem_connected;
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
switch (evt) {
case LSC_CONNECTED:
lisa_semaphore_give(sem_connected);
break;
default:
break;
}
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
sem_connected = lisa_semaphore_create(1);
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
if (ret) {
LISA_NLOGW("lsc_init faild");
return 0;
}
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
if (ret) {
LISA_NLOGW("lsc_add_callback faild");
return 0;
}
ret = lsc_connect();
ret |= lisa_semaphore_take(sem_connected, 1000);
if (ret) {
LISA_NLOGW("lsc_connect faild");
return 0;
}
ret = session_request_init();
if (ret) {
LISA_NLOGW("session_request_init faild");
return 0;
}
char text[] = "深圳天气";
memset((void *)request_url, 0, sizeof(request_url));
ret = session_request_xtts(text, request_url, 30000);
if (ret) {
LISA_NLOGW("session_request_xtts faild");
return 0;
}
LISA_NLOGI("get url:%s", request_url);
return 0;
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,4 @@
tests:
samples.session_request.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,40 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(session_text)
if (Zephyr_FOUND)
target_sources(app PRIVATE main.c)
add_subdirectory(net_conn)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,65 @@
.. _session_tetx_sample:
文本对话
######################
概述
****************************
该示例演示了如何将文本上传到云端并进行交互
.. toctree::
:hidden:
../sample_build
.. include:: ../sample_build.rst
调用方法
****************************
- 初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD
| LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
- 初始化文本会话
.. code-block:: c
session_text_init()
- 注册回调函数,并监听结果
.. code-block:: c
static void text_event_cb(session_text_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
session_text_add_evt_callback(text_event_cb, SESSION_TEXT_TTS_URL | SESSION_TEXT_REPLY_URL, NULL);
- 发送文本"深圳天气如何"到云端
.. code-block:: c
session_text_send("深圳天气如何");
示例中所使用的API文档见 ::ref:`session_text`

View File

@@ -0,0 +1,110 @@
#define TAG "main"
#include "lisa_log.h"
#include "lisa_semaphore.h"
#include "lisa_thread.h"
#include "lsc.h"
#include "lsc_session_text.h"
#include "lsc_errno.h"
#include "lisa_mem.h"
#include <string.h>
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
char request_url[256];
lisa_semaphore_t *sem_connected;
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
switch (evt) {
case LSC_CONNECTED:
lisa_semaphore_give(sem_connected);
break;
default:
break;
}
}
static void text_event_cb(session_text_event_e evt, void *data, uint32_t size, void *usr)
{
switch (evt) {
case SESSION_TEXT_TTS_URL:
LISA_NLOGI("tts_url: %s", (char *)data);
break;
case SESSION_TEXT_REPLY_URL:
LISA_NLOGI("reply url: %s", (char *)data);
break;
default:
break;
}
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
sem_connected = lisa_semaphore_create(1);
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
if (ret) {
LISA_NLOGW("lsc_init faild");
return 0;
}
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
if (ret) {
LISA_NLOGW("lsc_add_callback faild");
return 0;
}
ret = lsc_connect();
ret |= lisa_semaphore_take(sem_connected, 1000);
if (ret) {
LISA_NLOGW("lsc_connect faild");
return 0;
}
ret = session_text_init();
if (ret) {
LISA_NLOGW("session_text_init faild");
return 0;
}
ret = session_text_add_evt_callback(text_event_cb, SESSION_TEXT_TTS_URL | SESSION_TEXT_REPLY_URL, NULL);
ret = session_text_send("深圳天气如何");
if (ret) {
LISA_NLOGW("session_text_send faild");
return 0;
}
return 0;
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,5 @@
tests:
samples.session_text.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,44 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(chat_draw)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c chat_draw.c)
add_subdirectory(net_conn)
add_subdirectory(resource)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c chat_draw.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
set(gen_dir ${CMAKE_BINARY_DIR})
generate_inc_file_for_target(${PROJECT_NAME} resource/draw.pcm ${gen_dir}/draw.pcm.inc)
target_include_directories(${PROJECT_NAME} PRIVATE ${gen_dir})
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,79 @@
.. _chat_draw_sample:
语音画图
######################
概述
****
该示例程序介绍如何通过闲聊会话来让云端生成图片。将提前录音音频数据发送云端云端进行处理后生成图片下发url。
.. toctree::
:hidden:
../../sample_build
.. include:: ../../sample_build.rst
调用方法
********
- 初始化lsc服务并设置设备ID、产品ID、secret ID
调用lsc_init()初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
- 初始化闲聊会话
.. code-block:: c
session_voice_init()
- 注册回调函数,云端返回的结果会以事件的形式下发
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
session_voice_add_evt_callback(voice_event_cb, SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_REPLY_URL | SESSION_VOICE_DRAW,NULL);
- 设置会话参数使能云端vad功能
.. code-block:: c
session_voice_config_t config = {
.vad_enable = true,
.speex_size = 0,
.aue = "raw",
};
session_voice_set_config(&config);
- 启动会话,并上传语音数据
.. note:: draw_inc_file[]数组中存放的是录音("画一张奥特曼的照片")数据格式为16Khz, 16bit单通道PCM
.. code-block:: c
session_voice_start();
mock_record_audio_stream_send((uint8_t *)draw_inc_file, sizeof(draw_inc_file))
示例中所使用的API文档见 ::ref:`session_voice`

View File

@@ -0,0 +1,80 @@
#define TAG "chat_draw"
#include "lsc.h"
#include "lisa_mem.h"
#include "lsc_session_voice.h"
#include "lsc_errno.h"
#include "lisa_log.h"
#include "lisa_time.h"
#include "lisa_thread.h"
static const unsigned char draw_inc_file[] = {
#include <draw.pcm.inc>
};
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("[%s] evt:%d", __FUNCTION__, evt);
switch (evt) {
case SESSION_VOICE_GOT_VAD:
LISA_NLOGI("got vad");
break;
case SESSION_VOICE_TTS:
LISA_NLOGI("tts url:%s", (char *)data);
break;
case SESSION_VOICE_IAT:
LISA_NLOGI("iat:%s", (char *)data);
break;
case SESSION_VOICE_REPLY_URL:
LISA_NLOGI("reply url:%s", (char *)data);
break;
case SESSION_VOICE_DRAW:
LISA_NLOGI("draw url:%s", (char *)data);
break;
default:
break;
}
}
/*
模拟流式产生录音数据,
*/
static int mock_record_audio_stream_send(uint8_t *data, uint32_t size)
{
uint32_t remain_size = size;
uint8_t *ptr = data;
uint32_t send_size = 0;
LISA_NLOGI("[%s] size:%d", __FUNCTION__, size);
int ret = 0;
do {
send_size = (remain_size > 2560) ? 2560 : remain_size;
ret = session_voice_send_audio(ptr, send_size);
lisa_thread_mdelay(100);
ptr += send_size;
remain_size -= send_size;
} while (remain_size > 0);
return ret;
}
void chat_draw_proc(void)
{
int ret;
ret = session_voice_init();
ret = session_voice_add_evt_callback(
voice_event_cb, SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_REPLY_URL | SESSION_VOICE_DRAW,
NULL);
session_voice_config_t config = {
.vad_enable = true,
.speex_size = 0,
.aue = "raw",
};
ret = session_voice_set_config(&config);
ret = session_voice_start();
ret = mock_record_audio_stream_send((uint8_t *)draw_inc_file, sizeof(draw_inc_file));
}

View File

@@ -0,0 +1,59 @@
#define TAG "main"
#include "lsc.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("evt : %s", STRINGS_LSC_EVT(evt));
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
ret = lsc_connect();
lisa_thread_mdelay(3000);
extern void chat_draw_proc(void);
chat_draw_proc();
while (1) {
lisa_thread_mdelay(1000);
}
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,3 @@
set(gen_dir ${ZEPHYR_BINARY_DIR}/include/generated/)
generate_inc_file_for_target(app draw.pcm ${gen_dir}/draw.pcm.inc)

View File

@@ -0,0 +1,4 @@
tests:
samples.session_voice.chat_draw.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,50 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(chat_music)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c chat_music.c)
add_subdirectory(net_conn)
add_subdirectory(resource)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c chat_music.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
set(gen_dir ${CMAKE_BINARY_DIR})
generate_inc_file_for_target(${PROJECT_NAME} resource/play_music.pcm ${gen_dir}/play_music.pcm.inc)
generate_inc_file_for_target(${PROJECT_NAME} resource/last_music.pcm ${gen_dir}/last_music.pcm.inc)
generate_inc_file_for_target(${PROJECT_NAME} resource/next_music.pcm ${gen_dir}/next_music.pcm.inc)
generate_inc_file_for_target(${PROJECT_NAME} resource/resume_music.pcm ${gen_dir}/resume_music.pcm.inc)
generate_inc_file_for_target(${PROJECT_NAME} resource/pause_music.pcm ${gen_dir}/pause_music.pcm.inc)
target_include_directories(${PROJECT_NAME} PRIVATE ${gen_dir})
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,101 @@
.. _chat_music_sample:
音乐播放
######################
概述
****
该示例程序介绍如何通过闲聊会话来使用云端音乐服务
.. toctree::
:hidden:
../../sample_build
.. include:: ../../sample_build.rst
调用方法
********
- 初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
- 激活云端音乐技能
.. code-block:: c
lsc_activate_music();
- 初始化闲聊会话
.. code-block:: c
session_voice_init()
- 注册回调函数,云端返回的结果会以事件的形式下发
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
session_voice_add_evt_callback(voice_event_cb, SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_REPLY_URL | SESSION_VOICE_DRAW | SESSION_VOICE_MUSIC_INSTR | SESSION_VOICE_MUSIC_INSTR, NULL);
- 设置会话参数使能云端vad功能并配置设备ID
.. code-block:: c
session_voice_config_t config = {
.vad_enable = true,
.device_id = "F97CE114C70DE8E2",
.speex_size = 0,
.aue = "raw",
};
session_voice_set_config(&config);
- 启动会话,并上传语音数据
.. note:: play_music_inc_file[]数组中存放的是录音数据("播放一首歌")格式为16Khz, 16bit单通道PCM
.. code-block:: c
session_voice_start();
mock_record_audio_stream_send((uint8_t *)play_music_inc_file, sizeof(play_music_inc_file));
- 获取音乐列表请求音乐URL
.. note:: 获取到的音乐列表中包含有音乐id通过该id可以请求音乐的URL
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
case SESSION_VOICE_MUSIC_LISTS: {
session_voice_music_lists_t *item = (session_voice_music_lists_t *)data;
// 获取播放列表中第一首歌的URL
char music_url[256];
lsc_music_request_url(item->items[0].id, music_url);
} break;
}
示例中所使用的API文档见 ::ref:`session_voice`

View File

@@ -0,0 +1,120 @@
#define TAG "chat_music"
#include "lsc.h"
#include "lisa_mem.h"
#include "lsc_session_voice.h"
#include "lsc_errno.h"
#include "lisa_log.h"
#include "lisa_time.h"
#include "lisa_thread.h"
// 播放一首歌
static const unsigned char play_music_inc_file[] __attribute__((unused)) = {
#include <play_music.pcm.inc>
};
// 恢复播放
static const unsigned char resume_music_inc_file[] __attribute__((unused)) = {
#include <resume_music.pcm.inc>
};
// 暂停播放
static const unsigned char pause_music_inc_file[] __attribute__((unused)) = {
#include <pause_music.pcm.inc>
};
// 下一首
static const unsigned char next_music_inc_file[] __attribute__((unused)) = {
#include <next_music.pcm.inc>
};
// 上一首
static const unsigned char last_music_inc_file[] __attribute__((unused)) = {
#include <last_music.pcm.inc>
};
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("[%s] evt:0x%x", __FUNCTION__, evt);
switch (evt) {
case SESSION_VOICE_GOT_VAD:
LISA_NLOGI("got vad");
break;
case SESSION_VOICE_TTS:
LISA_NLOGI("tts url:%s", (char *)data);
break;
case SESSION_VOICE_IAT:
LISA_NLOGI("iat:%s", (char *)data);
break;
case SESSION_VOICE_REPLY_URL:
LISA_NLOGI("reply url:%s", (char *)data);
break;
case SESSION_VOICE_MUSIC_INSTR: {
session_voice_music_instr_t *music_instr = (session_voice_music_instr_t *)data;
LISA_NLOGI("music instruction: %d arg: %d", music_instr->instr, music_instr->arg);
} break;
case SESSION_VOICE_MUSIC_LISTS: {
uint8_t i = 0;
session_voice_music_lists_t *item = (session_voice_music_lists_t *)data;
for (i = 0; i < item->cnt; i++) {
LISA_NLOGI("itme_%d : %s", i, item->items[i].id);
}
// 获取播放列表中第一首歌的URL
char music_url[256];
lsc_music_request_url(item->items[0].id, music_url);
LISA_NLOGI("itme_%d url: %s", i, music_url);
} break;
default:
break;
}
}
/*
模拟流式产生录音数据,
*/
static int mock_record_audio_stream_send(uint8_t *data, uint32_t size)
{
uint32_t remain_size = size;
uint8_t *ptr = data;
uint32_t send_size = 0;
LISA_NLOGI("[%s] size:%d", __FUNCTION__, size);
int ret = 0;
do {
send_size = (remain_size > 5120) ? 5120 : remain_size;
ret = session_voice_send_audio(ptr, send_size);
lisa_thread_mdelay(100);
ptr += send_size;
remain_size -= send_size;
} while (remain_size > 0);
return ret;
}
void chat_music_proc(void)
{
int ret;
ret = lsc_music_active();
ret = session_voice_init();
ret = session_voice_add_evt_callback(voice_event_cb,
SESSION_VOICE_GOT_VAD | SESSION_VOICE_TTS | SESSION_VOICE_IAT |
SESSION_VOICE_REPLY_URL | SESSION_VOICE_MUSIC_LISTS |
SESSION_VOICE_MUSIC_INSTR,
NULL);
session_voice_config_t config = {
.vad_enable = true,
.device_id = "F97CE114C70DE8E2",
.speex_size = 0,
.aue = "raw",
};
ret = session_voice_set_config(&config);
ret = session_voice_start();
ret = mock_record_audio_stream_send((uint8_t *)play_music_inc_file, sizeof(play_music_inc_file));
}

View File

@@ -0,0 +1,59 @@
#define TAG "main"
#include "lsc.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("evt : %s", STRINGS_LSC_EVT(evt));
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
ret = lsc_connect();
lisa_thread_mdelay(1000);
extern void chat_music_proc(void);
chat_music_proc();
while (1) {
lisa_thread_mdelay(1000);
}
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,7 @@
set(gen_dir ${ZEPHYR_BINARY_DIR}/include/generated/)
generate_inc_file_for_target(app play_music.pcm ${gen_dir}/play_music.pcm.inc)
generate_inc_file_for_target(app last_music.pcm ${gen_dir}/last_music.pcm.inc)
generate_inc_file_for_target(app next_music.pcm ${gen_dir}/next_music.pcm.inc)
generate_inc_file_for_target(app resume_music.pcm ${gen_dir}/resume_music.pcm.inc)
generate_inc_file_for_target(app pause_music.pcm ${gen_dir}/pause_music.pcm.inc)

View File

@@ -0,0 +1,4 @@
tests:
samples.session_voice.chat_music.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,46 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(chat_volume)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c chat_volume.c)
add_subdirectory(net_conn)
add_subdirectory(resource)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c chat_volume.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
set(gen_dir ${CMAKE_BINARY_DIR})
generate_inc_file_for_target(${PROJECT_NAME} resource/set_vol_20.pcm ${gen_dir}/set_vol_20.pcm.inc)
target_include_directories(${PROJECT_NAME} PRIVATE ${gen_dir})
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,96 @@
.. _chat_volume_sample:
音量设置
######################
概述
****
该示例程序介绍如何通过会话来设置设备音量
.. toctree::
:hidden:
../../sample_build
.. include:: ../../sample_build.rst
调用方法
********
- 初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
- 激活云端音乐技能
.. code-block:: c
lsc_activate_music();
- 初始化闲聊会话
.. code-block:: c
session_voice_init()
- 注册回调函数,云端返回的结果会以事件的形式下发
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
session_voice_add_evt_callback(voice_event_cb, SESSION_VOICE_GOT_VAD | SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_AIUI_CTRL, NULL);
- 设置会话参数使能云端vad功能并配置设备ID
.. code-block:: c
session_voice_config_t config = {
.vad_enable = true,
.device_id = "F97CE114C70DE8E2",
};
session_voice_set_config(&config);
- 启动会话,并上传语音数据
.. note:: set_vol_20_inc_file[]数组中存放的是录音数据("音量设置为20")格式为16Khz, 16bit单通道PCM
.. code-block:: c
session_voice_start();
mock_record_audio_stream_send((uint8_t *)set_vol_20_inc_file, sizeof(set_vol_20_inc_file));
- 设置音量,并获取音量命令以及大小
.. note:: 获取到的命令中,包含有【音量设置命令关键字:音量大小】
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
case SESSION_VOICE_AIUI_CTRL:
LISA_NLOGI("SESSION_VOICE_AIUI_CTRL : [%s] ", data);
break;
}
示例中所使用的API文档见 ::ref:`session_voice`

View File

@@ -0,0 +1,79 @@
#define TAG "chat_volume"
#include "lsc.h"
#include "lisa_mem.h"
#include "lsc_session_voice.h"
#include "lsc_errno.h"
#include "lisa_log.h"
#include "lisa_time.h"
#include "lisa_thread.h"
static const unsigned char set_vol_20_inc_file[] __attribute__((unused)) = {
#include <set_vol_20.pcm.inc>
};
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("[%s] evt:0x%x", __FUNCTION__, evt);
switch (evt) {
case SESSION_VOICE_GOT_VAD:
LISA_NLOGI("got vad");
break;
case SESSION_VOICE_TTS:
LISA_NLOGI("tts url:%s", (char *)data);
break;
case SESSION_VOICE_IAT:
LISA_NLOGI("iat:%s", (char *)data);
break;
case SESSION_VOICE_AIUI_CTRL:
LISA_NLOGI("SESSION_VOICE_AIUI_CTRL : [%s] ", data);
break;
default:
break;
}
}
/*
模拟流式产生录音数据,
*/
static int mock_record_audio_stream_send(uint8_t *data, uint32_t size)
{
uint32_t remain_size = size;
uint8_t *ptr = data;
uint32_t send_size = 0;
LISA_NLOGI("[%s] size:%d", __FUNCTION__, size);
int ret = 0;
do {
send_size = (remain_size > 5120) ? 5120 : remain_size;
ret = session_voice_send_audio(ptr, send_size);
lisa_thread_mdelay(100);
ptr += send_size;
remain_size -= send_size;
} while (remain_size > 0);
return ret;
}
void chat_volume_proc(void)
{
int ret;
ret = lsc_music_active();
ret = session_voice_init();
ret = session_voice_add_evt_callback(
voice_event_cb, SESSION_VOICE_GOT_VAD | SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_AIUI_CTRL,
NULL);
session_voice_config_t config = {
.vad_enable = true,
.device_id = "B00DCB0289A003C3",
};
ret = session_voice_set_config(&config);
ret = session_voice_start();
ret = mock_record_audio_stream_send((uint8_t *)set_vol_20_inc_file, sizeof(set_vol_20_inc_file));
}

View File

@@ -0,0 +1,59 @@
#define TAG "main"
#include "lsc.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("evt : %s", STRINGS_LSC_EVT(evt));
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
ret = lsc_connect();
lisa_thread_mdelay(1000);
extern void chat_volume_proc(void);
chat_volume_proc();
while (1) {
lisa_thread_mdelay(1000);
}
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,3 @@
set(gen_dir ${ZEPHYR_BINARY_DIR}/include/generated/)
generate_inc_file_for_target(app set_vol_20.pcm ${gen_dir}/set_vol_20.pcm.inc)

View File

@@ -0,0 +1,4 @@
tests:
samples.session_voice.chat_volume.linux:
tags: linux
build_only: true

View File

@@ -0,0 +1,46 @@
cmake_minimum_required(VERSION 3.20.0)
if (DEFINED WEST_PYTHON)
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
endif()
project(chat_weather)
if (DEFINED WEST_PYTHON)
target_sources(app PRIVATE main.c chat_weather.c)
add_subdirectory(net_conn)
add_subdirectory(resource)
target_link_libraries(app PRIVATE ls_chat)
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(app PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
else()
add_executable(${PROJECT_NAME} main.c chat_weather.c)
if(NOT DEFINED LSCHAT_BASE)
set(LSCHAT_BASE ${CMAKE_CURRENT_SOURCE_DIR}/../../../)
endif()
set(ENV{LSCHAT_BASE} ${LSCHAT_BASE})
if(NOT DEFINED LISA_BASE)
set(LISA_BASE ${LSCHAT_BASE}/lisa)
endif()
set(ENV{LISA_BASE} ${LISA_BASE})
include(${LISA_BASE}/lisa.cmake)
add_subdirectory(${LSCHAT_BASE} lschat)
target_link_libraries(${PROJECT_NAME} PRIVATE ls_chat)
set(gen_dir ${CMAKE_BINARY_DIR})
generate_inc_file_for_target(${PROJECT_NAME} resource/weather.pcm ${gen_dir}/weather.pcm.inc)
target_include_directories(${PROJECT_NAME} PRIVATE ${gen_dir})
if (DEFINED DEVICE_ID_STRING)
target_compile_definitions(${PROJECT_NAME} PRIVATE DEVICE_ID_STRING="${DEVICE_ID_STRING}")
endif()
endif()

View File

@@ -0,0 +1,2 @@
osource "$ZEPHYR_BASE/Kconfig"
osource "$LSCHAT_BASE/Kconfig"

View File

@@ -0,0 +1,78 @@
.. _chat_weather_sample:
天气对话
######################
概述
************************
该示例程序介绍如何通过闲聊会话和云端进行交互,获取天气信息。
.. toctree::
:hidden:
../../sample_build
.. include:: ../../sample_build.rst
调用方法
************************
- 初始化lsc服务并设置设备ID、产品ID、secret ID
.. code-block:: c
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
lsc_init(lsc_config_t *cfg);
- 注册lsc事件回调函数发起连接并通过回调函数获取连接结果
.. code-block:: c
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb, NULL);
lsc_connect();
- 初始化闲聊会话
.. code-block:: c
session_voice_init()
- 注册回调函数,云端返回的结果会以事件的形式下发
.. code-block:: c
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
//获取事件
}
session_voice_add_evt_callback(voice_event_cb, SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_REPLY_URL | SESSION_VOICE_DRAW,NULL);
- 设置会话参数使能云端vad功能
.. code-block:: c
session_voice_config_t config = {
.vad_enable = true,
.speex_size = 0,
.aue = "raw",
};
session_voice_set_config(&config);
- 启动会话,并上传语音数据
.. note:: draw_inc_file[]数组中存放的是录音("深圳天气怎么样")数据格式为16Khz, 16bit单通道PCM
.. code-block:: c
session_voice_start();
mock_record_audio_stream_send((uint8_t *)draw_inc_file, sizeof(draw_inc_file))
示例中所使用的API文档见 ::ref:`session_voice`

View File

@@ -0,0 +1,77 @@
#define TAG "chat_weather"
#include "lisa_mem.h"
#include "lsc_session_voice.h"
#include "lsc_errno.h"
#include "lisa_log.h"
#include "lisa_time.h"
#include "lisa_http.h"
#include "lisa_thread.h"
static const unsigned char weather_inc_file[] = {
#include <weather.pcm.inc>
};
static void voice_event_cb(session_voice_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("[%s] evt:%d", __FUNCTION__, evt);
switch (evt) {
case SESSION_VOICE_GOT_VAD:
LISA_NLOGI("got vad");
break;
case SESSION_VOICE_TTS:
LISA_NLOGI("tts url:%s", (char *)data);
break;
case SESSION_VOICE_IAT:
LISA_NLOGI("iat:%s", (char *)data);
break;
case SESSION_VOICE_REPLY_URL:
LISA_NLOGI("reply url:%s", (char *)data);
break;
default:
break;
}
}
/*
模拟流式产生录音数据,
*/
static int mock_record_audio_stream_send(uint8_t *data, uint32_t size)
{
uint32_t remain_size = size;
uint8_t *ptr = data;
uint32_t send_size = 0;
LISA_NLOGI("[%s] size:%d", __FUNCTION__, size);
int ret = 0;
do {
send_size = (remain_size > 5120) ? 5120 : remain_size;
ret = session_voice_send_audio(ptr, send_size);
lisa_thread_mdelay(100);
ptr += send_size;
remain_size -= send_size;
} while (remain_size > 0);
return ret;
}
void chat_weather_proc(void)
{
int ret;
ret = session_voice_init();
ret = session_voice_add_evt_callback(
voice_event_cb, SESSION_VOICE_GOT_VAD | SESSION_VOICE_TTS | SESSION_VOICE_IAT | SESSION_VOICE_REPLY_URL,
NULL);
session_voice_config_t config = {
.vad_enable = true,
.speex_size = 0,
.aue = "raw",
};
ret = session_voice_set_config(&config);
ret = session_voice_start();
ret = mock_record_audio_stream_send((uint8_t *)weather_inc_file, sizeof(weather_inc_file));
}

View File

@@ -0,0 +1,60 @@
#define TAG "main"
#include "lsc.h"
#include "lisa_log.h"
#include "lisa_thread.h"
#define PRODUCT_ID_STRING "ce1dda98-f2b8-46f9-a7b9-8aee214a459b"
#define SECRET_ID_STRING "c684eb9e-ff8f-4264-ad03-0369b38ab793"
#ifndef DEVICE_ID_STRING
#error "Please define DEVICE_ID_STRING first"
#endif
static void lsc_event_cb(lsc_event_e evt, void *data, uint32_t size, void *usr)
{
LISA_NLOGI("evt : %s", STRINGS_LSC_EVT(evt));
}
__attribute__((weak)) int net_down(void)
{
return 0;
}
__attribute__((weak)) int net_up(void)
{
return 0;
}
__attribute__((weak)) int net_init(void)
{
return 0;
}
int main(void)
{
net_init();
net_up();
int ret;
lsc_config_t cfg = {
.device_id = DEVICE_ID_STRING,
.product_id = PRODUCT_ID_STRING,
.secret_id = SECRET_ID_STRING,
};
ret = lsc_init(&cfg);
ret = lsc_add_callback(LSC_CONNECTED | LSC_DISCONNECTED | LSC_CLOUD_AUTH_FAILD | LSC_GOT_TOKEN, lsc_event_cb,
NULL);
ret = lsc_connect();
lisa_thread_mdelay(3000);
extern void chat_weather_proc(void);
chat_weather_proc();
while (1) {
lisa_thread_mdelay(1000);
}
}

View File

@@ -0,0 +1,4 @@
target_sources(app PRIVATE
net_conn.c
)
target_include_directories(app PRIVATE .)

View File

@@ -0,0 +1,119 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <zephyr/kernel.h>
#include <zephyr/net/net_context.h>
#include <zephyr/net/net_core.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_mgmt.h>
#include <zephyr/sys/printk.h>
#include <zephyr/sys/sys_heap.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
K_SEM_DEFINE(ipgot_sem, 0, 1);
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
k_sem_give(&ipgot_sem);
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
int net_init(void)
{
int ret;
csk_wifi_init();
uint8_t mac_addr[6] = {0};
ret = csk_wifi_get_mac(CSK_WIFI_MODE_STA, mac_addr);
if (ret != 0) {
printk("wifi get mac failed, ret: %d\n", ret);
return 0;
}
printk("wifi station mac addr: %x:%x:%x:%x:%x:%x\n", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3],
mac_addr[4], mac_addr[5]);
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
return 0;
}
int net_up(void)
{
csk_wifi_sta_config_t sta_config = {
.ssid = "mywifi", .pwd = "12345678", .encryption_mode = CSK_WIFI_AUTH_WPA2_PSK};
int retry_count = 0;
csk_wifi_result_t wifi_result;
do {
int ret;
printk("connecting to wifi: %s ...\n", sta_config.ssid);
ret = csk_wifi_sta_connect(&sta_config, &wifi_result, K_FOREVER);
if (ret == 0) {
break;
} else {
if (wifi_result == CSK_WIFI_ERR_STA_FAILED) {
retry_count++;
printk("retry to connecting wifi ... %d\n", retry_count);
} else {
printk("AP not found or invalid password\n");
return 0;
}
}
} while (retry_count < 10);
printk("--------------------------Current AP info-------------------------------\n");
printk("ssid: %s pwd: %s bssid: %s channel: %d rssi: %d\n", sta_config.ssid, sta_config.pwd,
sta_config.bssid, sta_config.channel, sta_config.rssi);
printk("------------------------------------------------------------------------\n");
net_mgmt_init_event_callback(&dhcp_cb, handler_cb, NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
struct net_if *iface = net_if_get_default();
if (!iface) {
printk("wifi interface not available");
return 0;
}
net_dhcpv4_start(iface);
k_sem_take(&ipgot_sem, K_FOREVER);
return 0;
}
int net_down(void)
{
int ret;
csk_wifi_result_t result;
ret = csk_wifi_sta_disconnect(&result, K_FOREVER);
if (ret < 0) {
printk("station disconnect failed, reason code: %d, ret: %d", result, ret);
return -1;
}
net_mgmt_del_event_callback(&dhcp_cb);
return 0;
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (c) 2023, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
int net_init(void);
int net_up(void);
int net_down(void);
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,2 @@
CONFIG_LS_CHAT=y
CONFIG_LISA_LINUX=y

View File

@@ -0,0 +1,86 @@
# Sockets
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_NET_CONTEXT_RCVTIMEO=y
CONFIG_NET_PKT_RX_COUNT=600
CONFIG_NET_PKT_TX_COUNT=600
CONFIG_NET_BUF_RX_COUNT=1400
CONFIG_NET_BUF_TX_COUNT=1400
CONFIG_NET_TCP=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=25600
CONFIG_NET_TCP_MAX_SEND_WINDOW_SIZE=25600
CONFIG_NET_RX_STACK_SIZE=4096
CONFIG_NET_TX_STACK_SIZE=4096
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NET_TCP_WORKQ_STACK_SIZE=4096
CONFIG_DNS_RESOLVER_ADDITIONAL_QUERIES=2
CONFIG_DNS_RESOLVER_MAX_SERVERS=5
CONFIG_DNS_NUM_CONCUR_QUERIES=5
CONFIG_DNS_RESOLVER_ADDITIONAL_BUF_CTR=4
CONFIG_NET_MAX_CONN=10
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_POSIX_MAX_FDS=10
# CONFIG_WIFI_MGR=y
# CONFIG_WIFI_MGR_WORKQ_STACK=2048
# CONFIG_WIFI_CTRL_STACK_SIZE=2048
# CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_HTTP_CLIENT=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS_SOCKOPT_TLS=n
CONFIG_WIFI=y
CONFIG_WIFI_CSK6=y
CONFIG_CSK_WIFI_NET_ALLOC_PSRAM=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_WIFI=y
CONFIG_CSK_WIFI_STATION=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NETWORKING=y
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV4=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_MGMT=y
CONFIG_NET_MGMT_EVENT=y
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4096
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=16
CONFIG_NET_PKT_TX_COUNT=16
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_NET_CONTEXT_NET_PKT_POOL=y
CONFIG_NEWLIB_LIBC=y
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_HEAP_MEM_POOL_SIZE=35840
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_INIT_STACKS=y
CONFIG_LOG=y
CONFIG_WIFI_LOG_LEVEL_DBG=y
# CONFIG_LISA_HEAP_ARENA_SIZE=1024000
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_MAIN_STACK_SIZE=20480
# CONFIG_MBEDTLS=y
CONFIG_POSIX_API=y
# CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_TCP_ISN_RFC6528=n
CONFIG_GPIO=y
CONFIG_GPIO_CSK6_CH32V003=y
CONFIG_LS_CHAT=y

View File

@@ -0,0 +1,3 @@
set(gen_dir ${ZEPHYR_BINARY_DIR}/include/generated/)
generate_inc_file_for_target(app weather.pcm ${gen_dir}/weather.pcm.inc)

View File

@@ -0,0 +1,4 @@
tests:
samples.session_voice.chat_weather.linux:
tags: linux
build_only: true

Some files were not shown because too many files have changed in this diff Show More