#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#define DEV "/dev/2440led"
#define LED_1_OFF 0x00
#define LED_2_OFF 0x10
#define LED_3_OFF 0x20
#define LED_4_OFF 0x30
#define LED_1_ON 0x01
#define LED_2_ON 0x11
#define LED_3_ON 0x21
#define LED_4_ON 0x31
#define LED_FLASH_TIME 100000 //100ms
void led_open(int fd,int id);
void led_close(int fd,int id);
int id,fd;
sem_t sem;
void thread1(void *arg)
{
while(1)
{
sem_wait(&sem);
printf("\n\n================欢迎来到手动模式界面================\n\n");
printf("1.生活模式\n");
printf("2.聚会模式\n");
printf("3.节日模式\n");
printf("4.娱乐模式\n");
printf("\n\n================欢迎来到自动模式界面================\n\n");
printf("5.省电模式\n");
printf("6.睡觉模式\n");
printf("7.工作模式\n");
printf("8.退出模式\n");
printf("\n\nplease slect:");
scanf("%d",&id);
if(id>=8)
break;
sem_post(&sem);
}
}
void thread2(void *arg)
{
while(1)
{
sem_wait(&sem);
if(id==1)
{
printf("\n\n================欢迎来到生活模式界面================\n\n");
printf("\n\n================祝你生活愉快!================\n\n");
led_open(fd,2);
led_open(fd,3);
led_open(fd,1);
led_open(fd,4);
}
if(id==2)
{
printf("\n\n================欢迎来到聚会模式界面================\n\n");
printf("\n\n================祝大家聚会快乐!================\n\n");
while(1)
{
led_open(fd,1);
led_open(fd,2);
led_open(fd,3);
led_open(fd,4);
sleep(1);
led_close(fd,1);
led_close(fd,2);
led_close(fd,3);
led_close(fd,4);
sleep(1);
}
}
if(id==3)
{
printf("\n\n================欢迎来到节日模式界面================\n\n");
printf("\n\n================祝你及你的家人团团圆圆!================\n\n");
while(1)
{
led_open(fd,1);
led_open(fd,3);
sleep(1);
led_open(fd,2);
led_open(fd,4);
led_close(fd,1);
led_close(fd,3);
sleep(1);
led_close(fd,2);
led_close(fd,4);
sleep(2);
}
}
if(id==4)
{
printf("\n\n================欢迎来到娱乐模式界面================\n\n");
printf("\n\n================难得今天歇息,好好玩吧!================\n\n");
while(1)
{
led_open(fd,4);
led_open(fd,1);
sleep(2);
led_open(fd,2);
led_open(fd,3);
led_close(fd,1);
led_close(fd,3);
sleep(1);
led_close(fd,2);
led_close(fd,4);
sleep(1);
led_open(fd,1);
led_open(fd,4);
led_open(fd,2);
led_open(fd,3);
sleep(3);
led_close(fd,3);
led_close(fd,4);
sleep(4);
}
}
if(id==5)
{
led_open(fd,1);
led_open(fd,4);
led_close(fd,2);
led_close(fd,3);
}
if(id==6)
{
led_close(fd,4);
led_open(fd,1);
led_open(fd,2);
led_open(fd,3);
sleep(2);
led_close(fd,1);
sleep(5);
led_close(fd,2);
sleep(10);
led_close(fd,3);
}
if(id==7)
{
led_close(fd,4);
led_close(fd,1);
led_open(fd,2);
led_open(fd,3);
sleep(10);
led_close(fd,3);
sleep(2);
led_close(fd,2);
}
sem_post(&sem);
close(fd);
}
}
int main(void)
{
pthread_t id1,id2;
int fd,ret;
ret=sem_init(&sem,0,1);
if(ret!=0)
{
perror("sem_init");
}
if((fd=open(DEV,O_RDWR))<0)
printf("open led error\n");
ret=pthread_create(&id1,NULL,(void *)thread1,(void *)id);
if(ret!=0)
{
printf("Create pthread error!\n");
exit(1);
}
ret=pthread_create(&id2,NULL,(void *)thread2,(void *)id);
if(ret!=0)
{
printf("Create pthread error!\n");
exit(1);
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
exit(0);
}
void led_close(int fd,int id)
{
int led;
switch(id)
{
case 1:
led=LED_1_OFF;
break;
case 2:
led=LED_2_OFF;
break;
case 3:
led=LED_3_OFF;
break;
case 4:
led=LED_4_OFF;
break;
default:
led=0xff;
break;
}
write(fd,&led,1);
}
void led_open(int fd,int id)
{
int led;
switch(id)
{
case 1:
led=LED_1_ON;
break;
case 2:
led=LED_2_ON;
break;
case 3:
led=LED_3_ON;
break;
case 4:
led=LED_4_ON;
break;
default:
led=0xff;
break;
}
write(fd,&led,1);
}