Serial2MySQL/search.c

358 lines
8.5 KiB
C

#include <my_global.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mysql/mysql.h>
#include <signal.h>
char *server = "localhost"; /* server host (default=localhost) */
char *user = "root"; /* username (default=login name) */
char *password = "raspberry"; /* password (default=none) */
char *database = "adatok"; /* database name (default=none) */
MYSQL * con;
/*
struct buf_struct
{
uint8_t chamber_id; //fix 0x00 felsőbb egység állítsa be
uint8_t ch_id; //jumper configurable lsb module ch0-1 select next 4 bit 16 modul select next 1 bit xy board select
uint32_t inte_data; //integrated curve
uint16_t peak_amp;
uint16_t width;
uint32_t time_sec;
uint32_t time_ns;
uint16_t cmp_level;
uint16_t reserved;
};
*/
struct events
{
int start_ns;
int end_ns;
int time_sec;
int length;
};
void sigintHandler(int sig_num)
{
signal(SIGINT, sigintHandler);
mysql_close(con);
printf("\nExiting... \n");
exit(1);
}
void finish_with_error(MYSQL *con)
{
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
//pointerre mutató pointert kell átadni, hogy tudja módosítani az eredeti pointert
void mysql_connect(MYSQL **con)
{
*con = mysql_init(NULL);
if (*con == NULL)
{
fprintf(stderr, "mysql_init() failed\n");
exit(1);
}
printf("Mysql: Connecting to %s@%s as %s\n",database,server,user);
if (mysql_real_connect(*con, server, user, password, database, 0, NULL, 0) == NULL)
{
finish_with_error(*con);
}
else printf("Mysql: Connected succesfully!\n");
}
/*
int mysql_write(struct buf_struct adatok)
{
char data[300];
printf("MySQL: Adatok beírása...\n");
snprintf(data,300,"INSERT INTO fb_55(chamber_id,ch_id,inte_data,peak_amp,width,time_sec,time_ns,cmp_lvl) VALUES(%d,%d,%d,%d,%d,%ld,%ld,%d)",adatok.chamber_id,adatok.ch_id,adatok.inte_data,adatok.peak_amp,adatok.width,adatok.time_sec,adatok.time_ns, adatok.cmp_level);
mysql_query(conn,data);
}
*/
//lekéri a megadott másodpercben történt események time_ns oszlopát növekvő sorrendbe rendezve egy tömbbe
//bemenő paraméterek: array: null pointerre mutató pointer futás után egy int tömbre mutató pointer lesz használat után free vel felszabadítani!!!!
// size: előzú tömb mérete lesz benne
int time_ns_col_to_array(MYSQL *con, int **array, int *size, int time_sec, char * table_name)
{
char q_string[100];
int ret = 1;
snprintf(q_string,100, "SELECT time_ns FROM`%s`WHERE time_sec=%d ORDER BY`time_ns`ASC", table_name, time_sec);
if (mysql_query(con, q_string))
{
finish_with_error(con);
}
printf("lekeres ok\n");
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
printf("store ok\n");
if( mysql_num_fields(result) != 1) //1 oszlopot kérek le (time_ns)
{
printf("oszlop nem 1\n");
//mysql_close(con);
//exit(1);
return -1;
}
MYSQL_ROW row;
int i;
int row_count = mysql_num_rows(result);
*array = (int*) malloc(row_count * sizeof(int));
printf("realoc ok\n");
//while ((row = mysql_fetch_row(result)))
for(i=0;i<row_count ;i++)
{
if((row = mysql_fetch_row(result)) == NULL)
{
ret = -1; //hiba
break;
}
if(row[0] != NULL)
{
(*array)[i] = atoi(row[0]);
}
}
mysql_free_result(result);
*size = row_count; //feltöltött tömb mérete
return ret;
}
int find(
int* array, int array_size, int time_sec, //bemenő tömb
struct events** event_array, int *event_array_size, //kimenő tömb
int time_diff,int min_event_length //max időbeli különbség 2 egymás után következő között
)
{
int i;
int start_ns;
int event_count = 0; //struktúra tömb indexeléshez
int event_length = 0;
*event_array = (struct events*) malloc(array_size * sizeof(struct events)); //legrosszabb esetet feltételezve
*event_array_size = 0;
min_event_length--; //legaláb 2 különben hiba
start_ns = array[0];
for(i=0;i<(array_size-1);i++)
{
if((array[i] + time_diff) < array[i+1]) //ha nagyobb a különbség mint a megengedett
{
if(event_length >= min_event_length)
{
(*((*event_array) + event_count)).start_ns = start_ns; //kezdő elem
(*((*event_array) + event_count)).end_ns = array[i]; //utolsó elemnek a még jó idejü
(*((*event_array) + event_count)).time_sec = time_sec; //ebben a másodpercben volt az esemény, későbbi hazsnálatra
(*((*event_array) + event_count)).length = event_length + 1;
event_count++;
}
start_ns = array[i+1];
event_length = 0;
}
else
event_length++;
}
if(event_length >= min_event_length) //utolsó lemaradt elem vizsgálata
{
(*((*event_array) + event_count)).start_ns = start_ns; //kezdő elem
(*((*event_array) + event_count)).end_ns = array[i]; //utolsó elemnek a még jó idejü
(*((*event_array) + event_count)).time_sec = time_sec; //ebben a másodpercben volt az esemény, későbbi hazsnálatra
(*((*event_array) + event_count)).length = event_length + 1;
event_count++;
}
*event_array_size = event_count;
}
int mysql_write_event_data_row(MYSQL *con, int row_buffer[], int id)
{
char data[300];
snprintf(data,300,"INSERT INTO `event_data` (chamber,sec,id,ch_id,inte_data,peak_amp,time_ns,width,cmp_lvl) VALUES(%d,%d,%d,%d,%d,%d,%d,%d,%d)",
row_buffer[0], row_buffer[5], id, row_buffer[1],row_buffer[2], row_buffer[3], row_buffer[6], row_buffer[4], row_buffer[7]);
if (mysql_query(con,data))
{
finish_with_error(con);
}
}
int fill_event_table(struct events *event_time_buf, int event_time_buf_size, MYSQL *con, char * table_name)
{
static int event_id=0;
int i;
char q_string[100];
int row_buff[8];
for(i=0;i<event_time_buf_size;i++)
{
snprintf(q_string,150,"SELECT * FROM `%s` where time_sec =%d AND time_ns >=%d AND time_ns <=%d ORDER BY `ch_id` ASC"
, table_name, event_time_buf[i].time_sec, event_time_buf[i].start_ns, event_time_buf[i].end_ns );
printf("data:%s",q_string);
if (mysql_query(con, q_string))
{
finish_with_error(con);
}
//printf("lekeres ok\n");
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
//printf("store ok\n");
if( mysql_num_fields(result) != 8)
{
printf("oszlop nem 8\n");
//mysql_close(con);
//exit(1);
return -1;
}
MYSQL_ROW row;
if(mysql_num_rows(result) != event_time_buf[i].length)
{
printf("sorok szama nem egyezik meg!");
return -1;
}
int j,k;
//while ((row = mysql_fetch_row(result)))
for(j=0;j<event_time_buf[i].length ;j++) //összetartozó sorok
{
if((row = mysql_fetch_row(result)) == NULL)
{
printf("row null error");
mysql_free_result(result);
return -1; //hiba
}
for(k=0;k<8;k++) //soron belül oszlopok
{
if(row[k] != NULL)
{
row_buff[k] = atoi(row[k]);
}
}
mysql_write_event_data_row(con,row_buff,event_id);
}
event_id++;
mysql_free_result(result);
printf("for i:%d",i);
}
}
int main(int argc,char* argv[])
{
signal(SIGINT, sigintHandler); //CTRL + C kezelése. csak szórakozás
mysql_connect(&con);
int *array = NULL;
int size;
int sec;
struct events* event_buf = NULL;
int event_buf_size;
printf("end sec:");
scanf("%d",&sec);
/*
time_ns_col_to_array(con, &array, &size, sec, "fb_55"); //másodpercet főként itt beállítani!!!
for(int i=0;i<size;i++)
printf("%d\n",array[i]);
find(array, size, sec, &event_buf, &event_buf_size, 2000, 2);
printf("\nevnet array length:%d\n",event_buf_size);
for(int i=0;i<event_buf_size;i++)
printf("\nstart:%d, end:%d length:%d\n",event_buf[i].start_ns, event_buf[i].end_ns, event_buf[i].length);
free(array);
free(event_buf);
*/
for(int j=10;j<sec;j++)
{
time_ns_col_to_array(con, &array, &size, j, "fb_55"); //másodpercet főként itt beállítani!!!
//for(int i=0;i<size;i++)
//printf("%d\n",array[i]);
find(array, size, j, &event_buf, &event_buf_size, 4000, 4);
printf("\nevnet array length:%d\n",event_buf_size);
//for(int i=0;i<event_buf_size;i++)
//printf("\nstart:%d, end:%d length:%d\n",event_buf[i].start_ns, event_buf[i].end_ns, event_buf[i].length);
fill_event_table(event_buf, event_buf_size, con, "fb_55");
free(array);
free(event_buf);
printf("ok\n");
}
printf("end\n");
mysql_close(con);
}