From 3d66d4d023af3dcd2e7cd36f233bf801518b4112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=86=8C=EC=A7=84?= <jjaren746@ajou.ac.kr> Date: Fri, 10 Jun 2022 11:53:04 +0000 Subject: [PATCH] Add new file --- RPi/project_chair_last.c | 467 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 467 insertions(+) create mode 100644 RPi/project_chair_last.c diff --git a/RPi/project_chair_last.c b/RPi/project_chair_last.c new file mode 100644 index 0000000..d81c152 --- /dev/null +++ b/RPi/project_chair_last.c @@ -0,0 +1,467 @@ +#include <sys/stat.h> +#include <sys/types.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <arpa/inet.h> +#include <sys/socket.h> + +#include <stdint.h> +#include <unistd.h> +#include <getopt.h> +#include <sys/ioctl.h> +#include <linux/types.h> +#include <linux/spi/spidev.h> + + +#define IN 0 +#define OUT 1 +#define LOW 0 +#define HIGH 1 +#define POUT 18 +#define POUT2 4 +#define S_POUT 20 +#define VALUE_MAX 30 + +#define ARRAY_SIZE(array) sizeof(array) / sizeof(array[0]) + +static const char *DEVICE = "/dev/spidev0.0"; +static uint8_t MODE = SPI_MODE_0; +static uint8_t BITS = 8; +static uint32_t CLOCK = 1000000; +static uint16_t DELAY = 5; + + +void error_handling( char *message){ + fputs(message,stderr); + fputc( '\n',stderr); + exit(1); +} + +static int +PWMExport(int pwmnum) +{ +#define BUFFER_MAX 3 + 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]; + 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); + return(0); +} + +static int +PWMEnable(int pwmnum) +{ + static const char s_unenable_str[] = "0"; + static const char s_enable_str[] = "1"; + +#define DIRECTION_MAX 45 + char path[DIRECTION_MAX]; + int fd; + + snprintf(path, DIRECTION_MAX, "/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 +PWMWritePeriod(int pwmnum, int value) +{ + char s_values_str[VALUE_MAX]; + char path[VALUE_MAX]; + int fd, byte; + + snprintf(path, VALUE_MAX, "/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]; + char s_values_str[VALUE_MAX]; + int fd, byte; + + snprintf(path, VALUE_MAX, "/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){ +#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); + } + + 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"); + close(fd); + 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"); + 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 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); +} + +// SGL/DIF = 0 , D2=D1=D0=0 +uint8_t control_bits_differential(uint8_t channel){ + return (channel & 7) << 4; +} + +// SGL/DIF = 1 , D2=D1=D0=0 +uint8_t control_bits(uint8_t channel){ + return 0x8 | control_bits_differential(channel); +} + + +int readadc(int fd, uint8_t channel) { + uint8_t tx[] = {1, control_bits(channel), 1}; + uint8_t rx[3]; + + struct spi_ioc_transfer tr = { + .tx_buf = (unsigned long)tx, + .rx_buf = (unsigned long)rx, + .len = ARRAY_SIZE(tx), + .delay_usecs = DELAY, + .speed_hz = CLOCK, + .bits_per_word = BITS, + }; + + if (ioctl(fd, SPI_IOC_MESSAGE(1), &tr) == 1){ + perror("IO Error"); + abort(); + } + + return((rx[1] << 8) & 0x300) | (rx[2] & 0xFF); +} + + +static int prepare(int fd){ + if (ioctl(fd, SPI_IOC_WR_MODE, &MODE) == -1) { + perror("Can't set MODE"); + return -1; + } + + if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &BITS) == -1){ + perror("Can't set number of BITS"); + return -1; + } + + if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &CLOCK) == -1){ + perror("Can't set write CLOCK"); + return -1; + } + + if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &CLOCK) == -1) { + perror("Can't set read CLOCK"); + return -1; + } + + return 0; +} + + +int main(int argc, char *argv[]) { + int sock; + struct sockaddr_in serv_addr; + char msg[2]; + char on[2]="1"; + int str_len; + int light; + + if(argc!=3){ + printf("Usage : %s <IP> <port>\n",argv[0]); + exit(1); + } + //Enable GPIO pins + if (-1 == GPIOExport(POUT)) + return(1); + //Set GPIO directions + if (-1 == GPIODirection(POUT, OUT)) + return(2); + + 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])); + + + + int fd = open(DEVICE, O_RDWR); + if (fd <= 0){ + printf("Device %s not found\n", DEVICE); + return -1; + } + + if (prepare(fd) == -1) { + return -1; + } + if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) + error_handling("connect() error"); + + int count = 0; //의자용 count + int cnt=0; // 스피커용 count + int number = 0; // 횟수 측정용 + + +while(1){ + str_len = read(sock, msg, sizeof(msg)); + + if(str_len == -1) + error_handling("read() error"); + + printf("%d Receive message from Server : %s\n",number,msg); + number++; + /////////// + int p_one = 0; + int p_two = 0; + + + if(strcmp("0",msg)==0){ + count=0; + GPIOWrite(POUT,0); + + cnt=0; + GPIOWrite(S_POUT,0); + } + else{ + + p_one = readadc(fd, 0); // 압력용 + p_two = readadc(fd, 1); + int s_one = readadc(fd, 0); //스피커용 + int s_two = readadc(fd, 1); + int k = 0; + + printf("1 : %d\n",p_one); + printf("2 : %d\n\n",p_two); + + // 의자 XOR + if(p_one>0) p_one=0; else p_one=1; + if(p_two>0) p_two=0; else p_two=1; + + if(p_one ^ p_two ==1){ + count++; + }else{ + count = 0; + } + + if(count >= 5){ + GPIOExport(POUT2); + GPIODirection(POUT2,1); + GPIOWrite(POUT,1); + GPIOWrite(POUT2,1); + }else if(count < 5){ + GPIOExport(POUT); + GPIODirection(POUT,1); + GPIOWrite(POUT,0); + } + + //부저 + if(s_one>0 && s_two>0){ + cnt++; + }else cnt=0; + + if(cnt=7){ + PWMExport(0); // pwm0 is gpio18 + PWMWritePeriod(0, 20000000); + PWMWriteDutyCycle(0, 0); + PWMEnable(0); + + + for (int i = 0; i < 1000; i++){ + PWMWriteDutyCycle(0,i * 10000); + usleep(1000); + } + for (int i = 1000; i > 0; i--){ + PWMWriteDutyCycle(0,i*10000); + usleep(1000); + } + } + } + usleep(1000000); + + +} +close(fd); + close(sock); + //Disable GPIO pins + if (-1 == GPIOUnexport(POUT)) + return(4); + return(0); +} -- GitLab