commit
695418eb85
22 changed files with 1242 additions and 0 deletions
-
9.clang-format
-
7.gitignore
-
18.vscode/c_cpp_properties.json
-
111.vscode/settings.json
-
72CMakeLists.txt
-
17README.md
-
175demo/ac_sound_capture1/ac_sound_capture1.cpp
-
7demo/ac_sound_capture1/libspisound/README.md
-
BINdemo/ac_sound_capture1/libspisound/libspisound.so
-
66demo/ac_sound_capture1/libspisound/spisound.h
-
43demo/uart/test_uart232_1.cpp
-
44demo/uart/test_uart232_2.cpp
-
44demo/uart/test_uart485.cpp
-
44demo/uart/test_usbuart.cpp
-
161demo/uart/uart.cpp
-
60demo/uart/uart.hpp
-
4sh/build.sh
-
19sh/deploy.sh
-
16zcmake/README.md
-
114zcmake/zadd_executable.cmake
-
207zcmake/zadd_library.cmake
-
4zcmake/zcmake.cmake
@ -0,0 +1,9 @@ |
|||||
|
# Defines the Chromium style for automatic reformatting. |
||||
|
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html |
||||
|
Language: Cpp |
||||
|
BasedOnStyle: Google |
||||
|
ColumnLimit: 160 |
||||
|
AlignConsecutiveMacros: true |
||||
|
AlignConsecutiveDeclarations: true |
||||
|
AlignConsecutiveAssignments: true |
||||
|
AlignOperands: true |
@ -0,0 +1,7 @@ |
|||||
|
build |
||||
|
out |
||||
|
.cache |
||||
|
./libs |
||||
|
libs/ |
||||
|
buildpc |
||||
|
buildhost |
@ -0,0 +1,18 @@ |
|||||
|
{ |
||||
|
"configurations": [ |
||||
|
{ |
||||
|
"name": "Linux", |
||||
|
"includePath": [ |
||||
|
"${workspaceFolder}/**", |
||||
|
"${workspaceFolder}/", |
||||
|
"${workspaceFolder}/dep" |
||||
|
], |
||||
|
"compilerPath": "/usr/bin/g++", |
||||
|
"cStandard": "gnu11", |
||||
|
"cppStandard": "gnu++14", |
||||
|
"intelliSenseMode": "linux-gcc-x64", |
||||
|
"compileCommands": "${workspaceFolder}/build/compile_commands.json" |
||||
|
} |
||||
|
], |
||||
|
"version": 4 |
||||
|
} |
@ -0,0 +1,111 @@ |
|||||
|
{ |
||||
|
"files.associations": { |
||||
|
"__locale": "cpp", |
||||
|
"array": "cpp", |
||||
|
"atomic": "cpp", |
||||
|
"hash_map": "cpp", |
||||
|
"bit": "cpp", |
||||
|
"*.tcc": "cpp", |
||||
|
"bitset": "cpp", |
||||
|
"cctype": "cpp", |
||||
|
"charconv": "cpp", |
||||
|
"chrono": "cpp", |
||||
|
"clocale": "cpp", |
||||
|
"cmath": "cpp", |
||||
|
"codecvt": "cpp", |
||||
|
"compare": "cpp", |
||||
|
"concepts": "cpp", |
||||
|
"condition_variable": "cpp", |
||||
|
"csignal": "cpp", |
||||
|
"cstdarg": "cpp", |
||||
|
"cstddef": "cpp", |
||||
|
"cstdint": "cpp", |
||||
|
"cstdio": "cpp", |
||||
|
"cstdlib": "cpp", |
||||
|
"cstring": "cpp", |
||||
|
"ctime": "cpp", |
||||
|
"cwchar": "cpp", |
||||
|
"cwctype": "cpp", |
||||
|
"deque": "cpp", |
||||
|
"forward_list": "cpp", |
||||
|
"list": "cpp", |
||||
|
"map": "cpp", |
||||
|
"set": "cpp", |
||||
|
"string": "cpp", |
||||
|
"unordered_map": "cpp", |
||||
|
"vector": "cpp", |
||||
|
"exception": "cpp", |
||||
|
"algorithm": "cpp", |
||||
|
"functional": "cpp", |
||||
|
"iterator": "cpp", |
||||
|
"memory": "cpp", |
||||
|
"memory_resource": "cpp", |
||||
|
"numeric": "cpp", |
||||
|
"optional": "cpp", |
||||
|
"random": "cpp", |
||||
|
"ratio": "cpp", |
||||
|
"regex": "cpp", |
||||
|
"string_view": "cpp", |
||||
|
"system_error": "cpp", |
||||
|
"tuple": "cpp", |
||||
|
"type_traits": "cpp", |
||||
|
"utility": "cpp", |
||||
|
"fstream": "cpp", |
||||
|
"future": "cpp", |
||||
|
"initializer_list": "cpp", |
||||
|
"iomanip": "cpp", |
||||
|
"iosfwd": "cpp", |
||||
|
"iostream": "cpp", |
||||
|
"istream": "cpp", |
||||
|
"limits": "cpp", |
||||
|
"mutex": "cpp", |
||||
|
"new": "cpp", |
||||
|
"numbers": "cpp", |
||||
|
"ostream": "cpp", |
||||
|
"semaphore": "cpp", |
||||
|
"shared_mutex": "cpp", |
||||
|
"span": "cpp", |
||||
|
"sstream": "cpp", |
||||
|
"stdexcept": "cpp", |
||||
|
"stop_token": "cpp", |
||||
|
"streambuf": "cpp", |
||||
|
"thread": "cpp", |
||||
|
"cfenv": "cpp", |
||||
|
"cinttypes": "cpp", |
||||
|
"typeindex": "cpp", |
||||
|
"typeinfo": "cpp", |
||||
|
"valarray": "cpp", |
||||
|
"variant": "cpp", |
||||
|
"__nullptr": "cpp", |
||||
|
"locale": "cpp", |
||||
|
"__bit_reference": "cpp", |
||||
|
"__functional_base": "cpp", |
||||
|
"__node_handle": "cpp", |
||||
|
"__memory": "cpp", |
||||
|
"filesystem": "cpp", |
||||
|
"__functional_base_03": "cpp", |
||||
|
"__hash_table": "cpp", |
||||
|
"__tree": "cpp", |
||||
|
"__tuple": "cpp", |
||||
|
"*.ipp": "cpp", |
||||
|
"complex": "cpp", |
||||
|
"csetjmp": "cpp", |
||||
|
"cuchar": "cpp", |
||||
|
"unordered_set": "cpp", |
||||
|
"rope": "cpp", |
||||
|
"slist": "cpp", |
||||
|
"scoped_allocator": "cpp", |
||||
|
"netdb.h": "c", |
||||
|
"aiui_cjson.h": "c", |
||||
|
"string.h": "c", |
||||
|
"aiui_base64.h": "c", |
||||
|
"aiui_wsclient.h": "c", |
||||
|
"aiui_sha256.h": "c", |
||||
|
"socket.h": "c", |
||||
|
"unistd.h": "c", |
||||
|
"err.h": "c", |
||||
|
"cerrno": "c", |
||||
|
"stdio.h": "c", |
||||
|
"any": "cpp" |
||||
|
} |
||||
|
} |
@ -0,0 +1,72 @@ |
|||||
|
cmake_minimum_required(VERSION 3.13) |
||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
||||
|
set(CMAKE_SYSTEM_NAME Linux) |
||||
|
set(CMAKE_BUILD_TYPE Debug) |
||||
|
set(CMAKE_SKIP_BUILD_RPATH FALSE) |
||||
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) |
||||
|
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) |
||||
|
project(rk3588sdk) |
||||
|
|
||||
|
set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc") |
||||
|
set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++") |
||||
|
|
||||
|
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/) |
||||
|
# 设置ccache加速C++编译速度 |
||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) |
||||
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) |
||||
|
|
||||
|
# 设置通用编译选项 |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-format-overflow") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-unused-local-typedefs") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-unused-but-set-variable") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-deprecated-declarations") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Werror=return-type") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Werror=parentheses") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wfatal-errors") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-unused-result") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wno-comment") |
||||
|
|
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -O3") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -g3") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -fPIC") |
||||
|
set(C_CPP_FLAGS "${C_CPP_FLAGS} -Wall") |
||||
|
|
||||
|
# 设置C编译选项 |
||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_CPP_FLAGS}") |
||||
|
|
||||
|
# 设置CPP编译选项 |
||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_CPP_FLAGS}") |
||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pessimizing-move") |
||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reorder") |
||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") |
||||
|
|
||||
|
message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") |
||||
|
message("PROJECT_NAME: ${PROJECT_NAME}") |
||||
|
|
||||
|
# LINK_DIRECTORIES(/home/zwsd/Desktop/minhang/rk3588sdk/demo/ac_sound_capture1/libspisound/) |
||||
|
|
||||
|
find_library(LIBSPI libspisound.so ./demo/ac_sound_capture1/libspisound/) |
||||
|
|
||||
|
|
||||
|
add_executable(ac_sound_capture1 demo/ac_sound_capture1/ac_sound_capture1.cpp) |
||||
|
target_link_libraries(ac_sound_capture1 ${LIBSPI} pthread) |
||||
|
install(TARGETS ac_sound_capture1 DESTINATION ./app/) |
||||
|
|
||||
|
|
||||
|
add_executable(test_uart_232_1 demo/uart/test_uart232_1.cpp demo/uart/uart.cpp) |
||||
|
target_link_libraries(test_uart_232_1 pthread) |
||||
|
install(TARGETS test_uart_232_1 DESTINATION ./app/) |
||||
|
|
||||
|
add_executable(test_uart_232_2 demo/uart/test_uart232_2.cpp demo/uart/uart.cpp) |
||||
|
target_link_libraries(test_uart_232_2 pthread) |
||||
|
install(TARGETS test_uart_232_2 DESTINATION ./app/) |
||||
|
|
||||
|
add_executable(test_uart485 demo/uart/test_uart485.cpp demo/uart/uart.cpp) |
||||
|
target_link_libraries(test_uart485 pthread) |
||||
|
install(TARGETS test_uart485 DESTINATION ./app/) |
||||
|
|
||||
|
add_executable(test_usbuart demo/uart/test_usbuart.cpp demo/uart/uart.cpp) |
||||
|
target_link_libraries(test_usbuart pthread) |
||||
|
install(TARGETS test_usbuart DESTINATION ./app/) |
||||
|
|
||||
|
|
@ -0,0 +1,17 @@ |
|||||
|
# rk3588sdk |
||||
|
|
||||
|
``` |
||||
|
编译环境准备: |
||||
|
ubuntu20.04 |
||||
|
sudo apt install gcc-aarch64-linux-gnu |
||||
|
sudo apt install g++-aarch64-linux-gnu |
||||
|
|
||||
|
无密码登陆: |
||||
|
ssh-copy-id iflytop@板子IP |
||||
|
|
||||
|
编译: |
||||
|
./build.sh |
||||
|
|
||||
|
部署: |
||||
|
./sh/deploy.sh username ip |
||||
|
``` |
@ -0,0 +1,175 @@ |
|||||
|
#include <errno.h>
|
||||
|
#include <fcntl.h>
|
||||
|
#include <getopt.h>
|
||||
|
#include <linux/spi/spidev.h>
|
||||
|
#include <linux/types.h>
|
||||
|
#include <stdbool.h>
|
||||
|
#include <stdint.h>
|
||||
|
#include <stdio.h>
|
||||
|
#include <stdlib.h>
|
||||
|
#include <string.h>
|
||||
|
#include <sys/ioctl.h>
|
||||
|
#include <unistd.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
extern "C" { |
||||
|
#include "libspisound/spisound.h"
|
||||
|
} |
||||
|
|
||||
|
using namespace std; |
||||
|
|
||||
|
class WAVHeader { |
||||
|
public: |
||||
|
/**
|
||||
|
* @brief WAV 文件头部信息的二进制格式 |
||||
|
* |
||||
|
* WAV 文件头部信息包含了如下字段: |
||||
|
* - 固定为 "RIFF" 的 4 字节 chunk_id |
||||
|
* - 文件总大小 - 8 的 4 字节 chunk_size |
||||
|
* - 固定为 "WAVE" 的 4 字节 format |
||||
|
* - 固定为 "fmt " 的 4 字节 subchunk1_id |
||||
|
* - 固定为 16 的 4 字节 subchunk1_size |
||||
|
* - 编码格式,1 表示 PCM 编码的 2 字节 audio_format |
||||
|
* - 声道数,1 为单声道,2 为立体声的 2 字节 num_channels |
||||
|
* - 采样率,如 44100 的 4 字节 sample_rate |
||||
|
* - 数据传输速率,即采样率 * 声道数 * 位数 / 8 的 4 字节 byte_rate |
||||
|
* - 数据块对齐,即每个采样点占用的字节数,如 2 表示 16 位,即 2 字节的 2 字节 block_align |
||||
|
* - 位数,如 8、16、24、32 的 2 字节 bits_per_sample |
||||
|
* - 固定为 "data" 的 4 字节 subchunk2_id |
||||
|
* - 数据长度,即文件总大小 - 44 的 4 字节 subchunk2_size |
||||
|
*/ |
||||
|
struct WAVHeaderBinary { |
||||
|
char chunk_id[4]; // 固定为 "RIFF"
|
||||
|
uint32_t chunk_size; // 文件总大小 - 8
|
||||
|
char format[4]; // 固定为 "WAVE"
|
||||
|
char subchunk1_id[4]; // 固定为 "fmt "
|
||||
|
uint32_t subchunk1_size; // 固定为 16
|
||||
|
uint16_t audio_format; // 编码格式,1 表示 PCM 编码
|
||||
|
uint16_t num_channels; // 声道数,1 为单声道,2 为立体声
|
||||
|
uint32_t sample_rate; // 采样率,如 44100
|
||||
|
uint32_t byte_rate; // 数据传输速率,即采样率 * 声道数 * 位数 / 8
|
||||
|
uint16_t block_align; // 数据块对齐,即每个采样点占用的字节数,如 2 表示 16 位,即 2 字节
|
||||
|
uint16_t bits_per_sample; // 位数,如 8、16、24、32
|
||||
|
char subchunk2_id[4]; // 固定为 "data"
|
||||
|
uint32_t subchunk2_size; // 数据长度,即文件总大小 - 44
|
||||
|
}; |
||||
|
WAVHeaderBinary header; |
||||
|
|
||||
|
public: |
||||
|
WAVHeader() {} |
||||
|
void initialize(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t wavbinsize) { |
||||
|
// 填充 RIFF 头
|
||||
|
memcpy(header.chunk_id, "RIFF", 4); |
||||
|
header.chunk_size = wavbinsize + 44 - 8; |
||||
|
memcpy(header.format, "WAVE", 4); |
||||
|
|
||||
|
// 填充 fmt 子块
|
||||
|
memcpy(header.subchunk1_id, "fmt ", 4); |
||||
|
header.subchunk1_size = 16; |
||||
|
header.audio_format = 1; // PCM 编码
|
||||
|
header.num_channels = num_channels; |
||||
|
header.sample_rate = sample_rate; |
||||
|
header.byte_rate = sample_rate * num_channels * bits_per_sample / 8; |
||||
|
header.block_align = num_channels * bits_per_sample / 8; |
||||
|
header.bits_per_sample = bits_per_sample; |
||||
|
|
||||
|
// 填充 data 子块
|
||||
|
memcpy(header.subchunk2_id, "data", 4); |
||||
|
header.subchunk2_size = wavbinsize; |
||||
|
} |
||||
|
void resize(uint32_t wavbinsize) { |
||||
|
header.chunk_size = wavbinsize + 44 - 8; |
||||
|
header.subchunk2_size = wavbinsize; |
||||
|
} |
||||
|
|
||||
|
void dump() { |
||||
|
printf("chunk_id: %s\n", string(header.chunk_id, 4).c_str()); |
||||
|
printf("chunk_size: %d\n", header.chunk_size); |
||||
|
printf("format: %s\n", string(header.format, 4).c_str()); |
||||
|
printf("subchunk1_id: %s\n", string(header.subchunk1_id, 4).c_str()); |
||||
|
printf("subchunk1_size: %d\n", header.subchunk1_size); |
||||
|
printf("audio_format: %d\n", header.audio_format); |
||||
|
printf("num_channels: %d\n", header.num_channels); |
||||
|
printf("sample_rate: %d\n", header.sample_rate); |
||||
|
printf("byte_rate: %d\n", header.byte_rate); |
||||
|
printf("block_align: %d\n", header.block_align); |
||||
|
printf("bits_per_sample: %d\n", header.bits_per_sample); |
||||
|
printf("subchunk2_id: %s\n", header.subchunk2_id); |
||||
|
printf("subchunk2_size: %d\n", header.subchunk2_size); |
||||
|
} |
||||
|
|
||||
|
WAVHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) { |
||||
|
initialize(sample_rate, bits_per_sample, num_channels, num_samples); |
||||
|
} |
||||
|
uint8_t* data() { return (uint8_t*)&header; } |
||||
|
size_t size() { return sizeof(header); } |
||||
|
}; |
||||
|
|
||||
|
void wavWriteVoice(string filename, uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, const char* data, uint32_t size) { |
||||
|
fstream file; |
||||
|
WAVHeader wavHeader; |
||||
|
// logger->info("writeVoice filename:{} {} {} {} {}", filename, sample_rate, bits_per_sample, num_channels, size);
|
||||
|
file.open(filename, fstream::in | fstream::out | fstream::binary); |
||||
|
if (!file.is_open()) { |
||||
|
file.open(filename, fstream::out | fstream::binary | fstream::trunc); |
||||
|
wavHeader.initialize(sample_rate, bits_per_sample, num_channels, 0); |
||||
|
file.seekp(0, ios::beg); |
||||
|
file.write((char*)wavHeader.data(), wavHeader.size()); |
||||
|
file.close(); |
||||
|
file.open(filename, fstream::in | fstream::out | fstream::binary); |
||||
|
} |
||||
|
|
||||
|
// file.write(data, size);
|
||||
|
#if 1
|
||||
|
/**
|
||||
|
* @brief 判断文件大小,文件大小大于等于44字节,说明文件已经存在,不需要写入头部 |
||||
|
*/ |
||||
|
file.seekp(0, ios::end); |
||||
|
file.write(data, size); |
||||
|
/**
|
||||
|
* @brief 更新头部信息 |
||||
|
*/ |
||||
|
uint32_t filesize = file.tellp(); |
||||
|
file.seekp(4, ios::beg); |
||||
|
uint32_t chunk_size = filesize - 8; |
||||
|
file.write((char*)&chunk_size, 4); |
||||
|
file.seekp(40, ios::beg); |
||||
|
uint32_t subchunk2_size = filesize - 44; |
||||
|
file.write((char*)&subchunk2_size, 4); |
||||
|
#endif
|
||||
|
|
||||
|
file.close(); |
||||
|
} |
||||
|
|
||||
|
void sound_capture_callback(int32_t* voicedata, uint32_t len) { |
||||
|
printf("sound_capture_callback:%d\n", len); |
||||
|
wavWriteVoice("record.wav", 48000, 32, 1, (char*)voicedata, len * sizeof(int32_t)); |
||||
|
} |
||||
|
|
||||
|
int main(int argc, char const* argv[]) { |
||||
|
system("rm -rf record.wav"); |
||||
|
|
||||
|
error_code_t erro_code = spisound_init("/dev/spidev1.0", 59, sound_capture_callback); |
||||
|
if (erro_code != ksp_success) { |
||||
|
spisound_dump_last_error(); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
erro_code = spisound_start_capture(); |
||||
|
if (erro_code != ksp_success) { |
||||
|
spisound_dump_last_error(); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
while (true) sleep(1); |
||||
|
return 0; |
||||
|
} |
@ -0,0 +1,7 @@ |
|||||
|
``` |
||||
|
注意事项: |
||||
|
|
||||
|
1. libspisound.so仅仅是为了编译使用,不需要拷贝到目标设备上,目标设备已经有了这个库。 |
||||
|
2. 当前音频格式为48K,32bit,LittleEnd |
||||
|
|
||||
|
``` |
@ -0,0 +1,66 @@ |
|||||
|
#pragma once |
||||
|
#include <stdint.h> |
||||
|
|
||||
|
#ifdef cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
/** |
||||
|
* @brief 上报48k音频数据32位音频数据 |
||||
|
* |
||||
|
* @param data 音频数据 |
||||
|
* @param len 音频数据长度 |
||||
|
* |
||||
|
*/ |
||||
|
typedef void (*spisound_cb_t)(int32_t *data, uint32_t len); |
||||
|
|
||||
|
typedef enum { |
||||
|
ksp_success, |
||||
|
ksp_module_not_inited, |
||||
|
ksp_module_has_started, |
||||
|
ksp_create_thread_fail, |
||||
|
ksp_init_spi_cs_pin_open_fail, |
||||
|
ksp_init_spi_error_open_fail, |
||||
|
ksp_init_spi_error_set_speed_fail, |
||||
|
ksp_init_spi_error_set_nbits_fail, |
||||
|
ksp_init_spi_error_set_mode_fail, |
||||
|
} error_code_t; |
||||
|
|
||||
|
static inline const char *error_code_to_string(error_code_t code) { |
||||
|
switch (code) { |
||||
|
case ksp_success: |
||||
|
return "success"; |
||||
|
case ksp_module_not_inited: |
||||
|
return "module not inited"; |
||||
|
case ksp_module_has_started: |
||||
|
return "module has started"; |
||||
|
case ksp_create_thread_fail: |
||||
|
return "create thread fail"; |
||||
|
case ksp_init_spi_cs_pin_open_fail: |
||||
|
return "init spi cs pin open fail"; |
||||
|
case ksp_init_spi_error_open_fail: |
||||
|
return "init spi error open fail"; |
||||
|
case ksp_init_spi_error_set_speed_fail: |
||||
|
return "init spi error set speed fail"; |
||||
|
case ksp_init_spi_error_set_nbits_fail: |
||||
|
return "init spi error set nbits fail"; |
||||
|
case ksp_init_spi_error_set_mode_fail: |
||||
|
return "init spi error set mode fail"; |
||||
|
default: |
||||
|
return "unknown error"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @brief 初始化声音采集模块 |
||||
|
* |
||||
|
* @param deviceName |
||||
|
* @param callback |
||||
|
*/ |
||||
|
error_code_t spisound_init(const char *deviceName, int csgpionId, spisound_cb_t callback); |
||||
|
error_code_t spisound_start_capture(void); |
||||
|
const char *spisound_libversion(); |
||||
|
|
||||
|
void spisound_dump_last_error(); |
||||
|
#ifdef cplusplus |
||||
|
} |
||||
|
#endif |
@ -0,0 +1,43 @@ |
|||||
|
|
||||
|
#include <string.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <thread>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "uart.hpp"
|
||||
|
using namespace std; |
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define UART_NAME "/dev/ttyS0"
|
||||
|
|
||||
|
int main(int argc, char const* argv[]) { |
||||
|
Uart uart; |
||||
|
uart.open(UART_NAME, "115200"); |
||||
|
|
||||
|
thread th([&]() { |
||||
|
//
|
||||
|
while (true) { |
||||
|
char buf[1024]; |
||||
|
memset(buf, 0, 1024); |
||||
|
int size = uart.receive(buf, 1024, 10); |
||||
|
if (size > 0) { |
||||
|
cout << "receive:" << buf << endl; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
while (true) { |
||||
|
printf("tx hello\n"); |
||||
|
uart.send("hello", 5); |
||||
|
sleep(1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
|
||||
|
#include <string.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <thread>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "uart.hpp"
|
||||
|
using namespace std; |
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define UART_NAME "/dev/ttyS5"
|
||||
|
|
||||
|
int main(int argc, char const* argv[]) { |
||||
|
Uart uart; |
||||
|
uart.open(UART_NAME, "115200"); |
||||
|
|
||||
|
thread th([&]() { |
||||
|
//
|
||||
|
|
||||
|
while (true) { |
||||
|
char buf[1024]; |
||||
|
memset(buf, 0, 1024); |
||||
|
int size = uart.receive(buf, 1024, 10); |
||||
|
if (size > 0) { |
||||
|
cout << "receive:" << buf << endl; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
while (true) { |
||||
|
printf("tx hello\n"); |
||||
|
uart.send("hello", 5); |
||||
|
sleep(1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
|
||||
|
#include <string.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <thread>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "uart.hpp"
|
||||
|
using namespace std; |
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define UART_NAME "/dev/ttyS1"
|
||||
|
|
||||
|
int main(int argc, char const* argv[]) { |
||||
|
Uart uart; |
||||
|
uart.open(UART_NAME, "115200"); |
||||
|
|
||||
|
thread th([&]() { |
||||
|
//
|
||||
|
while (true) { |
||||
|
char buf[1024]; |
||||
|
memset(buf, 0, 1024); |
||||
|
int size = uart.receive(buf, 1024, 10); |
||||
|
if (size > 0) { |
||||
|
cout << "receive:" << buf << endl; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
while (true) { |
||||
|
const char* txstr = "message from 485\n"; |
||||
|
printf("tx message\n"); |
||||
|
uart.send((char*)txstr, strlen(txstr)); |
||||
|
sleep(1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,44 @@ |
|||||
|
|
||||
|
#include <string.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <thread>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "uart.hpp"
|
||||
|
using namespace std; |
||||
|
using namespace iflytop; |
||||
|
|
||||
|
#define UART_NAME "/dev/ttyUSB0"
|
||||
|
|
||||
|
int main(int argc, char const* argv[]) { |
||||
|
Uart uart; |
||||
|
uart.open(UART_NAME, "115200"); |
||||
|
|
||||
|
thread th([&]() { |
||||
|
//
|
||||
|
|
||||
|
while (true) { |
||||
|
char buf[1024]; |
||||
|
memset(buf, 0, 1024); |
||||
|
int size = uart.receive(buf, 1024, 10); |
||||
|
if (size > 0) { |
||||
|
cout << "receive:" << buf << endl; |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
while (true) { |
||||
|
printf("tx hello\n"); |
||||
|
uart.send("hello", 5); |
||||
|
sleep(1); |
||||
|
} |
||||
|
} |
@ -0,0 +1,161 @@ |
|||||
|
|
||||
|
/*
|
||||
|
* uart.c |
||||
|
*/ |
||||
|
#include "uart.hpp"
|
||||
|
|
||||
|
#include <fcntl.h>
|
||||
|
#include <stdio.h>
|
||||
|
#include <stdlib.h>
|
||||
|
#include <string.h>
|
||||
|
#include <termios.h>
|
||||
|
|
||||
|
#include <chrono>
|
||||
|
#include <fstream>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
|
||||
|
using namespace iflytop; |
||||
|
using namespace chrono; |
||||
|
|
||||
|
static int64_t getnowms() { return duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count(); } |
||||
|
|
||||
|
static map<string, uint32_t> s_baundmap = { |
||||
|
{"0", 0000000}, {"50", 0000001}, {"75", 0000002}, {"110", 0000003}, //
|
||||
|
{"134", 0000004}, {"150", 0000005}, {"200", 0000006}, {"300", 0000007}, //
|
||||
|
{"600", 0000010}, {"1200", 0000011}, {"1800", 0000012}, {"2400", 0000013}, //
|
||||
|
{"4800", 0000014}, {"9600", 0000015}, {"19200", 0000016}, {"38400", 0000017}, //
|
||||
|
{"57600", 0010001}, {"115200", 0010002}, {"230400", 0010003}, {"460800", 0010004}, //
|
||||
|
{"500000", 0010005}, {"576000", 0010006}, {"921600", 0010007}, {"1000000", 0010010}, //
|
||||
|
{"1152000", 0010011}, {"1500000", 0010012}, {"2000000", 0010013}, {"2500000", 0010014}, //
|
||||
|
{"3000000", 0010015}, {"3500000", 0010016}, {"4000000", 0010017}, |
||||
|
}; |
||||
|
|
||||
|
Uart::Uart() {} |
||||
|
Uart::~Uart() {} |
||||
|
|
||||
|
int Uart::open(string path, string ratestr) { |
||||
|
int rc; |
||||
|
|
||||
|
m_name = path; |
||||
|
uint32_t rate = 0; |
||||
|
|
||||
|
m_fd = ::open(path.c_str(), O_RDWR | O_NOCTTY); |
||||
|
if (m_fd < 0) { |
||||
|
// m_error = fmt::format("open {} failed,{}", path, strerror(errno));
|
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
if (s_baundmap.find(ratestr) == s_baundmap.end()) { |
||||
|
// m_error = fmt::format("baund {} not support", ratestr);
|
||||
|
return -1; |
||||
|
} |
||||
|
rate = s_baundmap[ratestr]; |
||||
|
m_rate = ratestr; |
||||
|
memset(&m_tty, 0, sizeof(m_tty)); |
||||
|
// memset(tty, 0, sizeof(struct termios));
|
||||
|
/*
|
||||
|
BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed. |
||||
|
CRTSCTS : output hardware flow control (only used if the cable has |
||||
|
all necessary lines. See sect. 7 of Serial-HOWTO) |
||||
|
CS8 : 8n1 (8bit,no parity,1 stopbit) |
||||
|
CLOCAL : local connection, no modem contol |
||||
|
CREAD : enable receiving characters |
||||
|
*/ |
||||
|
// tty->c_cflag = dev->rate | CRTSCTS | CS8 | CLOCAL | CREAD;
|
||||
|
m_tty.c_cflag = rate | CS8 | CLOCAL | CREAD; |
||||
|
|
||||
|
// not canonic
|
||||
|
/*
|
||||
|
IGNPAR : ignore bytes with parity errorsc_cc[VTIME] |
||||
|
*/ |
||||
|
m_tty.c_iflag = IGNPAR; |
||||
|
/* set input mode (non-canonical, no echo,...) */ |
||||
|
m_tty.c_lflag = 0; |
||||
|
/* Do not wait for data */ |
||||
|
m_tty.c_cc[VTIME] = 10; /* inter-character timer unused */ |
||||
|
m_tty.c_cc[VMIN] = 0; /* blocking read until 5 chars received */ |
||||
|
|
||||
|
/*
|
||||
|
Raw output. |
||||
|
*/ |
||||
|
m_tty.c_oflag = 0; |
||||
|
|
||||
|
/* Flush port */ |
||||
|
tcflush(m_fd, TCIFLUSH); |
||||
|
|
||||
|
/* Apply attributes */ |
||||
|
rc = tcsetattr(m_fd, TCSANOW, &m_tty); |
||||
|
if (rc) { |
||||
|
// m_error = fmt::format("tcsetattr {} failed,{}", path, strerror(errno));
|
||||
|
return -1; |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
int Uart::send(const char *data, int size) { |
||||
|
// if (logger->level() <= level::debug) {
|
||||
|
// logger->debug("{} send: {}", m_name, StringUtils().bytesToString((const uint8_t *)data, size));
|
||||
|
// }
|
||||
|
int sent = 0; |
||||
|
sent = write(m_fd, data, size); |
||||
|
if (sent < 0) { |
||||
|
// m_error = fmt::format("write {} failed,{}", m_name, strerror(errno));
|
||||
|
} |
||||
|
return sent; |
||||
|
} |
||||
|
int Uart::receive(char *data, int size_max) { |
||||
|
int received = 0; |
||||
|
received = read(m_fd, data, size_max); |
||||
|
if (received < 0) { |
||||
|
// m_error = fmt::format("read {} failed,{}", m_name, strerror(errno));
|
||||
|
} |
||||
|
// if (logger->level() <= level::debug) {
|
||||
|
// logger->debug("{} receive: {}", m_name, StringUtils().bytesToString((const uint8_t *)data, received));
|
||||
|
// }
|
||||
|
return received; |
||||
|
} |
||||
|
int Uart::receive(char *data, int size, int overtimems) { |
||||
|
if (m_fd < 0) return -1; |
||||
|
|
||||
|
int64_t now = getnowms(); |
||||
|
int64_t end = now + overtimems; |
||||
|
int rc = 0; |
||||
|
int total = 0; |
||||
|
while (getnowms() < end) { |
||||
|
rc = receive(data + total, size - total); |
||||
|
if (rc > 0) { |
||||
|
total += rc; |
||||
|
if (total >= size) break; |
||||
|
} |
||||
|
usleep(333); |
||||
|
} |
||||
|
return total; |
||||
|
} |
||||
|
int Uart::close() { |
||||
|
::close(m_fd); |
||||
|
m_fd = -1; |
||||
|
return 0; |
||||
|
} |
||||
|
bool Uart::flush_rx() { |
||||
|
if (m_fd < 0) return false; |
||||
|
int rc = tcflush(m_fd, TCIFLUSH); |
||||
|
return rc == 0; |
||||
|
} |
||||
|
bool Uart::flush_tx() { |
||||
|
if (m_fd < 0) return false; |
||||
|
int rc = tcflush(m_fd, TCOFLUSH); |
||||
|
return rc == 0; |
||||
|
} |
||||
|
bool Uart::set_rx_overtime(int n100ms) { |
||||
|
if (m_fd < 0) return false; |
||||
|
m_tty.c_cc[VTIME] = n100ms; |
||||
|
int rc = tcsetattr(this->m_fd, TCSANOW, &m_tty); |
||||
|
return rc == 0; |
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
#pragma once
|
||||
|
#include <termios.h>
|
||||
|
#include <unistd.h>
|
||||
|
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
namespace iflytop { |
||||
|
using namespace std; |
||||
|
class Uart { |
||||
|
private: |
||||
|
/* data */ |
||||
|
int m_fd = 0; |
||||
|
string m_name; |
||||
|
string m_rate; |
||||
|
struct termios m_tty; |
||||
|
string m_error; |
||||
|
|
||||
|
public: |
||||
|
Uart(); |
||||
|
~Uart(); |
||||
|
|
||||
|
/**
|
||||
|
* @brief 打开串口 |
||||
|
* |
||||
|
* @param path |
||||
|
* @param rate |
||||
|
* "0" "50" "75" "110" |
||||
|
* "134" "150" "200" "300" |
||||
|
* "600" "1200" "1800" "2400" |
||||
|
* "4800" "9600" "19200" "38400" |
||||
|
* "57600" "115200" "230400" "460800" |
||||
|
* "500000" "576000" "921600" "1000000" |
||||
|
* "1152000" "1500000" "2000000" "2500000" |
||||
|
* "3000000" "3500000" "4000000" |
||||
|
* |
||||
|
* @return int |
||||
|
*/ |
||||
|
int open(string path, string rate); |
||||
|
int send(const char *data, int size); |
||||
|
int receive(char *data, int size_max); |
||||
|
int receive(char *data, int size, int overtimems); |
||||
|
int close(); |
||||
|
|
||||
|
string get_error() { return m_error; } |
||||
|
|
||||
|
bool flush_rx(); |
||||
|
bool flush_tx(); |
||||
|
bool set_rx_overtime(int n100ms); |
||||
|
}; |
||||
|
|
||||
|
} // namespace iflytop
|
@ -0,0 +1,4 @@ |
|||||
|
mkdir -p build |
||||
|
cd build |
||||
|
cmake .. |
||||
|
make -j8 install |
@ -0,0 +1,19 @@ |
|||||
|
#!/bin/bash |
||||
|
# ./sh/deploy.sh username ip |
||||
|
|
||||
|
set -e |
||||
|
|
||||
|
if [ $# -ne 2 ]; then |
||||
|
echo "Usage: ./sh/deploy.sh username ip" |
||||
|
exit 1 |
||||
|
fi |
||||
|
|
||||
|
# 1. Build |
||||
|
./sh/build.sh |
||||
|
|
||||
|
cd build |
||||
|
make -j8 install |
||||
|
tar -cvf app.tar app |
||||
|
|
||||
|
scp app.tar $1@$2:/home/$1/ |
||||
|
ssh $1@$2 "cd /home/$1/ && tar -xvf app.tar" |
@ -0,0 +1,16 @@ |
|||||
|
# README |
||||
|
|
||||
|
``` |
||||
|
在工程目录下的CmakeLists.txt,包含此目录下的文件,或者将下面的文件拷贝到工程目录中即可 |
||||
|
|
||||
|
####demo#### |
||||
|
|
||||
|
include(zcmake/zcmake.cmake) |
||||
|
|
||||
|
zadd_executable( |
||||
|
TARGET app.out |
||||
|
SRC src/main.cpp |
||||
|
) |
||||
|
|
||||
|
############ |
||||
|
``` |
@ -0,0 +1,114 @@ |
|||||
|
include(CMakeParseArguments) |
||||
|
|
||||
|
# zadd_executable( |
||||
|
# |
||||
|
# # #################### 目标文件 ################# |
||||
|
# TARGET |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 依赖 #################### |
||||
|
# DEPENDENCIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 头文件路径 ############### |
||||
|
# INCLUDE_DIRECTORIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 链接的第三方库 ############ |
||||
|
# LINK_LIBRARIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 源文件 ################## |
||||
|
# SRC |
||||
|
# ... |
||||
|
# ) |
||||
|
|
||||
|
function(zadd_executable) |
||||
|
set(oneValueArgs NAME TARGET) |
||||
|
set(multiValueArgs |
||||
|
INSTALL |
||||
|
SRC |
||||
|
DEFINES |
||||
|
DEPENDENCIES |
||||
|
LINK_LIBRARIES |
||||
|
LINK_DIRECTORIES |
||||
|
INCLUDE_DIRECTORIES) |
||||
|
|
||||
|
|
||||
|
cmake_parse_arguments(ZADD_EXECUTABLE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
||||
|
|
||||
|
message("=================================================================") |
||||
|
message("= zadd_executable:${ZADD_EXECUTABLE_TARGET}") |
||||
|
message("=================================================================") |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_TARGET) |
||||
|
message("ADD TARGET: ${ZADD_EXECUTABLE_TARGET}") |
||||
|
else() |
||||
|
message(FATAL_ERROR,"zadd_executable not set target") |
||||
|
endif() |
||||
|
|
||||
|
message("CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") |
||||
|
message("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}") |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_INSTALL) |
||||
|
message("INSTALL : ${ZADD_EXECUTABLE_INSTALL}") |
||||
|
endif() |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_SRC) |
||||
|
# message("SRC: ${ZADD_EXECUTABLE_SRC}") |
||||
|
# foreach(EACH ${ZADD_EXECUTABLE_SRC}) |
||||
|
# message(" ${EACH}") |
||||
|
# endforeach(EACH) |
||||
|
else() |
||||
|
message(FATAL_ERROR,"zadd_executable not set src") |
||||
|
endif() |
||||
|
|
||||
|
add_executable(${ZADD_EXECUTABLE_TARGET} ${ZADD_EXECUTABLE_SRC}) |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_DEFINES) |
||||
|
message("DEFINES:") |
||||
|
foreach(EACH ${ZADD_EXECUTABLE_DEFINES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_compile_definitions(${ZADD_EXECUTABLE_TARGET} PRIVATE ${ZADD_EXECUTABLE_DEFINES}) |
||||
|
endif() |
||||
|
|
||||
|
|
||||
|
if(ZADD_EXECUTABLE_DEPENDENCIES) |
||||
|
message("DEPENDENCIES: ") |
||||
|
foreach(EACH ${ZADD_EXECUTABLE_DEPENDENCIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
add_dependencies(${ZADD_EXECUTABLE_TARGET} ${ZADD_EXECUTABLE_DEPENDENCIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_LINK_LIBRARIES) |
||||
|
message("LINK_LIBRARIES:") |
||||
|
foreach(EACH ${ZADD_EXECUTABLE_LINK_LIBRARIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_libraries(${ZADD_EXECUTABLE_TARGET} ${ZADD_EXECUTABLE_LINK_LIBRARIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_LINK_DIRECTORIES) |
||||
|
message("LINK_DIRECTORIES:") |
||||
|
foreach(EACH ${ZADD_EXECUTABLE_LINK_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_directories(${ZADD_EXECUTABLE_TARGET} PRIVATE ${ZADD_EXECUTABLE_LINK_DIRECTORIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_INCLUDE_DIRECTORIES) |
||||
|
message("INCLUDE_DIRECTORIES:") |
||||
|
foreach(EACH ${ZADD_EXECUTABLE_INCLUDE_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_include_directories(${ZADD_EXECUTABLE_TARGET} PRIVATE ${ZADD_EXECUTABLE_INCLUDE_DIRECTORIES}) |
||||
|
endif() |
||||
|
message("") |
||||
|
message("") |
||||
|
|
||||
|
if(ZADD_EXECUTABLE_INSTALL) |
||||
|
install(TARGETS ${ZADD_EXECUTABLE_TARGET} DESTINATION ${ZADD_EXECUTABLE_INSTALL}) |
||||
|
endif() |
||||
|
endfunction(zadd_executable) |
@ -0,0 +1,207 @@ |
|||||
|
include(CMakeParseArguments) |
||||
|
# zadd_library( |
||||
|
# |
||||
|
# # #################### 目标文件 ################# |
||||
|
# TARGET |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 依赖 #################### |
||||
|
# DEPENDENCIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 头文件路径 ############### |
||||
|
# INCLUDE_DIRECTORIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 链接的第三方库 ############ |
||||
|
# LINK_LIBRARIES |
||||
|
# ... |
||||
|
# |
||||
|
# # #################### 源文件 ################## |
||||
|
# SRC |
||||
|
# ... |
||||
|
# ) |
||||
|
|
||||
|
function(zadd_library) |
||||
|
set(oneValueArgs NAME TARGET) |
||||
|
set(multiValueArgs |
||||
|
INSTALL |
||||
|
SRC |
||||
|
DEPENDENCIES |
||||
|
DEFINES |
||||
|
LINK_LIBRARIES |
||||
|
LINK_DIRECTORIES |
||||
|
INCLUDE_DIRECTORIES) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
cmake_parse_arguments(ZAL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
||||
|
message("=================================================================") |
||||
|
message("= add_library: ${ZAL_TARGET}") |
||||
|
message("=================================================================") |
||||
|
message("CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") |
||||
|
message("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}") |
||||
|
if(ZAL_TARGET) |
||||
|
message("ADD TARGET:${ZAL_TARGET}") |
||||
|
else() |
||||
|
message(FATAL_ERROR,"ZAL not set target") |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INSTALL) |
||||
|
message("INSTALL : ${ZAL_INSTALL}") |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_SRC) |
||||
|
# message("SRC: ${ZAL_SRC}") |
||||
|
# message("SRC:") |
||||
|
# foreach(EACH ${ZAL_SRC}) |
||||
|
# message(" ${EACH}") |
||||
|
# endforeach(EACH) |
||||
|
else() |
||||
|
message(FATAL_ERROR,"ZAL not set src") |
||||
|
endif() |
||||
|
|
||||
|
add_library(${ZAL_TARGET} ${ZAL_SRC}) |
||||
|
|
||||
|
|
||||
|
if(ZAL_DEFINES) |
||||
|
message("DEFINES:") |
||||
|
foreach(EACH ${ZAL_DEFINES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_compile_definitions(${ZAL_TARGET} PRIVATE ${ZAL_DEFINES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_DEPENDENCIES) |
||||
|
message("DEPENDENCIES:") |
||||
|
foreach(EACH ${ZAL_DEPENDENCIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
add_dependencies(${ZAL_TARGET} ${ZAL_DEPENDENCIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_LINK_LIBRARIES) |
||||
|
message("LINK_LIBRARIES:") |
||||
|
foreach(EACH ${ZAL_LINK_LIBRARIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_libraries(${ZAL_TARGET} ${ZAL_LINK_LIBRARIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_LINK_DIRECTORIES) |
||||
|
message("LINK_DIRECTORIES:") |
||||
|
foreach(EACH ${ZAL_LINK_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_directories(${ZAL_TARGET} PRIVATE ${ZAL_LINK_DIRECTORIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INCLUDE_DIRECTORIES) |
||||
|
message("INCLUDE_DIRECTORIES:") |
||||
|
foreach(EACH ${ZAL_INCLUDE_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_include_directories(${ZAL_TARGET} PRIVATE ${ZAL_INCLUDE_DIRECTORIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INSTALL) |
||||
|
install(TARGETS ${ZAL_TARGET} DESTINATION ${ZAL_INSTALL}) |
||||
|
endif() |
||||
|
message("") |
||||
|
message("") |
||||
|
|
||||
|
endfunction(zadd_library) |
||||
|
|
||||
|
|
||||
|
|
||||
|
function(zadd_share_library) |
||||
|
set(oneValueArgs NAME TARGET) |
||||
|
set(multiValueArgs |
||||
|
INSTALL |
||||
|
SRC |
||||
|
DEPENDENCIES |
||||
|
DEFINES |
||||
|
LINK_LIBRARIES |
||||
|
LINK_DIRECTORIES |
||||
|
INCLUDE_DIRECTORIES) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
cmake_parse_arguments(ZAL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) |
||||
|
message("=================================================================") |
||||
|
message("= add_library: ${ZAL_TARGET}") |
||||
|
message("=================================================================") |
||||
|
message("CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") |
||||
|
message("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}") |
||||
|
if(ZAL_TARGET) |
||||
|
message("ADD TARGET:${ZAL_TARGET}") |
||||
|
else() |
||||
|
message(FATAL_ERROR,"ZAL not set target") |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INSTALL) |
||||
|
message("INSTALL : ${ZAL_INSTALL}") |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_SRC) |
||||
|
# message("SRC: ${ZAL_SRC}") |
||||
|
# message("SRC:") |
||||
|
# foreach(EACH ${ZAL_SRC}) |
||||
|
# message(" ${EACH}") |
||||
|
# endforeach(EACH) |
||||
|
else() |
||||
|
message(FATAL_ERROR,"ZAL not set src") |
||||
|
endif() |
||||
|
|
||||
|
add_library(${ZAL_TARGET} SHARED ${ZAL_SRC}) |
||||
|
|
||||
|
|
||||
|
if(ZAL_DEFINES) |
||||
|
message("DEFINES:") |
||||
|
foreach(EACH ${ZAL_DEFINES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_compile_definitions(${ZAL_TARGET} PRIVATE ${ZAL_DEFINES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_DEPENDENCIES) |
||||
|
message("DEPENDENCIES:") |
||||
|
foreach(EACH ${ZAL_DEPENDENCIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
add_dependencies(${ZAL_TARGET} ${ZAL_DEPENDENCIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_LINK_LIBRARIES) |
||||
|
message("LINK_LIBRARIES:") |
||||
|
foreach(EACH ${ZAL_LINK_LIBRARIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_libraries(${ZAL_TARGET} ${ZAL_LINK_LIBRARIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_LINK_DIRECTORIES) |
||||
|
message("LINK_DIRECTORIES:") |
||||
|
foreach(EACH ${ZAL_LINK_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_link_directories(${ZAL_TARGET} PRIVATE ${ZAL_LINK_DIRECTORIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INCLUDE_DIRECTORIES) |
||||
|
message("INCLUDE_DIRECTORIES:") |
||||
|
foreach(EACH ${ZAL_INCLUDE_DIRECTORIES}) |
||||
|
message(" ${EACH}") |
||||
|
endforeach(EACH) |
||||
|
target_include_directories(${ZAL_TARGET} PRIVATE ${ZAL_INCLUDE_DIRECTORIES}) |
||||
|
endif() |
||||
|
|
||||
|
if(ZAL_INSTALL) |
||||
|
install(TARGETS ${ZAL_TARGET} DESTINATION ${ZAL_INSTALL}) |
||||
|
endif() |
||||
|
message("") |
||||
|
message("") |
||||
|
|
||||
|
endfunction(zadd_share_library) |
@ -0,0 +1,4 @@ |
|||||
|
include(CMakeParseArguments) |
||||
|
include(zcmake/zadd_library.cmake) |
||||
|
include(zcmake/zadd_executable.cmake) |
||||
|
include(zcmake/zadd_executable_simple.cmake) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue