#define _XOPEN_SOURCE
#define PRAG 0.6
#define KOLNAZ 30
#include <stdio.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct meritev {
int t_alpha; /* milisekunde */
long double F_m;
long double h_alpha;
long double F_alpha;
long double V_alpha; /* litri */
long double F_g;
long double F_teor;
};
struct poskus {
int id;
struct tm cas;
struct meritev meritev[256]; /* maks 256 meritev */
int meritevn;
long double t_m; /* milisekunde */
long double F_alpha_avg;
long double a_k;
int P_0;
long double V_0;
long double t_0; /* čas, ko je prvič F_m > PRAG N */
long double F_alpha_max;
};
long double /* liter */ h2v (long double /* meter */ x) {
if (x > 0.245)
return 1;
if (x < 0.055)
return 0;
return 0.106 + (1000*(0.001459010809 /* r^2 */ * 3.14159265 * (x - 0.055)));
}
int main (int argc, char ** argv) {
DIR /* * videod, */ * vagad;
struct dirent * dir;
struct poskus poskus[256]; /* maks 256 poskusov */
int i = 0;
/* videod = opendir("../podatki-video"); */
vagad = opendir("../podatki-vaga");
if (/* !videod || */ !vagad) {
fprintf(stderr, "ni uspelo odpreti direktorija!\n");
/* closedir(videod); */
closedir(vagad);
return 1;
}
fprintf(stderr, "berem direktorij ... \n");
while ((dir = readdir(vagad)) != NULL) {
strptime(dir->d_name, "%m%d%H%M", &poskus[i].cas);
sscanf(dir->d_name, "%d-%LfL-%dbar", &poskus[i].id, &poskus[i].V_0, &poskus[i].P_0);
char videofn[256], vagafn[256], buf[256], outfn[256];
snprintf(videofn, 256, "../podatki-video/za-%08d.csv", poskus[i].id);
snprintf(vagafn, 256, "../podatki-vaga/%s", dir->d_name);
if (strstr(dir->d_name, "slabfilm") || strstr(dir->d_name, "brezfilma") || dir->d_name[3] == '0')
continue;
FILE * vagaf = fopen(vagafn, "r");
FILE * videof = fopen(videofn, "r");
if (!vagaf || !videof) {
fprintf(stderr, "ni uspelo odpreti %s ali %s\n", vagafn, videofn);
if (vagaf) fclose(vagaf);
if (videof) fclose(videof);
continue;
}
int t0;
long double ldbuf;
char * cp;
fgets(buf, 256, vagaf);
poskus[i].meritevn = 0;
poskus[i].F_alpha_max = 0;
while (!feof(vagaf)) {
#define nmer poskus[i].meritev[poskus[i].meritevn]
ldbuf = strtold(buf, &cp);
if (!poskus[i].meritevn)
t0 = ldbuf;
nmer.t_alpha = ldbuf - t0;
cp++;
ldbuf = strtold(cp, &cp);
nmer.F_m = ldbuf*9.81;
nmer.F_alpha = -1;
nmer.F_teor = -1;
fgets(buf, 256, vagaf);
poskus[i].meritevn++;
}
fgets(buf, 256, videof);
while (!feof(videof)) {
ldbuf = strtold(buf, &cp);
ldbuf = (ldbuf*1000);
int j = 0;
#define omer poskus[i].meritev[j]
for (j = 0; j < poskus[i].meritevn - 1; j++)
if (poskus[i].meritev[j].t_alpha <= ldbuf && poskus[i].meritev[j+1].t_alpha > ldbuf)
break;
cp++;
omer.h_alpha = strtold(cp, &cp);
omer.V_alpha = h2v(omer.h_alpha);
omer.F_g = 0.0005*9.81 /* teža plastenke */ + omer.V_alpha*9.81 /* teža vode */;
omer.F_alpha = omer.F_m > PRAG ? omer.F_m + omer.F_g : 0;
if (omer.F_alpha > poskus[i].F_alpha_max)
poskus[i].F_alpha_max = omer.F_alpha;
omer.F_teor = poskus[i].P_0*20000*pow((poskus[i].P_0*20000*((poskus[i].V_0+(poskus[i].V_0+0.005)*1)/poskus[i].V_0)), -1.4);
omer.F_teor = 1*3.141592*0.000016*(omer.F_teor-10000);
fgets(buf, 256, videof);
}
int intbuf = -1;
poskus[i].t_0 = 0;
for (int j = 0; j < poskus[i].meritevn; j++) {
if (intbuf != -1 && poskus[i].meritev[j].F_m < PRAG) {
poskus[i].t_m = poskus[i].meritev[j].t_alpha - poskus[i].meritev[intbuf].t_alpha;
poskus[i].F_alpha_avg = 0;
for (int k = intbuf; k <= j; k++) {
poskus[i].F_alpha_avg += poskus[i].meritev[k].F_alpha;
}
poskus[i].F_alpha_avg /= ((j-intbuf)+1) ? (j-intbuf)+1 : fprintf(stderr, "deljenje z nič pri %s\n", vagafn);
}
if (poskus[i].meritev[j].F_m > PRAG) {
intbuf /* pričetek intervala */ = j ? j - KOLNAZ : j;
poskus[i].t_0 = poskus[i].meritev[j].t_alpha;
}
if (poskus[i].meritev[j].F_alpha == -1) {
poskus[i].meritev[j].F_alpha = poskus[i].meritev[j].F_m - 0.0005*9.81;
poskus[i].meritev[j].F_g = 0.0005*9.81;
}
}
poskus[i].a_k = 0;
for (int j = 0; j < poskus[i].meritevn; j++) /* poor man's integral function */
poskus[i].a_k += poskus[i].meritev[j].F_alpha/(poskus[i].meritev[j].F_g/9.81);
for (int odmislimo = 0; odmislimo < 2; odmislimo ++) {
snprintf(outfn, 256, "%08d-%.1LfL-%dbar%s.csv", poskus[i].id, poskus[i].V_0, poskus[i].P_0, odmislimo ? "-odmislimo" : "");
FILE * outf = fopen(outfn, "w");
if (!outf) {
fprintf(stderr, "ni uspelo odpreti za pisanje datoteke %s\n", outfn);
continue;
}
t0 = -1;
for (int j = 0; j < poskus[i].meritevn; j++) {
if (poskus[i].meritev[j].F_m >= PRAG || (!odmislimo && (t0 != -1 && poskus[i].meritev[j].V_alpha > 0))) {
if (t0 == -1)
t0 = poskus[i].meritev[j].t_alpha;
fprintf(outf, "%d,%Lf,%Lf,%Lf,%Lf,%Lf,%Lf,%d\n",
poskus[i].meritev[j].t_alpha - t0,
poskus[i].meritev[j].F_m,
poskus[i].meritev[j].h_alpha,
poskus[i].meritev[j].F_alpha,
poskus[i].meritev[j].V_alpha,
poskus[i].meritev[j].F_g,
poskus[i].meritev[j].F_teor,
poskus[i].meritev[j].t_alpha
);
/*
else
fprintf(outf, "%d,,,,,,,\n", poskus[i].meritev[j].t_alpha);
*/
}
}
fclose(outf);
}
fclose(vagaf);
fclose(videof);
fprintf(stdout, "%d,%.1Lf,%d,%Lf,%Lf,%Lf,%Lf\n",
poskus[i].id, poskus[i].V_0, poskus[i].P_0, poskus[i].a_k, poskus[i].t_m, poskus[i].F_alpha_avg, poskus[i].F_alpha_max);
i++;
}
/* closedir(videod); */
closedir(vagad);
}