diff --git a/Rarp2.cpp b/Rarp2.cpp new file mode 100644 index 0000000000000000000000000000000000000000..001022d3e23c82a7dd99c087283adaac1e2f30f6 --- /dev/null +++ b/Rarp2.cpp @@ -0,0 +1,554 @@ +/* + * See documentation at https://nRF24.github.io/RF24 + * See License information at root directory of this library + * Author: Brendan Doherty (2bndy5) + */ + +/** + * A simple example of sending data from 1 nRF24L01 transceiver to another. + * + * This example was written to be used on 2 devices acting as "nodes". + * Use `ctrl+c` to quit at any time. + */ +#include <ctime> // time() +#include <iostream> // cin, cout, endl +#include <string> // string, getline() +#include <time.h> // CLOCK_MONOTONIC_RAW, timespec, clock_gettime() +#include <RF24/RF24.h> // RF24, RF24_PA_LOW, delay() + +#include<stdio.h> +#include<stdlib.h> +#include<arpa/inet.h> +#include<sys/socket.h> +#include<unistd.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> + + +#define IN 0 +#define OUT 1 +#define LOW 0 +#define HIGH 1 +#define VALUE_MAX 40 +#define BUFFER_MAX 3 +#define DIRECTION_MAX_P 45 +#define VALUE_MAX_P 256 + +#define PIN 20 +#define POUT2 21 +#define POUT1 18 +#define PWM 0 + +// 서보모터의 최소 각도와 최대 각도 +#define MIN_ANGLE 500000 +#define MAX_ANGLE 2500000 + +using namespace std; + +/****************** Linux ***********************/ +// Radio CE Pin, CSN Pin, SPI Speed +// CE Pin uses GPIO number with BCM and SPIDEV drivers, other platforms use their own pin numbering +// CS Pin addresses the SPI bus number at /dev/spidev<a>.<b> +// ie: RF24 radio(<ce_pin>, <a>*10+<b>); spidev1.0 is 10, spidev1.1 is 11 etc.. +#define CSN_PIN 0 +#ifdef MRAA + #define CE_PIN 15 // GPIO22 +#else + #define CE_PIN 22 +#endif +// Generic: +RF24 radio(17, CSN_PIN); +/****************** Linux (BBB,x86,etc) ***********************/ +// See http://nRF24.github.io/RF24/pages.html for more information on usage +// See http://iotdk.intel.com/docs/master/mraa/ for more information on MRAA +// See https://www.kernel.org/doc/Documentation/spi/spidev for more information on SPIDEV + +// For this example, we'll be using a payload containing +// a single float number that will be incremented +// on every successful transmission +float payload = 0; + +void setRole(); // prototype to set the node's role +void master(); // prototype of the TX node's behavior +void slave(); // prototype of the RX node's behavior + +// custom defined timer for evaluating transmission time in microseconds +struct timespec startTimer, endTimer; +uint32_t getMicros(); // prototype to get elapsed time in microseconds + + +static int PWMExport(int pwmnum) +{ + char buffer[BUFFER_MAX]; + int bytes_written; + int fd; + + fd = open("/sys/class/pwm/pwmchip0/unexport", O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in unexport!\n"); + return(-1); + } + + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pwmnum); + write(fd, buffer, bytes_written); + close(fd); + + sleep(1); + fd = open("/sys/class/pwm/pwmchip0/export", O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in export!\n"); + return(-1); + } + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pwmnum); + write(fd, buffer, bytes_written); + close(fd); + sleep(1); + return(0); +} +static int +PWMUnexport(int pwmnum) { + char buffer[BUFFER_MAX]; + ssize_t bytes_written; + int fd; + fd = open("/sys/class/pwm/pwmchip0/unexport", O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in unexport!\n"); + return(-1); + } + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pwmnum); + write(fd, buffer, bytes_written); + close(fd); + + sleep(1); + return(0); +} + +static int +PWMEnable(int pwmnum) { + static const char s_unenable_str[] = "0"; + static const char s_enable_str[] = "1"; + + char path[DIRECTION_MAX_P]; + int fd; + snprintf(path, DIRECTION_MAX_P, "/sys/class/pwm/pwmchip0/pwm%d/enable", pwmnum); + fd = open(path, O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in enable!\n"); + return -1; + } + write(fd, s_unenable_str, strlen(s_unenable_str)); + close(fd); + + fd = open(path, O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in enable!\n"); + return -1; + } + + write(fd, s_enable_str, strlen(s_enable_str)); + close(fd); + return(0); + +} + +static int +PWMUnable(int pwmnum) +{ + static const char s_unable_str[] = "0"; + char path[DIRECTION_MAX_P]; + int fd; + + snprintf(path, DIRECTION_MAX_P, "/sys/class/pwm/pwmchip0/pwm%d/enable", pwmnum); + fd = open(path, O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in enable!\n"); + return -1; + } + + write(fd, s_unable_str, strlen(s_unable_str)); + close(fd); + + return(0); + +} + +static int +PWMWritePeriod(int pwmnum, int value) +{ + char s_values_str[VALUE_MAX_P]; + char path[VALUE_MAX_P]; + int fd, byte; + + snprintf(path, VALUE_MAX_P, "/sys/class/pwm/pwmchip0/pwm%d/period", pwmnum); + fd = open(path, O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in period!\n"); + return(-1); + } + + byte = snprintf(s_values_str, 10, "%d", value); + + if (-1 == write(fd, s_values_str, byte)) { + fprintf(stderr, "Failed to write value in period!\n"); + close(fd); + return(-1); + } + + close(fd); + return(0); +} + +static int +PWMWriteDutyCycle(int pwmnum, int value) +{ + char path[VALUE_MAX_P]; + char s_values_str[VALUE_MAX_P]; + int fd, byte; + + snprintf(path, VALUE_MAX_P, "/sys/class/pwm/pwmchip0/pwm%d/duty_cycle", pwmnum); + fd = open(path, O_WRONLY); + if (-1 == fd) { + fprintf(stderr, "Failed to open in duty_cycle!\n"); + return(-1); + } + + byte = snprintf(s_values_str, 10, "%d", value); + + if (-1 == write(fd, s_values_str, byte)) { + fprintf(stderr, "Failed to write value! in duty_cycle\n"); + close(fd); + return(-1); + } + + close(fd); + return(0); +} + + +static int GPIOExport(int pin) { + 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); + } + + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); + write(fd, buffer, bytes_written); + close(fd); + return(0); +} + +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 export for writing!\n"); + return(-1); + } + + bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); + write(fd, buffer, bytes_written); + close(fd); + return(0); +} + +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! [ Pin Number : %d]\n", pin); + close(fd); + return(-1); + } + + close(fd); + return(atoi(value_str)); +} + +static int GPIOWrite(int pin, int value) { + static const char s_values_str[] = "01"; + + char path[VALUE_MAX]; + int fd; + + snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin); + fd = open(path, O_WRONLY); + 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)) { + fprintf(stderr, "Failed to write value!\n"); + close(fd); + return(-1); + } + + close(fd); + return(0); +} + +static int GPIODirection(int pin, int dir) { + static const char s_directions_str[] = "in\0out"; + + #define DIRECTION_MAX 35 + char path[DIRECTION_MAX] = "/sys/class/gpio/gpio%d/direction"; + int fd; + + snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin); + + fd = open(path,O_WRONLY); + if(-1 == fd) { + fprintf(stderr, "Failed to open export for writing!\n"); + return(-1); + } + + if(-1 == write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3)){ + fprintf(stderr, "Failed to set direction!!\n"); + close(fd); + return(-1); + } + + close(fd); + return(0); +} + +void error_handling(char *message){ + fputs(message,stderr); + fputc('\n', stderr); + exit(1); +} + + + +int main(int argc, char** argv) +{ + int angle = 500000; + int direction = 1; // 1: 증가, -1: 감소 + int clnt_sock; + struct sockaddr_in serv_addr; + char msg[2]; + + char on[2]="1"; + int str_len; + int light = 0; + int repeat = 100000000; + // 이전 상태와 현재 상태를 추적하기 위한 변수 + int state = 1; + int prev_state = 1; + + + + // perform hardware check + if (!radio.begin()) { + cout << "radio hardware is not responding!!" << endl; + return 0; // quit now + } + + // to use different addresses on a pair of radios, we need a variable to + // uniquely identify which address this radio will use to transmit + bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit + + // print example's name + cout << argv[0] << endl; + + // Let these addresses be used for the pair + uint8_t address[2][6] = {"1Node", "LIFT1"}; + // It is very helpful to think of an address as a path instead of as + // an identifying device destination + + // Set the radioNumber via the terminal on startup + cout << "Which radio is this? Enter '0' or '1'. Defaults to '0' "; + string input; + getline(cin, input); + radioNumber = input.length() > 0 && (uint8_t)input[0] == 49; + + // save on transmission time by setting the radio to only transmit the + // number of bytes we need to transmit a float + radio.setPayloadSize(sizeof(payload)); // float datatype occupies 4 bytes + + // Set the PA Level low to try preventing power supply related problems + // because these examples are likely run with nodes in close proximity to + // each other. + radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default. + + // set the TX address of the RX node into the TX pipe + radio.openWritingPipe(address[radioNumber]); // always uses pipe 0 + + // set the RX address of the TX node into a RX pipe + radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1 + + // For debugging info + // radio.printDetails(); // (smaller) function that prints raw register values + // radio.printPrettyDetails(); // (larger) function that prints human readable data + + // ready to execute program now + if(argc!=3){ + printf("Usage : %s <IP> <port>\n",argv[0]); + exit(1); + } + clnt_sock = socket(PF_INET, SOCK_STREAM, 0); + if(clnt_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 = inet_addr(argv[1]); + serv_addr.sin_port = htons(atoi(argv[2])); + + if(connect(clnt_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) + error_handling("connect() error"); + + if(-1 == GPIOExport(POUT2) || -1 == GPIOExport(PIN)) + { + return(1); + } + + + if(-1 == GPIODirection(POUT2, OUT) || -1 == GPIODirection(PIN, IN)) + { + return(2); + } + + PWMExport(PWM); + PWMWritePeriod(PWM, 20000000); + PWMWriteDutyCycle(PWM, 0); + PWMEnable(PWM); + + + do { + if (-1 == GPIOWrite(POUT2, 1)) { + return 3; + } + + str_len = read(clnt_sock, msg, sizeof(msg)); + if(str_len == -1) + error_handling("read() error"); + + printf("Receive message from Server : %s\n",msg); + /*if(strncmp(on,msg,1)==0) + light = 1; + else + light = 0; + + GPIOWrite(POUT, light);*/ + int pinValue = GPIORead(PIN); + printf("GPIORead: %d from pin %d\n", pinValue, PIN); + printf("angle: %d\n", angle); + + // 상태 변화 감지 + if (pinValue != prev_state) { + state = pinValue; + + } + // 문자열을 정수로 변환 + float a = atoi(msg); + + if(a == 1){ + // GPIORead(PIN)의 값이 0일 때에만 서보모터 제어 + if (state == 0) { + PWMWriteDutyCycle(PWM, angle); + printf("angle: %d\n", angle); + angle += 50000*direction; // 각도 변경 방향에 따라 각도 증감 + usleep(100000); + // 최대 각도 또는 최소 각도에 도달하면 방향 변경 + if (angle >= MAX_ANGLE || angle <= MIN_ANGLE) { + direction *= -1; + usleep(5000000); + //c=최대각도 혹은 최소각도에 도달했을 때 잠깐 멈추기 + } + } + }else{ + PWMWriteDutyCycle(PWM, angle); + printf("angle: %d\n", angle); + + if (angle > MIN_ANGLE) { + printf("angle: %d\n", angle); + angle -= 50000*direction; //서보모터 각도 감소(사람 없다고 판단시 리프트 자동 내려감) + usleep(100000); + } + + } + prev_state = pinValue; + + radio.stopListening(); // put radio in TX mode + + + + unsigned int failure = 0; // keep track of failures + payload = a; + while (failure < 2) { + clock_gettime(CLOCK_MONOTONIC_RAW, &startTimer); // start the timer + bool report = radio.write(&payload, sizeof(float)); // transmit & save the report + uint32_t timerElapsed = getMicros(); // end the timer + + if (report) { + // payload was delivered + cout << "Transmission successful! Time to transmit = "; + cout << timerElapsed; // print the timer result + cout << " us. Sent: " << payload << endl; // print payload sent + } + else { + // payload was not delivered + cout << "Transmission failed or timed out" << endl; + + } + failure++; + + // to make this example readable in the terminal + delay(1000); // slow transmissions down by 1 second + } + cout << failure << " failures detected. Leaving TX role." << endl; + + + + }while(repeat--); + + + + if( -1 == GPIOUnexport(POUT2) || -1 == GPIOUnexport(PIN)) + { + return(4); + } + + close(clnt_sock); + //Disable GPIO pins + /*if (-1 == GPIOUnexport(POUT)) + return(4);*/ + + + return 0; +} + + +/** + * Calculate the elapsed time in microseconds + */ +uint32_t getMicros() +{ + // this function assumes that the timer was started using + // `clock_gettime(CLOCK_MONOTONIC_RAW, &startTimer);` + + clock_gettime(CLOCK_MONOTONIC_RAW, &endTimer); + uint32_t seconds = endTimer.tv_sec - startTimer.tv_sec; + uint32_t useconds = (endTimer.tv_nsec - startTimer.tv_nsec) / 1000; + + return ((seconds)*1000 + useconds) + 0.5; +} diff --git a/lift_server.c b/lift_server.c new file mode 100644 index 0000000000000000000000000000000000000000..94e976f219a60502333b1cd97f63804e32505ca5 --- /dev/null +++ b/lift_server.c @@ -0,0 +1,410 @@ +#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); + +}