From 8a6c253a3ced8e6812f1cd1d471b6ea47ea8858b Mon Sep 17 00:00:00 2001
From: 201221016Kim Haeram <bbusy087@ajou.ac.kr>
Date: Tue, 10 Dec 2019 00:57:42 -1000
Subject: [PATCH] asd

---
 app   | Bin 8600 -> 13084 bytes
 app.c | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 335 insertions(+), 35 deletions(-)

diff --git a/app b/app
index e2e0be1a3fa097c90a616f73c9d4b7976634f06a..9ece996fa773f10eb55f7f19ed1823d6ab1f80c2 100755
GIT binary patch
literal 13084
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
Rtgc6wfdP5w3}he32mtbtoEZQB

literal 8600
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

diff --git a/app.c b/app.c
index 8b7ef8c..727fc82 100644
--- a/app.c
+++ b/app.c
@@ -2,84 +2,384 @@
 #include <pthread.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
 
-// http://www.digipine.com/index.php?mid=clan&document_srl=584
+#include <fcntl.h> 
+#include <string.h>
+#include <stdint.h>
+#include <sys/ioctl.h> 
+#include <sys/types.h> 
+#include <sys/sysmacros.h>  
+#include <linux/spi/spidev.h>
 
-#define TRUE 1
-#define FALSE 0
+#define LOADCELL_MAJOR_NUMBER	502
+#define LOADCELL_MINOR_NUMBER	100
+#define LOADCELL_DEV_PATH_NAME		"/dev/loadcell_dev"
+#define LOADCELL_THRESHOLD		10000
 
-#define THRESHOLD_ULTRASONIC_COMING	1234
+#define LED_PED_GREEN	18
+#define LED_CAR_RED		23
+#define LED_CAR_YELLOW	24
+#define LED_CAR_GREEN	25
+
+#define HS_TRIG	2
+#define HS_ECHO	3
+
+#define HS_MAX	1400
+#define HS_MIN	50
+#define HS_WAIT_THRESHOLD	10
+#define HS_INCOME_THRESHOLD	30
 #define TERM_COMING	1
 
+#define SPI_DEV0_PATH	"/dev/spidev0.0"
+#define SPI_CHANNEL	0
+#define SPI_SPEED	1000000
+#define SPI_DELAY	0
+#define SPI_BPW		8
+#define ADC_CHANNEL	0
+#define WATER_THRESHOLD 300
+
+#define MAIN_WAITTIME	3
+
 int isPedestrianComing = 0;
+long weight = -1;
+double distance = -1;
+int adc_value = -1;
+long tare = -1;
+
+void *hs_read(void *data){
+	printf("hs_read() called\n");
+	while(1){
+		digitalWrite(HS_TRIG, HIGH);
+		delayMicroseconds(10);
+		digitalWrite(HS_TRIG, LOW);
+		unsigned int echoStart = millis();
+		while(digitalRead(HS_ECHO) == LOW && millis()-echoStart < 1000) {
+			// do nothing
+		}
+		if (millis()-echoStart < 1000) {
+		// Mark start
+		unsigned int start = micros();
+		while(digitalRead(HS_ECHO) == HIGH) {
+			// do nothing
+		}
+		// Mark end
+		unsigned int end = micros();
+		unsigned int delta = end-start;
+		
+		if(delta < HS_MAX && delta > HS_MIN){
+			distance = 34029 * delta / 2000000.0;	
+			//printf("Distance: %f\n", distance);
+		}
+		else distance = -1;
+		}
+	}
+    
+}
 
