采用工廠模式以面向對象的方式來封裝各種設備模塊,方便整合項目以及后期的維護和擴展
mainPro.c(主函數)
#include <stdio.h>
#include "controlDevice.h"struct Devices *pdeviceHead = NULL; //設備工廠鏈表頭struct Devices* findDeviceByName(struct Devices *phead,char *name) //在設備鏈表中查找設備
{struct Devices *tmp = phead;if(tmp == NULL){printf("The devicesLink is NULL");return NULL;}else{while(tmp != NULL){if(strcmp(tmp->deviceName,name) == 0){return tmp;}tmp = tmp->next;}return NULL; }}int main()
{if(wiringPiSetup()<0){//初始化wiringPi外設庫printf("wiringPi Init failed\n");return -1;}//設備控制工廠初始化pdeviceHead = addBathroomLightToDeviceLink(pdeviceHead); //將衛生燈加入設備鏈表pdeviceHead = addbedroomLightToDeviceLink(pdeviceHead); //將臥室燈加入設備鏈表pdeviceHead = addRestaurantLightToDeviceLink(pdeviceHead); //將餐廳燈加入設備鏈表pdeviceHead = addLivingroomLightToDeviceLink(pdeviceHead); //將客廳燈加入設備鏈表pdeviceHead = addFireToDeviceLink(pdeviceHead); //將火災檢測加入設備鏈表pdeviceHead = addBeepToDeviceLink(pdeviceHead); //將蜂鳴器加入設備鏈表
controlDevice.h( 設備類)
#include <wiringPi.h>
#include <stddef.h>struct Devices
{char deviceName[128]; //設備名字int status; //狀態int pinNum; //引腳int (*deviceInit)(int pinNum); //設備初始化函數指針,后面類似int (*open)(int pinNum); //打開設備int (*close)(int pinNum); //關閉設備int (*readStatus)(int pinNum); //讀取引腳狀態int (*changeStatus)(int status);struct Devices *next; //方便鏈表使用的結構體指針
};struct Devices *addBathroomLightToDeviceLink(struct Devices *phead); //衛生間燈加入設備鏈表聲明,以下類似
struct Devices *addbedroomLightToDeviceLink(struct Devices *phead); //臥室燈
struct Devices *addRestaurantLightToDeviceLink(struct Devices *phead); //餐廳燈
struct Devices *addLivingroomLightToDeviceLink(struct Devices *phead); //客廳燈
struct Devices *addFireToDeviceLink(struct Devices *phead); //火災檢測器
struct Devices *addBeepToDeviceLink(struct Devices *phead); //蜂鳴器
bathroomLight.c(浴室燈)
#include "controlDevice.h"int bathroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);digitalWrite(pinNum,HIGH);}int bathroomLightOpen(int pinNum)
{digitalWrite(pinNum,LOW);
}int bathroomLightClose(int pinNum)
{digitalWrite(pinNum,HIGH);}int bathroomLightChangeStatus()
{//暫時不用,后面用著在完善}struct Devices bathroomLight = {.deviceName = "bathroomLight",.pinNum = 26,.deviceInit = bathroomLightInit,.open = bathroomLightOpen,.close = bathroomLightClose,.changeStatus = bathroomLightChangeStatus,};struct Devices *addBathroomLightToDeviceLink(struct Devices *phead) //將浴室燈加入設備鏈表的函數
{if(phead == NULL){return &bathroomLight;}else{bathroomLight.next=phead;phead = &bathroomLight;return phead;}}
livingroomLight.c(客廳燈)
#include "controlDevice.h"int livingroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);//設置引腳為輸出模式digitalWrite(pinNum,HIGH);}int livingroomLightOpen(int pinNum)
{digitalWrite(pinNum,LOW);
}int livingroomLightClose(int pinNum)
{digitalWrite(pinNum,HIGH);}int livingroomLightChangeStatus()
{//暫時不用,后面用著在完善}struct Devices livingroomLight = {.deviceName = "livingroomLight",.pinNum = 29,.deviceInit = livingroomLightInit,.open = livingroomLightOpen,.close = livingroomLightClose,.changeStatus = livingroomLightChangeStatus,};struct Devices *addLivingroomLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &livingroomLight;}else{livingroomLight.next=phead;phead = &livingroomLight;return phead;}}
restaurantLight.c(餐廳燈)
#include "controlDevice.h"int restaurantLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);//設置引腳為輸出模式digitalWrite(pinNum,HIGH);}int restaurantLightOpen(int pinNum)
{digitalWrite(pinNum,LOW);
}int restaurantLightClose(int pinNum)
{digitalWrite(pinNum,HIGH);}int restaurantLightChangeStatus()
{//暫時不用,后面用著在完善}struct Devices restaurantLight = {.deviceName = "restaurantLight",.pinNum = 28,.deviceInit = restaurantLightInit,.open = restaurantLightOpen,.close = restaurantLightClose,.changeStatus = restaurantLightChangeStatus,};struct Devices *addRestaurantLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &restaurantLight;}else{restaurantLight.next=phead;phead = &restaurantLight;return phead;}}
beedroomLight(臥室燈)
#include "controlDevice.h"int bedroomLightInit(int pinNum)
{pinMode(pinNum,OUTPUT);//設置引腳為輸出模式digitalWrite(pinNum,HIGH);}int bedroomLightOpen(int pinNum)
{digitalWrite(pinNum,LOW);
}int bedroomLightClose(int pinNum)
{digitalWrite(pinNum,HIGH);}int bedroomLightChangeStatus()
{//暫時不用,后面用著在完善}struct Devices bedroomLight = {.deviceName = "bedroomLight",.pinNum = 27,.deviceInit = bedroomLightInit,.open = bedroomLightOpen,.close = bedroomLightClose,.changeStatus = bedroomLightChangeStatus,};struct Devices *addbedroomLightToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &bedroomLight;}else{bedroomLight.next=phead;phead = &bedroomLight;return phead;}}
fire.c(火災檢測)
#include "controlDevice.h"int fireInit(int pinNum)
{pinMode(pinNum,INPUT);//設置引腳為輸出模式}int fireStatusRead(int pinNum)
{return digitalRead(pinNum);}int fireChangeStatus()
{//暫時不用,后面用著在完善}struct Devices fire = {.deviceName = "fire",.pinNum = 25,.deviceInit = fireInit,.readStatus = fireStatusRead,.changeStatus = fireChangeStatus,};struct Devices *addFireToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &fire;}else{fire.next=phead;phead = &fire;return phead;}}
beep.c(和火災檢測配合實現火災報警的蜂鳴器)
#include "controlDevice.h"int beepInit(int pinNum)
{pinMode(pinNum,OUTPUT);//設置引腳為輸出模式digitalWrite(pinNum,HIGH);}int beepOpen(int pinNum)
{digitalWrite(pinNum,LOW);}int beepClose(int pinNum)
{digitalWrite(pinNum,HIGH);}int beepChangeStatus()
{//暫時不用,后面用著在完善}struct Devices beep = {.deviceName = "beep",.pinNum = 24,.deviceInit = beepInit,.open = beepOpen,.close = beepClose,.changeStatus = beepChangeStatus,};struct Devices *addBeepToDeviceLink(struct Devices *phead)
{if(phead == NULL){return &beep;}else{beep.next=phead;phead = &beep;return phead;}}