contrlDevices.h
#include <wiringPi.h>
#include <stdlib.h>
struct Devices
{
char deviceName[128];
int status;
int pinNum;
int (*open)(int pinNum);
int (*close)(int pinNum);
int (*deviceInit)(int pinNum);
int (*readStatus)();
int (*changeStatus)(int status);
struct Devices *next;
};
struct Devices *addBathroomLightToLink(struct Devices *phead);
struct Devices *addupstairLightToLink(struct Devices *phead);
struct Devices *addrestaurantLightToLink(struct Devices *phead);
struct Devices *addlivingroomLightToLink(struct Devices *phead);
struct Devices *addfireToLink(struct Devices *phead);
int bathroomLightInit(int pinNum);
int livingroomLightInit(int pinNum);
int restaurantLightInit(int pinNum);
int upstairLightInit(int pinNum);
livingroomLight.c
#include "contrlDevices.h"
int livingroomLightOpen(int pinNum)
{
digitalWrite(pinNum,LOW);
}
int livingroomLightClose(int pinNum)
{
digitalWrite(pinNum,HIGH);
}
int livingroomLightInit(int pinNum)
{
pinMode(pinNum,OUTPUT);
digitalWrite(pinNum,HIGH);
}
int livingroomLightStatus()
{
}
struct Devices livingroomLight = {
.deviceName = "livingroomLight",
.pinNum = 24,
.open = livingroomLightOpen,
.close = livingroomLightClose,
.deviceInit = livingroomLightInit,
.changeStatus = livingroomLightStatus
};
struct Devices *addlivingroomLightToLink(struct Devices *phead)
{
if(phead == NULL)
{
return &livingroomLight;
}else
{
livingroomLight.next = phead;
phead = &livingroomLight;
return phead;
}
}
mainpro.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "contrlDevices.h"
struct Devices *findDeviceByName(char *name,struct Devices *pdeviceHead)
{
struct Devices *tmp = pdeviceHead;
if(tmp == NULL)
{
return NULL;
}else
{
while(tmp != NULL)
{
if(strcmp(name,tmp->deviceName) == 0)
{
return tmp;
}
tmp = tmp->next;
}
}
}
int main()
{
char name[128] = {'\0'};
if(-1 == wiringPiSetup())
{
return -1;
}
struct Devices *pdeviceHead = NULL;
pdeviceHead = addBathroomLightToLink(pdeviceHead);
pdeviceHead = addupstairLightToLink(pdeviceHead);
pdeviceHead = addrestaurantLightToLink(pdeviceHead);
pdeviceHead = addlivingroomLightToLink(pdeviceHead);
pdeviceHead = addfireToLink(pdeviceHead);
bathroomLightInit(22);
livingroomLightInit(24);
restaurantLightInit(23);
upstairLightInit(21);
while(1)
{
printf("please input which light you wanna to open\n");
scanf("%s",name);
struct Devices *tmp = findDeviceByName(name,pdeviceHead);
if(tmp == NULL)
{
printf("not found\n");
}else
{
tmp->deviceInit(tmp->pinNum);
tmp->open(tmp->pinNum);
}
}
return 0;
}
fire.c
#include "contrlDevices.h"
int fireInit(int pinNum)
{
pinMode(pinNum,INPUT);
digitalWrite(pinNum,HIGH);
}
int fireStatus(int pinNum)
{
return digitalRead(pinNum);
}
struct Devices fire = {
.deviceName = "fire",
.pinNum = 25,
.deviceInit = fireInit,
.changeStatus = fireStatus
};
struct Devices *addfireToLink(struct Devices *phead)
{
if(phead == NULL)
{
return &fire;
}else
{
fire.next = phead;
phead = &fire;
return phead;
}
}