From 8d89ba7c2e0d7e73e563ff56b5ef77b832964ecd Mon Sep 17 00:00:00 2001
From: JangYeon Kim <jangyoun02@ajou.ac.kr>
Date: Wed, 12 Jun 2024 17:30:14 +0900
Subject: [PATCH] Upload New File

---
 Central_Control_Board/GPIO.c | 134 +++++++++++++++++++++++++++++++++++
 1 file changed, 134 insertions(+)
 create mode 100644 Central_Control_Board/GPIO.c

diff --git a/Central_Control_Board/GPIO.c b/Central_Control_Board/GPIO.c
new file mode 100644
index 0000000..1a02a82
--- /dev/null
+++ b/Central_Control_Board/GPIO.c
@@ -0,0 +1,134 @@
+#include "JaeYukBookkom.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+void error_handling(char *message);
+static int GPIOExport(int pin);
+static int GPIOUnexport(int pin);
+static int GPIODirection(int pin, int dir);
+static int GPIORead(int pin);
+static int GPIOWrite(int pin, int value);
+
+int GPIOInit(void){
+    if (-1 == GPIOExport(BUTTON_IN) || -1 == GPIOExport(BUTTON_OUT)|| -1 == GPIOExport(BUTTON_LED)||-1 == GPIOExport(TIMER_IN) || -1 == GPIOExport(TIMER_OUT))
+        return (1);
+    if (-1 == GPIODirection(BUTTON_IN, IN) || -1 == GPIODirection(BUTTON_OUT, OUT) || -1 == GPIODirection(BUTTON_LED, OUT)||-1 == GPIODirection(TIMER_IN, IN) || -1 == GPIODirection(TIMER_OUT, OUT))
+        return (2);
+    if (-1 == GPIOWrite(BUTTON_OUT, 1)||-1 == GPIOWrite(TIMER_OUT, 1))
+        return (3);
+}
+void GPIODispose(void){
+    GPIOUnexport(BUTTON_IN);
+    GPIOUnexport(BUTTON_OUT);
+    GPIOUnexport(BUTTON_LED);
+    GPIOUnexport(TIMER_IN);
+    GPIOUnexport(TIMER_OUT);
+}
+
+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");
+        close(fd);
+        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);
+}
-- 
GitLab