-void *t_function(void *data){
-	int buf1 = 0;
-	int buf2 = 0;
-	int buf3 = 0;
+void *water_read(void *data){
+	unsigned char buffer[3];
+	struct spi_ioc_transfer spi;
+	int spiFds = *(int *)data;
+	
+	buffer[0] = 1;
+	buffer[1] = (8 + ADC_CHANNEL) << 4;
+	buffer[2] = 0;
+	memset(&spi, 0, sizeof(spi));
+	spi.tx_buf = (unsigned long)buffer;
+	spi.rx_buf = (unsigned long)buffer;
+	spi.len = 3;
+	spi.delay_usecs = (uint16_t) SPI_DELAY;
+	spi.speed_hz = (uint16_t) SPI_SPEED;
+	spi.bits_per_word = (uint8_t) SPI_BPW;
 	
-	// ultrasonic.read(&buf1);
+	while (1) {
+		ioctl(spiFds, SPI_IOC_MESSAGE(1), &spi);
+		adc_value = ((buffer[1] & 3) << 8) + buffer[2];
+		delay(100);
+	}
+}
+
+void *incoming_validate(void *data){
+	double buf1 = 0;
+	double buf2 = 0;
+	double buf3 = 0;
+	//printf("thread opened\n");
+	while(distance<0){
+		//printf("distance not ready\n");
+		sleep(1);
+	}
+	
+	buf1 = distance;
 	sleep(TERM_COMING);
-	// ultrasonic.read(&buf2);
+	
+	while(distance<0){
+		//printf("distance not ready\n");
+		sleep(1);
+	}
+	buf2 = distance;
 	sleep(TERM_COMING);
 	while(TRUE){
-		// ultrasonic.read(&buf3);
-		if(buf3 > THRESHOLD_ULTRASONIC_COMING
-			&& buf2 - buf1 > 0
-			&& buf3 - buf2 > 0){
+		while(distance<0){
+			isPedestrianComing = FALSE;
+			//printf("distance not ready\n");
+			sleep(1);
+		}
+		buf3 = distance;
+		if(buf3 < HS_INCOME_THRESHOLD
+			& ((isPedestrianComing == TRUE)
+			|| (buf2 - buf1 < 0
+			&& buf3 - buf2 < 0))){
 				isPedestrianComing = TRUE;
-				printf("true\n");
+				//printf("%2.1f %2.1f %2.1f true\n",buf1,buf2,buf3);
 		}
 		else{
 				isPedestrianComing = FALSE;
-				printf("false\n");
+				//printf("%2.1f %2.1f %2.1f false\n",buf1,buf2,buf3);
 		}
 		sleep(TERM_COMING);
 		
-		// ultrasonic.read(&buf1);
-		if(buf1 > THRESHOLD_ULTRASONIC_COMING
-			&& buf3 - buf2 > 0
-			&& buf1 - buf3 > 0){
+		while(distance<0){
+			isPedestrianComing = FALSE;
+			//printf("distance not ready\n");
+			sleep(1);
+		}
+		buf1 = distance;
+		if(buf1 < HS_INCOME_THRESHOLD
+			& ((isPedestrianComing == TRUE)
+			|| (buf3 - buf2 < 0
+			&& buf1 - buf3 < 0))){
 				isPedestrianComing = TRUE;
-				printf("true\n");
+				//printf("%2.1f %2.1f %2.1f true\n",buf2,buf3,buf1);
 		}
 		else{
 				isPedestrianComing = FALSE;
-				printf("false\n");
+				//printf("%2.1f %2.1f %2.1f false\n",buf2,buf3,buf1);
 		}
 		sleep(TERM_COMING);
 		
-		// ultrasonic.read(&buf2);
-		if(buf2 > THRESHOLD_ULTRASONIC_COMING
-			&& buf1 - buf3 > 0
-			&& buf2 - buf1 > 0){
+		while(distance<0){
+			isPedestrianComing = FALSE;
+			//printf("distance not ready\n");
+			sleep(1);
+		}
+		buf2 = distance;
+		if(buf2 < HS_INCOME_THRESHOLD
+			& ((isPedestrianComing == TRUE)
+			|| (buf1 - buf3 < 0
+			&& buf2 - buf1 < 0))){
 				isPedestrianComing = TRUE;
-				printf("true\n");
+				//printf("%2.1f %2.1f %2.1f true\n",buf3,buf1,buf2);
 		}
 		else{
 				isPedestrianComing = FALSE;
-				printf("false\n");
+				//printf("%2.1f %2.1f %2.1f false\n",buf3,buf1,buf2);
 		}
 		sleep(TERM_COMING);
 	}
 }
+/*
+void *weight_read(void *data){
+	int loadcell_fd = *(int*)data;
+	int i, test;
+	long buffer[1];
+	long sample[5];
+	long avg;
+	
+	while(1){
+		*buffer = -1;
+		while(*buffer < 3000 || *buffer >= 200000){
+			usleep(100);
+			read(loadcell_fd,buffer,4);
+		}
+		
+	}
+	
+	test = 0;
+	while(test<5){
+		test = 0;
+		avg=0;
+		for(i=0;i<5;i++){
+			read(loadcell_fd,buffer,4);
+			while(*buffer < 0 || *buffer >= 0x7fffff){
+				usleep(100000);
+				read(loadcell_fd,buffer,4);
+			}
+			//printf("%ld ",*buffer);
+			sample[i] = *buffer;
+			avg += sample[i];
+		}
+		avg /= 5;
+		for(i=0;i<5;i++){
+			if((sample[i] - avg) < (avg*0.1) 
+				&& (sample[i] - avg) > -(avg*0.1)){
+				test++;
+				//printf("test+ ");
+			}
+			//else printf("test- ");
+		}
+		//printf("avg: %ld \n",avg);
+	}
+	tare = avg;
+	
+	while(1){
+		test = 0;
+		avg = 0;
+		for(i=0;i<3;i++){
+			read(loadcell_fd,buffer,4);
+			while(*buffer < 0 || *buffer >= 0x7fffff){
+				usleep(100000);
+				read(loadcell_fd,buffer,4);
+			}
+			sample[i] = *buffer;
+			avg += sample[i];
+		}
+		avg /= 3;
+		//printf("avg: %ld / ",avg);
+		for(i=0;i<3;i++){
+			if((sample[i] - avg) < (avg*0.1) 
+				&& (sample[i] - avg) > -(avg*0.1)){
+				test++;
+				//printf("%ld+ ",sample[i]);
+			}
+			//else printf("%ld- ",sample[i]);
+		}
+		//printf("\n");
+		if(test == 3){
+			weight = avg - tare;
+			//printf("weighted : %ld",weight);
+		}
+		sleep(1);
+	}
+}
+*/
 
 int main(void){
-	pthread_t incomeCheckThread;
-	int status;
+	pthread_t waterThread, hsReadThread, incomeCheckThread, weightThread;	
+	//setbuf(stdout, NULL);
 	
-	if(pthread_create(&incomeCheckThread, NULL, t_function, (void *)NULL) < 0){
+	int rc = wiringPiSetupGpio();
+	if (rc != 0) {
+		printf("Failed to wiringPiSetupGpio()\n");
+		return 0;
+	}
+	
+	// setup trafficlight
+	pinMode(LED_PED_GREEN, OUTPUT);
+	pinMode(LED_CAR_RED, OUTPUT);
+	pinMode(LED_CAR_YELLOW, OUTPUT);
+	pinMode(LED_CAR_GREEN, OUTPUT);
+/*
+	// setup weight
+	int loadcell_dev = open(LOADCELL_DEV_PATH_NAME, O_RDWR < 0);
+	if(loadcell_dev < 0){
+		printf("Failed to open loadcell device\n");
+		return -1;
+	}
+	if(pthread_create(&weightThread, NULL, weight_read, (void *)&loadcell_dev) < 0){
 		perror("thread create error: ");
 		exit(0);
 	}
 	
+	// waiting tare
+	printf("init weight tare, plz wait..\n");
 	while(1){
-		printf("main read: %d\n", isPedestrianComing);
-		sleep(1);
+		if(tare>0) break;
+	}
+	printf("tare init done: %ld\n",tare);
+	*/
+	
+	// setup water
+	int waterdev = open(SPI_DEV0_PATH, O_RDWR < 0);
+	if(waterdev < 0){
+		printf("Failed to open water device\n");
+		return -1;
+	}
+	
+	if(pthread_create(&waterThread, NULL, water_read, (void *)&waterdev) < 0){
+		perror("thread create error: ");
+		exit(0);
+	}
+	
+	// setup hs
+	pinMode(HS_TRIG, OUTPUT);
+	pinMode(HS_ECHO, INPUT);
+	digitalWrite(HS_TRIG, LOW);
+	if(pthread_create(&hsReadThread, NULL, hs_read, (void *)NULL) < 0){
+		perror("thread create error: ");
+		exit(0);
+	}
+	
+	if(pthread_create(&incomeCheckThread, NULL, incoming_validate, (void *)NULL) < 0){
+		perror("thread create error: ");
+		exit(0);
 	}
 	
-	pthread_join(incomeCheckThread, (void *)&status);
-	printf("thread join : %d\n", status);
+	int yellowTime;
+	int pedestrianTime;
+	int extendCount;
+	
+	while(1){	
+		digitalWrite(LED_PED_GREEN,LOW);	// pedestrian = red
+		digitalWrite(LED_CAR_RED,LOW);
+		digitalWrite(LED_CAR_YELLOW,LOW);
+		digitalWrite(LED_CAR_GREEN,HIGH);	// car = green
+		
+		while(distance<0){
+			printf("waiting pedestrian now..\n");
+			sleep(MAIN_WAITTIME);
+		}
+		if(distance < HS_WAIT_THRESHOLD){
+			printf("pedestrian accepted. validating now..\n");
+			sleep(MAIN_WAITTIME);
+			if(distance < HS_WAIT_THRESHOLD && distance != -1){
+				// pedestrian waited enough, give him signal
+				printf("pedestrian validated. turn on yellow\n");
+				if(adc_value > WATER_THRESHOLD){
+					// road is slippy, long yellow light time
+					yellowTime = MAIN_WAITTIME *2;
+				}
+				else{
+					yellowTime = MAIN_WAITTIME;
+				}
+
+				digitalWrite(LED_CAR_YELLOW,HIGH);
+				digitalWrite(LED_CAR_GREEN,LOW); // car = yellow
+				printf("yellow-> sleep %d\n",yellowTime);
+				sleep(yellowTime);
+				
+				digitalWrite(LED_PED_GREEN,HIGH); // pedestrian = green
+				digitalWrite(LED_CAR_RED,HIGH);
+				digitalWrite(LED_CAR_YELLOW,LOW);  // car = red
+				pedestrianTime = MAIN_WAITTIME *5;
+				extendCount = 0;
+				while(pedestrianTime > 0){
+					sleep(MAIN_WAITTIME);
+					pedestrianTime -= MAIN_WAITTIME;
+					if(weight < LOADCELL_THRESHOLD
+						&& isPedestrianComing == TRUE
+						&& extendCount < 3){
+						// car is NOT waiting, pedestrian coming.
+						pedestrianTime += MAIN_WAITTIME;
+						extendCount++;
+						printf("pedestrian ++, pedestrian = %d\n", pedestrianTime);
+					}
+					else{
+						printf("pedestrian --, pedestrian = %d\n", pedestrianTime);
+					}
+				}
+			}
+			else{
+				printf("pedestrian declined, move to first step..\n");
+			}
+		}
+	}
+
+	
+	digitalWrite(LED_PED_GREEN,LOW);
+	digitalWrite(LED_CAR_RED,LOW);
+	digitalWrite(LED_CAR_GREEN,LOW);
 	
 	return 0;
 }
-- 
GitLab