完成的任务
本文章主要完成I/O控制灯的部分,通过四路继电器组,完成对四个地方灯的控制。
程序
程序分为:
程序分类 | 名称 | 功能 |
主程序 | mainPro.c | |
头文件 | inputCommand.h | 用于声明指令工厂部分的函数、结构体 |
contrlDevice.h | 用于声明控制工厂部分的函数、结构体 | |
子程序 | bathroom.c | 浴室灯部分的程序、结构体 |
livingroom.c | 客厅灯部分的程序、结构体 | |
secondfloor.c | 二楼灯部分的程序、结构体 | |
Kitchen.c | 餐厅灯部分的程序、结构体 |
注:在实现功能时,需充分发挥工厂模式的优点,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
==在代码编写,只需写好一个部分的灯控程序,其他部分直接ctrl+c\ctrl+v即可。==
使用的I/O口:
头文件
inputCommand.h
本部分还未接入语音控制与Socket,故使用的是scanf来手动输入指令,所以此处inputCommand.h未使用,后序章节会使用。
contrlDevice.h
#include<wiringPi.h>
#include<stdio.h>
#include<string.h>
/*控制工厂“设备”类声明*/
struct Device{
/*设备名称*/
char deviceName[128];
/*设备IO口(wiringPi编码)*/
int pinNum;
/*设备初始化*/
int (*deviceInit)(int pinNum);
/*设备打开*/
int (*deviceOpen)(int pinNum);
/*设备关闭*/
int (*deviceClose)(int pinNum);
/*设备状态*/
int deviceStatus;
/*设备状态读取*/
int (*devicereadStatus)(int pinNum);
/*设备状态改变*/
int (*devicechangeStatus)(int pinNum,int deviceStatus);
/*指向下一个设备对象*/
struct Device *next;
};
/*头插法控制工厂链表生成函数声明*/
struct Device *putHeadLinkKitchenLight(struct Device *phead);
struct Device *putHeadLinkSecondroomLight(struct Device *phead);
struct Device *putHeadLinkBathroomLight(struct Device *phead);
struct Device *putHeadLinklivingroomLight(struct Device *phead);
子程序
bathroom.c
#include"contrlDevice.h"
/*浴室灯打开*/
int bathroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
/*浴室灯关闭*/
int bathroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
/*浴室灯初始化*/
int bathroomLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
/*浴室灯状态改变(暂未用)*/
int bathroomLightChangeStatus(int pinNum,int deviceStatus)
{
}
struct Device bathroomLight={
.deviceName="bathroomLight",
.deviceInit=bathroomLightInit,
.deviceOpen=bathroomLightOpen,
.deviceClose=bathroomLightClose,
.devicechangeStatus=bathroomLightChangeStatus,
.pinNum=23,
.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkBathroomLight(struct Device *phead)
{
if(phead==NULL){
phead=&bathroomLight;
return phead;
}else{
bathroomLight->next=phead;
phead=&bathroomLight;
return phead;
}
}
livingroom.c
#include"contrlDevice.h"
int livingLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
int livingLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
int livingLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
int livingLightChangeStatus(int pinNum,int deviceStatus)
{
}
struct Device livingLight={
.deviceName="livingLight",
.deviceInit=livingLightInit,
.deviceOpen=livingLightOpen,
.deviceClose=livingLightClose,
.devicechangeStatus=livingLightChangeStatus,
.pinNum=22,
.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinklivingroomLight(struct Device *phead)
{
if(phead==NULL){
phead=&livingLight;
return phead;
}else{
livingLight->next=phead;
phead=&livingLight;
return phead;
}
}
secondfloor.c
#include"contrlDevice.h"
int secondroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
int secondroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
int secondroomLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
int secondroomLightChangeStatus(int pinNum,int deviceStatus)
{
}
struct Device secondroomLight={
.deviceName="secondroomLight",
.deviceInit=secondroomLightInit,
.deviceOpen=secondroomLightOpen,
.deviceClose=secondroomLightClose,
.devicechangeStatus=secondroomLightChangeStatus,
.pinNum=24,
.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkSecondroomLight(struct Device *phead)
{
if(phead==NULL){
phead=&secondroomLight;
return phead;
}else{
secondroomLight->next=phead;
phead=&secondroomLight;
return phead;
}
}
Kitchen.c
#include"contrlDevice.h"
int kitchenLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
int kitchenLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
int kitchenLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
int kitchenLightChangeStatus(int pinNum,int deviceStatus)
{
}
struct Device kitchenLight={
.deviceName="kitchenLight",
.deviceInit=kitchenLightInit,
.deviceOpen=kitchenLightOpen,
.deviceClose=kitchenLightClose,
.devicechangeStatus=kitchenLightChangeStatus,
.pinNum=21,
.deviceStatus=0
};
/*头插法控制工厂链表生成*/
struct Device *putHeadLinkKitchenLight(struct Device *phead)
{
if(phead==NULL){
phead=&kitchenLight;
return phead;
}else{
kitchenLight->next=phead;
phead=&kitchenLight;
return phead;
}
}
主程序
mainPro.c
#include"inputCommand.h"
#include"contrlDevice.h"
/*根据获取的指令在控制工厂内查找对应的控制对象,成功返回对象结构体地址,失败返回NULL*/
struct Device *findDeviceLinkByName(char *name,struct Device*Head)
{
struct Device *tmp=Head;
if(Head==NULL){
printf("linkList is empty!\n");
return NULL;
}
while(tmp!=NULL){
if(strcmp(tmp->deviceName,name)==0){
printf("Device name:%s\n",tmp->deviceName);
tmp->deviceInit(tmp->pinNum);
return tmp;
}else{
tmp=tmp->next;
}
}
return NULL;
}
int main()
{
int initflag=0;
struct Device *tmp=NULL;
struct Device *pLightHead=NULL;
char name[16]={'\0'};
/*树莓派I/O口初始化*/
initflag=wiringPiSetup();
if(initflag == -1){
printf("硬件接口初始化失败\n");
return -1;
}
/*控制工厂链表生成*/
pLightHead=putHeadLinkKitchenLight(pLightHead);
pLightHead=putHeadLinkSecondroomLight(pLightHead);
pLightHead=putHeadLinkBathroomLight(pLightHead);
pLightHead=putHeadLinklivingroomLight(pLightHead);
pLightHead=putHeadLinkFireCheck(pLightHead);
while(1){
/*手动输入指令,模拟语音控制、socket,后序章节升级*/
printf("intput Device name:\n");
scanf("%s",name);
/*根据获取的指令在控制工厂内查找对应的控制对象*/
tmp=findDeviceLinkByName(name,pLightHead);
/*控制对象执行控制指令*/
if(tmp!=NULL){
tmp->deviceOpen(tmp->pinNum);
delay(1000);
tmp->deviceClose(tmp->pinNum);
delay(1000);
tmp->deviceOpen(tmp->pinNum);
}else{
printf("NO find input name\n");
}
}
return 0;
}
实验结果: