#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BL_ZB 5 // Brak zbioru #define SIZE 256 #define PIPESIZE 10 #define BEEP 23 #define WEWY 25 /* zmienne */ int a, z, i, j, i1; int up; // czy polaczenie zyje size_t wyn; FILE *fp; int pd; int sleep_time; char buf[520]; char buf_rozk[20]; char data[SIZE]; //tabela konwersji HID unsigned char konvhid [40]={ '*','*','*','*','A','B','C','D','E','F','*','*','*','*','*','*' ,'*','*','*','*','*','*','*','*','*','*','*','*','*','*','1','2' ,'3','4','5','6','7','8','9','0'}; speed_t predkosc; int n, m; unsigned char znak[100]; time_t czas1; time_t czas2; struct tm *loctime; struct timespec tim, tim2; int wewy; // czytnik wejsciowy czy wyjsciowy int nrzdjecia; char nrzdjchr[10]; char nazwa[20]; struct termios opcje; static int lcdHandle ; // tablica na fifo do wyswietlacza struct { int x; int y; char tresc[30]; } bufwysw[PIPESIZE]; int wyswp; int wyswk; unsigned char sumakontr = 0; /* zmienne bazy danych */ MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; char buf_sql[255]; char user[32]; char pass[32]; char pracownik[40]; unsigned char karta[25]; char imie[40]; char nazwisko[40]; char imienaz[80]; char buf1[22]; union par { struct param { char host_sql[25]; char user_sql[25]; char pass_sql[25]; char datab_sql[25]; } pars; char tab_par[4][25]; } paru; union pass { char pass_c; unsigned int pass_n; } passu; char pass1[80]; MYSQL mysql; PI_THREAD(lateok); void wyswietl(); void wyswbuf(); void Delay_ms(int microsec); void int_impuls(void); void clean_up_child_process(int signal_num) { /* remove child process */ int status, k; wait (&status); wyswbuf(9,2,"OK"); piThreadCreate (lateok) ; } /* S T A R T */ void main (argc, argv) int argc; char *argv[]; { int sockf, portno ; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; // check wiringPi setup if (wiringPiSetup() == -1) { printf("wiringPi-Error\n"); exit(1); } pinMode(BEEP, OUTPUT); pinMode (WEWY , INPUT) ; pullUpDnControl(WEWY, PUD_UP); wiringPiISR (WEWY, INT_EDGE_FALLING, &int_impuls); lcdHandle = lcdInit (4, 20, 4, 10,11, 0,1,2,3,0,0,0,0) ; wyswp =0; wyswk =0; /* handle SIGCHLD by calling clean_up_child_process */ struct sigaction sigchild_action; memset(&sigchild_action, 0, sizeof(sigchild_action)); sigchild_action.sa_handler = &clean_up_child_process; sigaction(SIGCHLD, &sigchild_action, NULL); fp = fopen ("/home/minircp/param", "r"); if (fp == NULL) { fprintf (stderr, "Blad - Brak zbioru \"param\"\n"); exit (BL_ZB); } n = 0; while ((fgets (buf, 79, fp) != NULL) && n < 4) { if (buf[0] != '\n' && buf[0] != '#') { strcpy (paru.tab_par[n], buf); paru.tab_par[n][strlen (buf) - 1] = '\0'; n++; } } while ((fgets (buf, 79, fp) != NULL)) { if (buf[0] != '\n' && buf[0] != '#') { buf[strlen (buf) - 1] = '\0'; break; } } while ((fgets (buf, 79, fp) != NULL)) { if (buf[0] != '\n' && buf[0] != '#') { buf[strlen (buf) - 1] = '\0'; } } fclose (fp); for (n = 0; n < strlen (paru.pars.pass_sql); n = n + 2) { pass1[n / 2] = ((int) paru.pars.pass_sql[n] & 0x0F ^ 0x5) | ((int) paru.pars. pass_sql[n + 1] << 4 ^ 0x50); } pass1[n / 2] = '\0'; strcpy (paru.pars.pass_sql, pass1); if((pd = open("/dev/ttyAMA0",O_RDWR | O_NDELAY |O_NONBLOCK)) != -1) { tcgetattr (pd, &opcje); /* Zaprogramuj predkosc transmisji */ predkosc = B9600; cfsetspeed (&opcje, predkosc); /* Ustaw tryb raw, potem bez parzystosci i znak osmiobitowy */ opcje.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); opcje.c_cflag &= ~PARENB; opcje.c_cflag &= ~PARODD; opcje.c_cflag &= ~CSTOPB; opcje.c_cflag &= ~CSIZE; opcje.c_cflag |= CS8; opcje.c_iflag &= ~IXON; opcje.c_iflag &= ~IXOFF; opcje.c_iflag &= ~INLCR; opcje.c_iflag &= ~ICRNL; opcje.c_oflag &= ~ONLCR; opcje.c_oflag &= ~OCRNL; tcsetattr (pd, TCSANOW, &opcje); printf("Podlaczylem czytnik RFID pd=%d \n",pd); fflush(0); } else { printf("Brak czytnika RFID!"); exit(2); } bzero(buffer,256); strcpy(buf1," "); printf ("\n\n**************** system gotowy do odczytu danych z czytnikow ******************\n\n"); fflush(0); time (&czas1); loctime = localtime (&czas1); strftime (data, SIZE, "%Y-%m-%d", loctime); wewy=1; lcdClear(lcdHandle); wyswietl(6,1,"WEJSCIE"); loctime = localtime (&czas1); strftime (buffer, SIZE, "%Y-%m-%d %H:%M:%S", loctime); wyswietl(0,3,buffer); while (TRUE) { sleep(1); // usun ewentualne wielokrotne odczyty karty while( read(pd, &znak, 99) > 0) ; znak[0]=0x00; while (znak[0] != 0x02) { read(pd, &znak[0], 1); time (&czas1); // moment wykonania petli na potrzeby timeout // wyswietlaj czas co 10 sekund // if (czas1%2 == 0) // if (czas1%10 == 0) if (czas2!= czas1) { loctime = localtime (&czas1); strftime (buffer, SIZE, "%Y-%m-%d %H:%M:%S", loctime); wyswietl(0,3,buffer); czas2=czas1; if(wyswp != wyswk) { wyswietl(bufwysw[wyswk].x, bufwysw[wyswk].y, bufwysw[wyswk].tresc); wyswk ++; if (wyswk == PIPESIZE) wyswk = 0; } } n=0; } while(TRUE) { if ((a=read (pd, &znak, 1)) != -1) { karta[n] = znak[0]; n++; if (n>11) break; } } // remove CRC karta[10]=0x00; // printf("karta: %s\n", karta); // beep digitalWrite(BEEP,HIGH); Delay_ms(200); digitalWrite(BEEP,LOW); { // Otworz baze danych mysql_init (&mysql); if (!mysql_real_connect (&mysql, paru.pars.host_sql, paru.pars.user_sql, paru.pars.pass_sql, paru.pars.datab_sql, 0, NULL, 0)) { printf ("Nie moge sie polaczyc z baza danych:\nBlad: %s\n", mysql_error (&mysql)); wyswietl(0,0, "Brak polaczenia z baza"); continue; } strcpy(buf_sql,"select numer from zdjecia"); if (mysql_query (&mysql, &buf_sql[0])) { printf ("Nie moge czytac z bazy danych:\nBlad: %s\n", mysql_error (&mysql)); fflush(0); mysql_close(&mysql); wyswietl(0,0, "Brak polaczenia z baza"); } else { if (res = mysql_store_result (&mysql)) { if (mysql_num_rows (res)) { row = mysql_fetch_row (res); nrzdjecia= atoi(row[0]) + 1; sprintf(buf_sql, "update zdjecia set numer=%i", nrzdjecia); mysql_query (&mysql, &buf_sql[0]); mysql_free_result (res); } } } sprintf(nrzdjchr, "%i", nrzdjecia); if (! (m = fork()) ) execl("/home/minircp/pstryk", "/home/minircp/pstryk", nrzdjchr, (char *)0); sprintf(buf_sql, "select idk, idp, imie, nazwisko from kadry where idk=\"%s\" and data_waz >= \"%s\" and zezw=1", karta, data); //printf ("buf:%s\n", buf_sql); fflush(0); if (mysql_query (&mysql, &buf_sql[0])) { printf ("Nie moge czytac z bazy danych:\nBlad: %s\n", mysql_error (&mysql)); fflush(0); mysql_close(&mysql); wyswietl(0,0, "Brak polaczenia z baza"); } else { if (res = mysql_store_result (&mysql)) { if (mysql_num_rows (res)) { row = mysql_fetch_row (res); strcpy (pracownik, row[1]); strcpy (imie, row[2]); strcpy (nazwisko, row[3]); imienaz[0] = imie[0]; imienaz[1] = 0x2e; imienaz[2] = 0x20; imienaz[3] = 0x00; strcat (imienaz, nazwisko); wyswietl(0,0, imienaz); mysql_free_result (res); sprintf (buf_sql, "insert into czytnik set \ idk=\"%s\", idp=\"%s\", wejwyj=\"%d\", linia=%d, \ czytnik=%s, zdjecie=%i", karta, pracownik, wewy, 0, 0, nrzdjecia); if (mysql_query (&mysql, &buf_sql[0])) { printf ("Nie moge czytac z bazy danych:\nBlad: %s\n", mysql_error (&mysql)); fflush(0); mysql_close(&mysql); wyswietl(0,0, "Brak polaczenia z baza"); } sprintf (buf_sql, "insert into czytnik_rob set \ idk=\"%s\", idp=\"%s\", wejwyj=\"%d\", linia=%d, \ czytnik=%s, zdjecie=%i", karta, pracownik, wewy, 0, 0, nrzdjecia); if (mysql_query (&mysql, &buf_sql[0])) { printf ("Nie moge czytac z bazy danych:\nBlad: %s\n", mysql_error (&mysql)); fflush(0); mysql_close(&mysql); wyswietl(0,0, "Brak polaczenia z baza"); } } //numrows else { //printf("Karta nieznana\n"); wyswietl(0,0, " KARTA NIEZNANA "); sleep(2); wyswietl(0,0, " "); } sprintf (buf_sql, "flush tables czytnik, czytnik_rob, zdjecia"); if (mysql_query (&mysql, buf_sql)) { printf ("Nie moge czytac z bazy danych:\nBlad: %s\n", mysql_error (&mysql)); fflush(0); mysql_close(&mysql); wyswietl(0,0, "Brak polaczenia z baza"); } } //if res }//mysqlquery mysql_close(&mysql); } } //od while(TRUE) } // od main //***************************************** void wyswietl(int x, int y, char* tresc) { lcdPosition (lcdHandle, x, y) ; strncpy(buf1, tresc, 20); lcdPuts (lcdHandle, buf1) ; } //***************************************** void wyswbuf(int x, int y, char* tresc) { bufwysw[wyswp].x = x; bufwysw[wyswp].y = y; strncpy(bufwysw[wyswp].tresc, tresc, 20); wyswp++; if (wyswp == PIPESIZE) wyswp = 0; fflush(0); } //***************************************** void Delay_ms(int milisec) { tim.tv_sec = 0; tim.tv_nsec = milisec * 1000000; while(nanosleep(&tim,&tim)==-1) continue; } //************************************** void int_impuls(void) { Delay_ms(200); if (wewy==0) { wewy=1; wyswbuf(6,1,"WEJSCIE"); } else { wewy=0; wyswbuf(6,1,"WYJSCIE"); } } //************************************* PI_THREAD(lateok) { sleep(1); wyswbuf(9,2," "); wyswbuf(0,0," "); }