# ToolKit
![version](https://img.shields.io/badge/version-V1.0.6-brightgreen.svg) ![date](https://img.shields.io/badge/date-2020.12.09-brightgreen.svg)
## 1、介绍
[ToolKit](https://github.com/cproape)是一套应用于嵌入式系统的通用工具包,可灵活应用到有无RTOS的程序中,采用C语言面向对象的思路实现各个功能,尽可能最大化的复用代码,目前为止工具包包含:**循环队列、软件定时器、事件集**。
- **Queue** 循环队列
1. 支持动态、静态方式进行队列的创建与删除。
2. 可独立配置缓冲区大小。
3. 支持数据**最新保持**功能,当配置此模式并且缓冲区已满,若有新的数据存入,将会移除最早数据,并保持缓冲区已满。
- **Timer** 软件定时器
1. 支持动态、静态方式进行定时器的创建与删除。
2. 支持**循环**、**单次**模式。
3. 可配置有无超时回调函数。
4. 可配置定时器工作在**周期**或**间隔**模式。
5. 使用双向链表,超时统一管理,不会因为增加定时器而增加超时判断代码。
- **Event** 事件集
1. 支持动态、静态方式进行事件集的创建与删除。
2. 每个事件最大支持**32**个标志位。
3. 事件的触发可配置为**“标志与”**和**“标志或”**。
## 2 、文件目录
```
toolkit
├── include // 包含文件目录
| ├── toolkit.h // toolkit头文件
| └── toolkit_cfg.h // toolkit配置文件
├── src // toolkit源码目录
| ├── tk_queue.c // 循环队列源码
| ├── tk_timer.c // 软件定时器源码
| └── tk_event.c // 事件集源码
├── samples // 例子
| ├── tk_queue_samples.c // 循环队列使用例程源码
| ├── tk_timer_samples.c // 软件定时器使用例程源码
| └── tk_event_samples.c // 事件集使用例程源码
└── README.md // 说明文档
```
## 3 、函数定义
### 3.1 配置文件
****
- **ToolKit配置项**
| 宏定义 | 描述 |
| -------------------- | ------------------------- |
| TOOLKIT_USING_ASSERT | ToolKit使用断言功能 |
| TOOLKIT_USING_QUEUE | ToolKit使用循环队列功能 |
| TOOLKIT_USING_TIMER | ToolKit使用软件定时器功能 |
| TOOLKIT_USING_EVENT | ToolKit使用事件集功能 |
- **Queue 循环队列配置项**
| 宏定义 | 描述 |
| --------------------- | -------------------------------- |
| TK_QUEUE_USING_CREATE | Queue 循环队列使用动态创建和删除 |
- **Timer 软件定时器配置项**
| 宏定义 | 描述 |
| ------------------------------- | ---------------------------------- |
| TK_TIMER_USING_CREATE | Timer 软件定时器使用动态创建和删除 |
| TK_TIMER_USING_INTERVAL | Timer 软件定时器使用间隔模式 |
| TK_TIMER_USING_TIMEOUT_CALLBACK | Timer 软件定时器使用超时回调函数 |
- **Event 事件集配置项**
| 宏定义 | 描述 |
| --------------------- | ------------------------------ |
| TK_EVENT_USING_CREATE | Event 事件集使用动态创建和删除 |
> **说明**:当配置**TOOLKIT_USING_ASSERT**后,所有功能都将会启动参数检查。
### 3.2 Queue 循环队列API函数
****
> 以下为详细API说明及简要示例程序,综合demo可查看[tk_queue_samples.c](./samples/tk_queue_samples.c)示例。
#### 3.2.1 动态创建队列
> **注意**:当配置**TOOLKIT_USING_QUEUE**后,才能使用此函数。此函数需要用到**malloc**。
```c
struct tk_queue *tk_queue_create(uint16_t queue_size, uint16_t max_queues, bool keep_fresh);
```
| 参数 | 描述 |
| ---------- | ------------------------------------------------------------ |
| queue_size | 缓存区大小(单位字节) |
| max_queues | 最大队列个数 |
| keep_fresh | 是否为保持最新模式,**true**:保持最新;**false**:默认(存满不能再存) |
| 返回值 | 创建的队列对象(**NULL**为创建失败) |
**队列创建示例:**
```c
int main(int argc, char *argv[])
{
/* 动态方式创建一个循环队"queue",缓冲区大小50字节,不保持最新 */
struct tk_queue *queue = tk_queue_create(50, 1, false);
if( queue == NULL){
printf("队列创建失败!\n");
}
/* ... */
/* You can add your code under here. */
return 0;
}
```
#### **3.2.2** 动态删除队列
> **注意**:当配置**TOOLKIT_USING_QUEUE**后,才能使用此函数。此函数需要用到**free**。必须为**动态**方式创建的队列对象。
```c
bool tk_queue_delete(struct tk_queue *queue);
```
| 参数 | 描述 |
| ------ | --------------------------------------- |
| queue | 要删除的队列对象 |
| 返回值 | **true**:删除成功;**false**:删除失败 |
#### **3.2.3** 静态初始化队列
```c
bool tk_queue_init(struct tk_queue *queue, void *queuepool, uint16_t pool_size, uint16_t queue_size, bool keep_fresh);
```
| 参数 | 描述 |
| ---------- | ------------------------------------------------------------ |
| queue | 要初始化的队列对象 |
| *queuepool | 队列缓存区 |
| pool_size | 缓存区大小(单位字节) |
| queue_size | 队列元素大小(单位字节) |
| keep_fresh | 是否为保持最新模式,**true**:保持最新;**false**:默认(存满不能再存) |
| 返回值 | **true**:初始化成功;**false**:初始化失败 |
**队列创建示例:**
```c
int main(int argc, char *argv[])
{
/* 定义一个循环队列 */
struct tk_queue queue;
/* 定义循环队列缓冲区 */
uint8_t queue_pool[100];
/* 静态方式创建一个循环队列"queue",缓存区为queue_pool,大小为queue_pool的大小,模式为保持最新 */
if( tk_queue_init(&queue, queue_pool, sizeof(queue_pool),
sizeof(queue_pool[0]), true) == false){
printf("队列创建失败!\n");
}
/* ... */
/* You can add your code under here. */
}
```
#### 3.2.4 静态脱离队列
> **注意**: 会使缓存区脱离与队列的关联。必须为**静态**方式创建的队列对象。
```c
bool tk_queue_detach(struct tk_queue *queue);
```
| 参数 | 描述 |
| ------ | --------------------------------------- |
| queue | 要脱离的队列对象 |
| 返回值 | **true**:脱离成功;**false**:脱离失败 |
#### 3.2.5 清空队列
```c
bool tk_queue_clean(struct tk_queue *queue);
```
| 参数 | 描述 |
| ------ | --------------------------------------- |
| queue | 要清空的队列对象 |
| 返回值 | **true**:清除成功;**false**:清除失败 |
#### 3.2.6 判断队列是否为空
```c
bool tk_queue_empty(struct tk_queue *queue);
```
| 参数 | 描述 |
| ------ | ------------------------------- |
| queue | 要查询的队列对象 |
| 返回值 | **true**:空;**false**:不为空 |
#### 3.2.7 判断队列是否已满
```c
bool tk