#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> #include <wiringPi.h> #include <wiringPiI2C.h> #define BUFFER_MAX 3 #define DIRECTION_MAX 45 #define IN 0 #define OUT 1 #define LOW 0 #define HIGH 1 #define VALUE_MAX 256 #define PIN 24 #define POUT 23 #define PIN2 27 #define POUT2 17 #define B_PIN 20 // 버튼 1 #define B_PIN2 21 // 버튼 2 #define I_PIN 26 // 적외선 센서 #define LCDAddr 0x27 double distance[2] = {0,}; char msg[10]; int fd; 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 unexport for writing! \n"); return(-1); } bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin); write(fd, buffer, bytes_written); close(fd); return(0); } static int GPIODirection(int pin, int dir){ static const char s_directions_str[] = "in\0out"; 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 gpio direction 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"); return(-1); } 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!\n"); 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"); return(-1); close(fd); return(0); } } int BLEN=1; void write_word(int data){ int temp = data; if ( BLEN == 1 ) temp |= 0x08; else temp &= 0xF7; wiringPiI2CWrite(fd, temp); } void send_command(int comm){ int buf; // Send bit7-4 firstly buf = comm & 0xF0; buf |= 0x04; // RS = 0, RW = 0, EN = 1 write_word(buf); delay(2); buf &= 0xFB; // Make EN = 0 write_word(buf); // Send bit3-0 secondly buf = (comm & 0x0F) << 4; buf |= 0x04; // RS = 0, RW = 0, EN = 1 write_word(buf); delay(2); buf &= 0xFB; // Make EN = 0 write_word(buf); } void send_data(int data){ int buf; // Send bit7-4 firstly buf = data & 0xF0; buf |= 0x05; // RS = 1, RW = 0, EN = 1 write_word(buf); delay(2); buf &= 0xFB; // Make EN = 0 write_word(buf); // Send bit3-0 secondly buf = (data & 0x0F) << 4; buf |= 0x05; // RS = 1, RW = 0, EN = 1 write_word(buf); delay(2); buf &= 0xFB; // Make EN = 0 write_word(buf); } void init(){ send_command(0x33); // Must initialize to 8-line mode at first delay(5); send_command(0x32); // Then initialize to 4-line mode delay(5); send_command(0x28); // 2 Lines & 5*7 dots delay(5); send_command(0x0C); // Enable display without cursor delay(5); send_command(0x01); // Clear Screen wiringPiI2CWrite(fd, 0x08); } void clear(){ send_command(0x01); //clear Screen } void write_l(int x, int y, char data[]){ int addr, i; int tmp; if (x < 0) x = 0; if (x > 15) x = 15; if (y < 0) y = 0; if (y > 1) y = 1; // Move cursor addr = 0x80 + 0x40 * y + x; send_command(addr); tmp = strlen(data); for (i = 0; i < tmp; i++){ send_data(data[i]); } } void *lcd_thd(){ char s[10]; fd = wiringPiI2CSetup(LCDAddr); init(); write_l(0, 0, "Don't worry!"); write_l(1, 1, "CCTV is on."); delay(15000); clear(); pthread_exit(0); } void *infraRed_thd(){ if(-1 == GPIODirection(I_PIN,IN)) pthread_exit(0); while(1){ // snprintf(msg,4,"%d %d",GPIORead(I_PIN)==1?3:0,GPIORead(I_PIN)==1?3:0); if(GPIORead(I_PIN) == 1){ int thr_id; int status; pthread_t p_thread; thr_id = pthread_create(&p_thread,NULL,lcd_thd,NULL); pthread_join(p_thread, (void**)&status); system("raspivid -t 20000 -o vidio.h264"); } usleep(1000*1000); } pthread_exit(0); } void *button_thd(void* arg){ int clnt_sock =(int)arg; char buf[BUFFER_MAX]; if(-1 == GPIODirection(B_PIN,IN)) pthread_exit(0); while(1){ snprintf(msg,4,"%d",GPIORead(B_PIN)); write(clnt_sock,msg,sizeof(msg)); printf("msg = %s\n",msg); usleep(1000*1000); } close(clnt_sock); pthread_exit(0); } void error_handling(char *message){ fputs(message,stderr); fputc('\n',stderr); exit(1); } int main(int argc, char *argv[]) { char* buffer; int size; int count; int sock; int serv_sock,clnt_sock=-1; int status; struct sockaddr_in serv_addr,clnt_addr; socklen_t clnt_addr_size; pthread_t t_id; pthread_t b_id; int thr_id; if (-1 == GPIOExport(B_PIN) || -1 == GPIOExport(B_PIN2) || GPIOExport(I_PIN)) return(1); if (-1 == GPIOExport(POUT) || -1 == GPIOExport(PIN)) return(1); if (-1 == GPIOExport(POUT2) || -1 == GPIOExport(PIN2)) return(1); //클라이언트 소켓 세팅 sock = socket(PF_INET, SOCK_STREAM, 0); if(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(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) error_handling("connect() error"); pthread_create(&t_id,NULL,infraRed_thd,NULL); pthread_create(&b_id,NULL,button_thd,(void*)sock); pthread_join(b_id, (void **)status); pthread_join(t_id, (void **)&status); if(-1 == GPIOUnexport(POUT) || GPIOUnexport(PIN) || GPIOUnexport(B_PIN) || GPIOUnexport(I_PIN)) return 4; if(-1 == GPIOUnexport(POUT2) || GPIOUnexport(PIN2) || GPIOUnexport(B_PIN2)) return 4; // 전송 완료 후 소켓 종료 close(sock); printf("파일 전송 완료\n"); return 0; }