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