diff --git a/lift_server.c b/lift_server.c deleted file mode 100644 index 94e976f219a60502333b1cd97f63804e32505ca5..0000000000000000000000000000000000000000 --- a/lift_server.c +++ /dev/null @@ -1,410 +0,0 @@ -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <time.h> -#include <pthread.h> -#include <arpa/inet.h> -#include <sys/socket.h> - -#define BUFFER_MAX 3 -#define DIRECTION_MAX 45 - -#define IN 0 -#define OUT 1 -#define PWM 0 - -#define LOW 0 -#define HIGH 1 -#define VALUE_MAX 256 - -#define POUT 23 -#define PIN 24 - -#define PINM 17 -#define PINP 26 //Press sensor's GPIO PIN number - -int mot_person = 0; -int pre_person = 0; -double distance = 0; -int personCheck[3] = {0,0,0}; -pthread_t thread1, thread2, thread3, thread4; - -//소켓연결 -int serv_sock, clnt_sock = -1; -struct sockaddr_in serv_addr, clnt_addr; -socklen_t clnt_addr_size; -char msg[2]; - -void error_handling(char *message){ - fputs(message, stderr); - fputc('\n',stderr); - exit(1); -} - -static int GPIOExport(int pin){ -#define BUFFER_MAX 3 - char buffer[BUFFER_MAX]; - ssize_t bytes_written; - int fd; - - fd = open("/sys/class/gpio/export", O_WRONLY); //경로를 열어서 - if(-1 == fd){ - fprintf(stderr, "Failed to open export for writing!\n"); - return(-1); - }// 잘 못 열면(경로가 잘못됐거나 값이 없거나 .. etc) => 오류 msg 출력 - - bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); //파라미터로 입력받은 pin 넘버 buffer에 넘겨서 bytes_written 변수에 저장 - write(fd, buffer, bytes_written); //fd에 buffer값 넣어서 fd(/sys/class/gpio/export/)에 write => 결과 : /sys/class/gpio/gpio(PIN_number)가 생성됨 - close(fd); - return(0); -} // 해당 함수는 /sys/class/gpio/export에 GPIO Pin Number을 Write하는 함수입니다 - - -static int GPIOUnexport(int pin){ - char buffer[BUFFER_MAX]; - ssize_t bytes_written; - int fd; - - fd = open("/sys/class/gpio/unexport", O_WRONLY); - if(-1 == fd){ - fprintf(stderr, "Failed to open unexport for writing!\n"); - return(-1); - } - bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); - write(fd, buffer, bytes_written); - close(fd); - return(0); -}// 해당 함수는 /sys/class/gpio/unexport에 GPIO Pin Number을 Write하는 함수입니다. //logic은 GPIOexport함수와 같습니다. - -static int GPIODirection(int pin, int dir){ - static const char s_directions_str[] = "in\0out"; - - //char path[DIRECTION_MAX] = "/sys/class/gpio/gpio24/direction"; - char path[DIRECTION_MAX] = "/sys/class/gpio/gpio%d/direction"; //경로 지정 - int fd; - snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin); // %d에 pin 넘버 넘겨받음 - fd = open(path, O_WRONLY); - if(-1 == fd){ - fprintf(stderr, "Failed to open gpio direction for writing!\n"); - return(-1); - } - if(-1 == write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3)){ // fd에 IN 또는 OUT 값 입력 - fprintf(stderr, "Failed to set direction!\n"); - close(fd); - return(-1); - } - close(fd); - return(0); -}// 해당 함수는 /sys/class/gpio/gpio(pin번호)/direction에 OUT인지, IN인지 write하는 함수 - -static int GPIORead(int pin){ - char path[VALUE_MAX]; - char value_str[3]; - int fd; - - snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin); - fd = open(path, O_RDONLY); - if(-1 == fd){ - fprintf(stderr, "Failed to open gpio value for reading!\n"); - return(-1); - } - if(-1 == read(fd, value_str, 3)){ - fprintf(stderr, "Failed to read value!\n"); - close(fd); - return(-1); - } - close(fd); - return(atoi(value_str)); -}// 해당 함수는 /sys/class/gpio/gpio(pin번호)/direction에 OUT인지, IN인지 write하는 함수 - -static int GPIOWrite(int pin, int value){ - static const char s_values_str[] = "01";//0또는 1로 입력받음 - - char path[VALUE_MAX]; - int fd; - snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin); //pin 번호를 입력받아서 path에 저장 - fd = open(path, O_WRONLY); //fd에 입력받은 path값을 이용해 파일 엶. - if(-1 == fd){ - fprintf(stderr, "Failed to open gpio value for writing!\n"); // 접근 오류 -> 메세지 출력 - return(-1); - } - if(1 != write(fd, &s_values_str[LOW == value ? 0 : 1], 1)){ //0또는 1 값 입력, 그런데 만약 실패하면 오류메세지 출력 - fprintf(stderr, "Failed to write value!\n"); - close(fd); - return(-1); - } - close(fd); - return(0); -}// 해당 함수는 /sys/class/gpio/gpio(pin번호)/value에 (0또는 1) 값을 쓰는 함수) //ex. value/0 => led가 켜짐 - - -void* motion() { - - int repeat = 1000; - /*clock_t start_t, end_t; - clock_t n_per_st, n_per_en; - int cnt=0; - double time;*/ - int flag_detect=0; - - if(-1 == GPIOExport(PINM)){ - printf("gpio export err\n"); - } - - usleep(100000); - - if(-1 == GPIODirection(PINM, IN)){ - printf("gpio direction err\n"); - exit(2); - } - - //GPIOWrite(PINM, 0); - usleep(10000); - - do{ - - /*if(-1 == GPIOWrite(PINM,1)){ - printf("gpio write/trigger erro\n"); - exit(3); - } - usleep(100);*/ - /*GPIOWrite(PINM,0);*/ - printf("GPIORead's number : %d\n", GPIORead(PINM)); - if(GPIORead(PINM)==0){ - flag_detect++; - printf("flag_detection: %d\n", flag_detect); - if(flag_detect==10){ - printf("Don't exist person!\n"); - mot_person=0; - personCheck[0]=mot_person; - printf("personCheck[0]=%d!\n", personCheck[0]); - } - }else{ - flag_detect=0; - printf("!!Exist person!\n"); - mot_person=1; - personCheck[0]=mot_person; - printf("personCheck[0]=%d!\n", personCheck[0]); - } - - usleep(2000000); - } - while(repeat--); - - if(-1 == GPIOUnexport(PINM)) - exit(4); - - printf("complete\n"); - exit(0); - -} - -void* microwave() { - - int repeat = 100; - clock_t start_t, end_t; - double wave_time; - int cnt; - int wav_person; - - if(-1 == GPIOExport(POUT) || -1 == GPIOExport(PIN)){ - printf("gpio export err\n"); - } - - usleep(10000); //10000 -> 1000 - - if(-1 == GPIODirection(POUT, OUT) || -1 == GPIODirection(PIN, IN)){ - printf("gpio direction err\n"); - exit(2); - } - - GPIOWrite(POUT, 0); - usleep(1000); - - do{ - if(-1 == GPIOWrite(POUT,1)){ - printf("gpio write/trigger erro\n"); - exit(3); - } - usleep(10); - GPIOWrite(POUT,0); - - while(GPIORead(PIN)==0){ - start_t = clock(); - } - while(GPIORead(PIN)==1){ - end_t = clock(); - } - wave_time = (double)(end_t-start_t)/CLOCKS_PER_SEC; - double speedOfSound = 34000.0; // cm/s - double distanceInCm = (wave_time * speedOfSound) /2; - //double distanceInMm = distanceInCm * 10; - printf("time : %.4lf\n", wave_time); - printf("distance : %.4lfcm\n", distanceInCm); - //printf("distance : %.4lfmm\n", distanceInMm); - - if(distanceInCm <= 10){ - cnt++; - printf("cnt:%d\n",cnt); - if(cnt==10){ - printf("person exists\n"); - wav_person=1; //person exists - personCheck[1]=wav_person; - printf("personCheck[1]=%d!\n", personCheck[1]); - } - - }else{ - cnt=0; - printf("person not exists!\n"); - wav_person=0; - personCheck[1]=wav_person; - printf("personCheck[1]=%d!\n", personCheck[1]); - - } - - usleep(2000000); //2000000 -> 2000 - } - while(repeat--); - - if(-1 == GPIOUnexport(POUT)||-1==GPIOUnexport(PIN)) - exit(4); - - printf("complete\n"); - exit(0); - -} - -void* press() -{ - int repeat = 1000; - - if(-1 == GPIOExport(PINP)){ - printf("gpio export err\n"); - } - - usleep(100000); - - if(-1 == GPIODirection(PINP, IN)){ - printf("gpio direction err\n"); - exit(2); - } - - //GPIOWrite(PIN, 0); - usleep(10000); - - do{ - - /*if(-1 == GPIOWrite(PIN,1)){ - printf("gpio write/trigger erro\n"); - return(3); - } - usleep(100);*/ - /*GPIOWrite(PIN,0);*/ - if(GPIORead(PINP)==0){ - printf("Pressure is not Detected!\n"); - pre_person=0; - personCheck[2]=pre_person; - printf("personCheck[2]=%d!\n", personCheck[2]); - - }else{ - printf("Presure is detected!\n"); - pre_person=1; - personCheck[2]=pre_person; - printf("personCheck[2]=%d!\n", personCheck[2]); - - } - - usleep(2000000); // - } - while(repeat--); - - if(-1 == GPIOUnexport(PINP)) - exit(4); - - printf("complete\n"); - exit(0); -} - -void* superviser(void * arg) -{ - - - while(1) { - sleep(1); - // for ( int i = 0; i < 3; i++ ) { - // printf("personCheck[%d] = %d\n",i, personCheck[i]); - // } - - int existValue = 0; - int count = 0; - for ( int a = 0; a < 3; a++ ) { - if ( personCheck[a] == 1 ) { - count++; - } - } - - if ( count >=2 ) { - existValue = 1; - } - - if ( existValue == 1 ) { - printf("supervisor detect exists\n"); - snprintf(msg, 2, "%d", existValue); - write(clnt_sock, msg, sizeof(msg)); - printf("msg = %s\n", msg); - }else{ - existValue = 0; - printf("supervisor detect person not exists!\n"); - snprintf(msg, 2, "%d", existValue); - write(clnt_sock, msg, sizeof(msg)); - printf("msg = %s\n", msg); - } - - } -} - - -int main(int argc, char *argv[]) { - pthread_create(&thread1, NULL, motion, NULL); - pthread_create(&thread2, NULL, microwave, NULL); - pthread_create(&thread3, NULL, press, NULL); - pthread_create(&thread4, NULL, superviser, NULL); - - - printf("success"); - if(argc!=2){ - printf("Usage: %s <port>\n", argv[0]); - } - - serv_sock = socket(PF_INET, SOCK_STREAM,0); - if(serv_sock == -1){ - error_handling("socket() error"); - } - memset(&serv_addr, 0, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); - serv_addr.sin_port=htons(atoi(argv[1])); - - if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))== -1){ - error_handling("bind() error"); - } - - if(listen(serv_sock, 5) == -1) error_handling("listen() error"); - if(clnt_sock < 0){ - clnt_addr_size = sizeof(clnt_addr); - clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); - if(clnt_sock == -1) error_handling("accept() error"); - } - - - - pthread_join(thread1, NULL); - pthread_join(thread2, NULL); - pthread_join(thread3, NULL); - pthread_join(thread4, NULL); - -}