智能家居 (3) ——语音识别控制线程

目录

    • 1.工厂模式创建语音控制对象:
        • (1)voiceControl.c 文件(语音控制)
        • (2)command.h 文件(指令方式类)
    • 2.多线程控制——语音控制(调试):
        • (1)main.c 文件(主函数)
        • (2)YS-LDV7语音模块
    • 3.往期文章:

语音识别 > 树莓派串口 > 控制设备

1.工厂模式创建语音控制对象:

(1)voiceControl.c 文件(语音控制)

#include "command.h"			//自定义类文件
#include 

void voiceControlInit(struct Command *file);						//“语音控制”功能初始化函数声明
int voiceControlGetCommand(struct Command *cmd);					//“获取指令”函数初始化
struct Command *addVoiceControlToLink(struct Command *phead);
//“语音控制”(对象)加入指令链表函数声明

struct Command voiceControl = {
     						//定义“语音控制”对象
	.commandName = "voiceControl",					//名字
	.deviceFilesName = "/dev/ttyAMA0",				//树莓派串口文件所在地址
	.command = {
     '\0'},								//初始化储存“指令”的空间
	.Init = voiceControlInit,						//指定“语音控制”功能初始化函数
	.getCommand = voiceControlGetCommand,			//指定“获取指令”函数
};

void voiceControlInit(struct Command *file)
{
     
	int fd;
	if((fd = serialOpen(file->deviceFilesName,9600)) == -1){
     		//打开树莓派串口,波特率指定为9600
		exit(-1);
	}
	file->fd = fd;				//打开串口文件成功,返回“文件描述符”到“语音控制”对象中
}

int voiceControlGetCommand(struct Command *cmd)
{
     
	int nread = 0;
	nread = read(cmd->fd,cmd->command,sizeof(cmd->command));	//读取串口
	return nread;												//返回读取到数据的字节数
}

struct Command *addVoiceControlToLink(struct Command *phead)	//“语音控制”(对象)加入指令方式链表函数
{
     
	if(phead == NULL){
     
		return &voiceControl;
	}else{
     
		voiceControl.next = phead;
		phead = &voiceControl;
		return phead;
	}
}

(2)command.h 文件(指令方式类)

#include 
#include 
#include 
#include 

struct Command
{
     
	char commandName[128];						//“控制方式”名
	char deviceFilesName[128];					//存放初始化所需文件的路径
	char command[32];							//存放指令
	int fd;										//存放文件描述符
	void (*Init)(struct Command *file);			//“初始化”函数指针
	int s_fd;
	char ipAdress[32];
	char port[12];
	int (*getCommand)(struct Command *cmd);		//“获取指令”函数指针

	struct Command *next;
};

struct Command *addvoiceControlToLink(struct Command *phead);		//“语音控制”加入指令链表函数声明

2.多线程控制——语音控制(调试):

(1)main.c 文件(主函数)

仅调试功能

#include 
#include 
#include "equipment.h"
#include "command.h"

struct Equipment *findEquipByName(char *name,struct Equipment *phead);		//链节查找函数声明
struct Command *findCommandByName(char *name,struct Command *phead);		//链节查找函数声明
void *voiceControl_thread(void *data);										//“语音控制”线程函数声明

struct Command *cmdhead = NULL;					//初始化“指令方式”链表

int main()
{
     
	cmdhead = addVoiceControlToLink(cmdhead);			//“语音控制”对象加入链表

	pthread_t voiceControl_thread_t;					//存放线程 ID

	pthread_create(&voiceControl_thread_t,NULL,voiceControl_thread,NULL);		//创建“语音控制”线程
	
	return 0;
}


void *voiceControl_thread(void *data)				//“语音控制”线程
{
     
	int nread;
	struct Command *voiceHandler = NULL;

	voiceHandler = findCommandByName("voiceControl",cmdhead);		//寻找“语音控制”链节,返回给voiceHandler
	if(voiceHandler == NULL){
     										//找不到
		printf("find voiceHandler error\n");
		pthread_exit(NULL);											//线程退出
	}else{
     															//找到
		if(voiceHandler->Init(voiceHandler) < 0){
     					//初始化
			printf("voiceHandler init error\n");					//初始化失败
			pthread_exit(NULL);										//线程退出
		}

		while(1){
     
			nread = voiceHandler->getCommand(voiceHandler);						//读取指令
			if(nread == 0){
     														//没接收到指令
				printf("No command received\n");
			}else{
     																//接收到指令
				printf("Get command:%s\n",voiceHandler->command);
			}
		}
	}
}


struct Equipment *findEquipByName(char *name,struct Equipment *phead)		//“设备”链表查找链节函数
{
     
	struct Equipment *tmp = phead;

	if(phead == NULL){
     
		return NULL;
	}

	while(tmp != NULL){
     
		if(strcmp(name,tmp->equipName) == 0){
     
			return tmp;
		}
		tmp = tmp->next;
	}
	return NULL;
}

struct Command *findCommandByName(char *name,struct Command *phead)			//“控制方式”链表查找链节函数
{
     
	struct Command *tmp = phead;

	if(phead == NULL){
     
		return NULL;
	}

	while(tmp != NULL){
     
		if(strcmp(name,tmp->commandName) == 0){
     
			return tmp;
		}
		tmp = tmp->next;
	}
	return NULL;
}

(2)YS-LDV7语音模块

待更新

3.往期文章:

设备相关内容见往期文章
智能家居 (1) ——工厂模式继电器控制灯
智能家居 (2) ——工厂模式火焰报警器

你可能感兴趣的