/*
cc -o ocr05 ocr05.c -lwiringPi
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <string.h>
#include <signal.h>
#include <wiringPi.h>
// Define Button Pin
#define BUTTON
23 // rsp board pin:16
int semid;
//排他処理開始(ロック開始)
//自分よりも先にロックされていた場合にはロック解除されるまでスリープします
void lock(int semid){
struct sembuf sb[1];
sb[0].sem_num=0;
sb[0].sem_op=-1;
sb[0].sem_flg=0;
if(EOF==semop(semid,sb,1)){
printf("%s\n","lock ERR");
exit(1);
}
}
//排他処理終了(ロック解除)
void unlock(int semid){
struct sembuf sb[1];
sb[0].sem_num=0;
sb[0].sem_op=1;
sb[0].sem_flg=0;
if(EOF==semop(semid,sb,1)){
printf("%s\n","unlock
ERR");
exit(1);
}
}
//セマフォ値のセット
void SemSetValue(int semid, int semnum, int semval) {
union semun {
int
val; /* SETVAL の値 */
struct semid_ds
*buf; /* IPC_STAT, IPC_SET 用のバッファ */
unsigned short
*array; /* GETALL, SETALL 用の配列 */
} ctl_arg;
ctl_arg.val = semval;
if((semctl(semid,semnum,SETVAL,ctl_arg))==EOF){
printf("%s\n","semctl
ERR");
exit(1);
}
}
//割り込み処理
void signal0(void){
unlock(semid);
}
int main(int argc, char **argv) {
int val;
char on[40];
char off[40];
//セマフォを割り付けます
semid=semget(IPC_PRIVATE,1,0666);
if(semid==EOF){
printf("%s\n","semget
ERR");
exit(1);
}
//セマフォに初期値を書き込みます
SemSetValue(semid,0,0);
//リモコンコマンド
strcpy(on,"irsend SEND_ONCE OCR05 ON");
strcpy(off,"irsend SEND_ONCE OCR05
OFF");
if (wiringPiSetupGpio() == -1){
printf("wiringPiSetup init
error\n");
exit(1);
}
pinMode(BUTTON, OUTPUT);
//割り込みを設定します
wiringPiISR( BUTTON, INT_EDGE_BOTH,
signal0 );
while(1){
lock(semid); // Wait Unlock
val=digitalRead(BUTTON);
if (val == 0) system(off);
if (val == 1) system(on);
}
//セマフォの削除
if((semctl(semid,0,IPC_RMID,0))==EOF){
printf("%s\n","semctl ERR");
exit(1);
}
exit(0);
}
|