From 94553b36cf96bdb6aa0b09942a32f43fc1c2e369 Mon Sep 17 00:00:00 2001 From: JangYeon Kim <jangyoun02@ajou.ac.kr> Date: Wed, 12 Jun 2024 17:30:04 +0900 Subject: [PATCH] Upload New File --- Central_Control_Board/Central_Main.c | 200 +++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 Central_Control_Board/Central_Main.c diff --git a/Central_Control_Board/Central_Main.c b/Central_Control_Board/Central_Main.c new file mode 100644 index 0000000..cebc372 --- /dev/null +++ b/Central_Control_Board/Central_Main.c @@ -0,0 +1,200 @@ + +#include "JaeYukBookkom.h" +#include <arpa/inet.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> +#include <sys/select.h> +#include <sys/time.h> +#include <pthread.h> +#include "LCD.c" +#include "GPIO.c" +#include "Networking.c" +#include "PWM.c" + +short int Window_Open = 0; +short int problem_sensing = 0; +short int user = 0; +void *Communicating(void *args); +int ms_handle_sense(void); +int ms_handle_oper(void); +int toggle_window(void); +void *getFromAPI(void *args); +void *AutoRefrash(void *args); +struct timeval timeout = {0, 1000}; +pthread_t *mainThread, *APIthread, *TimerThread; +int main(int argc, char *argv[]){ + if (argc != 2){ + printf("Usage : %s <port>\n", argv[0]); + exit(1); + } + + ServerInit(&serv_sock, atoi(argv[1])); + GPIOInit(); + LCD_init(); + mainThread = malloc(sizeof(pthread_t)); + APIthread = malloc(sizeof(pthread_t)); + TimerThread = malloc(sizeof(pthread_t)); + if (pthread_create(mainThread, NULL, Communicating, NULL) < 0) + perror("main thread create error:"); + if (pthread_create(APIthread, NULL, getFromAPI, NULL) < 0) + perror("API thread create error:"); + if (pthread_create(TimerThread, NULL, AutoRefrash, NULL) < 0) + perror("API thread create error:"); + + pthread_join(*mainThread, NULL); + pthread_join(*APIthread, NULL); + pthread_join(*TimerThread, NULL); + free(mainThread); + free(APIthread); + free(TimerThread); + return (0); +} +void *Communicating(void *args){ + int state = 1; + int prev_state = 1; + while (1){ + state = GPIORead(BUTTON_IN); + if (prev_state == 0 && state == 1) // button polling + toggle_window(); + prev_state = state; + + clients = clients_socket; + if (select(max_fd + 1, &clients, NULL, NULL, &timeout)){ // polling with listening clients message + if (FD_ISSET(clnt_sock[0], &clients)) // message from sensing board + ms_handle_sense(); + if (FD_ISSET(clnt_sock[1], &clients)) // message from sensing board + ms_handle_oper(); + } + usleep(500 * 100); + } + + //dispose socket + for (int i = 0; i < MAX_CONNECT_BOARD; i++){ + close(clnt_sock[i]); + } + close(serv_sock); +} +int ms_handle_sense(void){ // message handler from sensing board + char input_str[3] = {0}; + int str_len = read(clnt_sock[0], input_str, sizeof(input_str)); + if (str_len == -1){ + error_handling("read() error"); + return -1; + } + problem_sensing = atoi(input_str); + printf("problem: %d\n"); + LCD_messaging_error(problem_sensing); + if (problem_sensing && !user && problem_sensing != 8) + if (Window_Open) + toggle_window(); +} +int ms_handle_oper(void){ // message handler from operation board + char input_str[3] = {0}; + int str_len = read(clnt_sock[1], input_str, sizeof(input_str)); + if (str_len == -1){ + error_handling("read() error"); + return -1; + } + int danger = atoi(input_str); + if (danger){ + problem_sensing = 8; + LCD_messaging_error(problem_sensing); + boozerThread = malloc(sizeof(pthread_t)); + if (pthread_create(boozerThread, NULL, bozzering, NULL) < 0) + perror("buzzor thread create error:"); + } +} +int toggle_window(void){ + printf("Window toggle\n"); + if (problem_sensing == 8){ + pthread_cancel(*boozerThread); // boozer off + problem_sensing = 0; + LCD_messaging_error(problem_sensing); + return -1; + } + else if (problem_sensing && !Window_Open){ + boozer_Warning(); + user = 1; + } + Window_Open = !Window_Open; + char output_str[3] = {0}; + snprintf(output_str, 3, "%d", Window_Open); + write(clnt_sock[1], output_str, sizeof(output_str)); // open /close call to operation board + + printf("msg = %s\n", output_str); + if (Window_Open) + GPIOWrite(BUTTON_LED, HIGH); + else{ + GPIOWrite(BUTTON_LED, LOW); + user = 0; + } + +} +void *getFromAPI(void *args){ + fd_set API_socket, API; + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 1000; + FD_ZERO(&API_socket); + FD_SET(clnt_sock[2], &API_socket); + int max_fd2 = clnt_sock[2]; + int str_len; + char str[50]; + float temp, hyd; + int weatherCode, dust, rainPer; + while (1){ + if (select(max_fd2 + 1, &clients, NULL, NULL, &timeout)){ // polling with listening clients message + if (FD_ISSET(clnt_sock[2], &clients)){ // message from sensing board + str_len = read(clnt_sock[2], str, sizeof(str)); + if (str_len == -1){ + error_handling("read() error"); + continue; + } + printf("Receive message from Client : %s\n", str); + + char *ptr = strtok(str, " "); + printf("temp: %s\n", ptr); + temp = atof(ptr); + ptr = strtok(NULL, " "); + printf("hye: %s\n", ptr); + hyd = atof(ptr); + ptr = strtok(NULL, " "); + printf("wheatherCode: %s\n", ptr); + weatherCode = atoi(ptr); + ptr = strtok(NULL, " "); + printf("dust: %s\n", ptr); + dust = atoi(ptr); + ptr = strtok(NULL, " "); + printf("rainPer: %s\n", ptr); + rainPer = atoi(ptr); + LCD_weather_prediction(temp, hyd, weatherCode, dust, rainPer); + printf("API data received\n"); + } + } + usleep(5000000); + } +} +void *AutoRefrash(void *args){ + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + int state = 1, prev_state = 1; + printf("refresh sensing start"); + while (1){ + state = GPIORead(TIMER_IN); + if (prev_state == 0 && state == 1){ // button polling + printf("Auto reFrash with 15s\n"); + if (!Window_Open && !problem_sensing)// when window closed >> op -> cl + toggle_window(); + usleep(15000000); // waiting 15min(alternative: sec) with window open + if (problem_sensing != 8 && Window_Open)// if not door interrupt and not user close excuted + toggle_window(); + } + prev_state = state; + usleep(50000); + } +} \ No newline at end of file -- GitLab