code cleanup, reduce global and shared data structures
This commit is contained in:
parent
c653d72cf4
commit
5cfad502f7
4 changed files with 180 additions and 130 deletions
109
cam-thread.c
109
cam-thread.c
|
@ -22,10 +22,6 @@
|
||||||
|
|
||||||
// from main thread
|
// from main thread
|
||||||
void update_fb(void);
|
void update_fb(void);
|
||||||
//extern unsigned char *fbdata;
|
|
||||||
extern gboolean flir_run;
|
|
||||||
extern unsigned char *color_palette;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -53,31 +49,18 @@ extern unsigned char *color_palette;
|
||||||
#define PRODUCT_ID 0x1996
|
#define PRODUCT_ID 0x1996
|
||||||
|
|
||||||
static struct libusb_device_handle *devh = NULL;
|
static struct libusb_device_handle *devh = NULL;
|
||||||
//int filecount=0;
|
|
||||||
struct timeval t1, t2;
|
|
||||||
long long fps_t;
|
|
||||||
|
|
||||||
double t_min = 0.0;
|
static int FFC = 0; // detect FFC
|
||||||
double t_max = 0.0;
|
|
||||||
double t_center = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
int FFC = 0; // detect FFC
|
|
||||||
|
|
||||||
// -- buffer for EP 0x85 chunks ---------------
|
// -- buffer for EP 0x85 chunks ---------------
|
||||||
#define BUF85SIZE 1048576 // size got from android app
|
#define BUF85SIZE 1048576 // size got from android app
|
||||||
int buf85pointer = 0;
|
static int buf85pointer = 0;
|
||||||
unsigned char buf85[BUF85SIZE];
|
static unsigned char buf85[BUF85SIZE];
|
||||||
|
static unsigned char fb_proc[160*120]; //, fb_proc2[160*120*3];
|
||||||
extern unsigned char *jpeg_buffer;
|
|
||||||
extern unsigned int jpeg_size;
|
|
||||||
extern unsigned char *ir_buffer;
|
|
||||||
extern double emissivity;
|
|
||||||
extern double tempreflected;
|
|
||||||
|
|
||||||
|
|
||||||
struct shutter_state_t shutter_state;
|
|
||||||
struct battery_state_t battery_state;
|
static struct t_data_t *tdata;
|
||||||
|
|
||||||
// EP81 device status message (JSON)
|
// EP81 device status message (JSON)
|
||||||
// {
|
// {
|
||||||
|
@ -115,33 +98,33 @@ parse_status(unsigned char *buf)
|
||||||
res = cJSON_GetObjectItemCaseSensitive(status_json, "shutterState");
|
res = cJSON_GetObjectItemCaseSensitive(status_json, "shutterState");
|
||||||
if (cJSON_IsString(res) && (res->valuestring != NULL)) {
|
if (cJSON_IsString(res) && (res->valuestring != NULL)) {
|
||||||
if (strncmp(res->valuestring,"FFC",3)==0) {
|
if (strncmp(res->valuestring,"FFC",3)==0) {
|
||||||
shutter_state.shutterState=sFFC;
|
tdata->shutter_state.shutterState=sFFC;
|
||||||
} else if (strncmp(res->valuestring,"ON",2)==0) {
|
} else if (strncmp(res->valuestring,"ON",2)==0) {
|
||||||
shutter_state.shutterState=sON;
|
tdata->shutter_state.shutterState=sON;
|
||||||
} else {
|
} else {
|
||||||
shutter_state.shutterState=sUNKNOWN;
|
tdata->shutter_state.shutterState=sUNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res = cJSON_GetObjectItemCaseSensitive(status_json, "shutterTemperature");
|
res = cJSON_GetObjectItemCaseSensitive(status_json, "shutterTemperature");
|
||||||
if (cJSON_IsNumber(res)) {
|
if (cJSON_IsNumber(res)) {
|
||||||
shutter_state.shutterTemperature=res->valuedouble;
|
tdata->shutter_state.shutterTemperature=res->valuedouble;
|
||||||
}
|
}
|
||||||
res = cJSON_GetObjectItemCaseSensitive(status_json, "usbNotifiedTimestamp");
|
res = cJSON_GetObjectItemCaseSensitive(status_json, "usbNotifiedTimestamp");
|
||||||
if (cJSON_IsNumber(res)) {
|
if (cJSON_IsNumber(res)) {
|
||||||
shutter_state.usbNotifiedTimestamp=res->valuedouble;
|
tdata->shutter_state.usbNotifiedTimestamp=res->valuedouble;
|
||||||
}
|
}
|
||||||
res = cJSON_GetObjectItemCaseSensitive(status_json, "usbEnqueuedTimestamp");
|
res = cJSON_GetObjectItemCaseSensitive(status_json, "usbEnqueuedTimestamp");
|
||||||
if (cJSON_IsNumber(res)) {
|
if (cJSON_IsNumber(res)) {
|
||||||
shutter_state.usbEnqueuedTimestamp=res->valuedouble;
|
tdata->shutter_state.usbEnqueuedTimestamp=res->valuedouble;
|
||||||
}
|
}
|
||||||
res = cJSON_GetObjectItemCaseSensitive(status_json, "ffcState");
|
res = cJSON_GetObjectItemCaseSensitive(status_json, "ffcState");
|
||||||
if (cJSON_IsString(res) && (res->valuestring != NULL)) {
|
if (cJSON_IsString(res) && (res->valuestring != NULL)) {
|
||||||
if (strncmp(res->valuestring,"FFC_VALID_RAD",13)==0) {
|
if (strncmp(res->valuestring,"FFC_VALID_RAD",13)==0) {
|
||||||
shutter_state.ffcState=FFC_VALID_RAD;
|
tdata->shutter_state.ffcState=FFC_VALID_RAD;
|
||||||
} else if (strncmp(res->valuestring,"FFC_PROGRESS",12)==0) {
|
} else if (strncmp(res->valuestring,"FFC_PROGRESS",12)==0) {
|
||||||
shutter_state.ffcState=FFC_PROGRESS;
|
tdata->shutter_state.ffcState=FFC_PROGRESS;
|
||||||
} else {
|
} else {
|
||||||
shutter_state.ffcState=FFC_UNKNOWN;
|
tdata->shutter_state.ffcState=FFC_UNKNOWN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,19 +151,19 @@ parse_config_in(unsigned char *buf)
|
||||||
if (strncmp(res->valuestring,"batteryVoltageUpdate",20)==0) {
|
if (strncmp(res->valuestring,"batteryVoltageUpdate",20)==0) {
|
||||||
res3 = cJSON_GetObjectItemCaseSensitive(res2, "voltage");
|
res3 = cJSON_GetObjectItemCaseSensitive(res2, "voltage");
|
||||||
if (cJSON_IsNumber(res3)) {
|
if (cJSON_IsNumber(res3)) {
|
||||||
battery_state.voltage = res3->valuedouble;
|
tdata->battery_state.voltage = res3->valuedouble;
|
||||||
// printf("bat %.2fV\n", res3->valuedouble);
|
// printf("bat %.2fV\n", res3->valuedouble);
|
||||||
}
|
}
|
||||||
res3 = cJSON_GetObjectItemCaseSensitive(res2, "percentage");
|
res3 = cJSON_GetObjectItemCaseSensitive(res2, "percentage");
|
||||||
if (cJSON_IsNumber(res3)) {
|
if (cJSON_IsNumber(res3)) {
|
||||||
battery_state.percentage = res3->valueint;
|
tdata->battery_state.percentage = res3->valueint;
|
||||||
// printf("bat %f%%\n", res3->valuedouble);
|
// printf("bat %f%%\n", res3->valuedouble);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strncmp(res->valuestring,"batteryChargingCurrentUpdate",28)==0) {
|
if (strncmp(res->valuestring,"batteryChargingCurrentUpdate",28)==0) {
|
||||||
res3 = cJSON_GetObjectItemCaseSensitive(res2, "chargingCurrent");
|
res3 = cJSON_GetObjectItemCaseSensitive(res2, "chargingCurrent");
|
||||||
if (cJSON_IsNumber(res3)) {
|
if (cJSON_IsNumber(res3)) {
|
||||||
battery_state.chargingCurrent = res3->valuedouble;
|
tdata->battery_state.chargingCurrent = res3->valuedouble;
|
||||||
// printf("bat %.2fV\n", res3->valuedouble);
|
// printf("bat %.2fV\n", res3->valuedouble);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,9 +185,9 @@ raw2temperature(unsigned short RAW)
|
||||||
// mystery correction factor
|
// mystery correction factor
|
||||||
RAW *=4;
|
RAW *=4;
|
||||||
// calc amount of radiance of reflected objects ( Emissivity < 1 )
|
// calc amount of radiance of reflected objects ( Emissivity < 1 )
|
||||||
double RAWrefl=PlanckR1/(PlanckR2*(exp(PlanckB/(tempreflected/*TempReflected*/+273.15))-PlanckF))-PlanckO;
|
double RAWrefl=PlanckR1/(PlanckR2*(exp(PlanckB/(tdata->tempreflected/*TempReflected*/+273.15))-PlanckF))-PlanckO;
|
||||||
// get displayed object temp max/min
|
// get displayed object temp max/min
|
||||||
double RAWobj=(RAW-(1-emissivity/*Emissivity*/)*RAWrefl)/emissivity/*Emissivity*/;
|
double RAWobj=(RAW-(1-tdata->emissivity/*Emissivity*/)*RAWrefl)/tdata->emissivity/*Emissivity*/;
|
||||||
// calc object temperature
|
// calc object temperature
|
||||||
|
|
||||||
return PlanckB/log(PlanckR1/(PlanckR2*(RAWobj+PlanckO))+PlanckF)-273.15;
|
return PlanckB/log(PlanckR1/(PlanckR2*(RAWobj+PlanckO))+PlanckF)-273.15;
|
||||||
|
@ -261,20 +244,17 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
|
||||||
parse_status(&buf85[28+ThermalSize+JpgSize]);
|
parse_status(&buf85[28+ThermalSize+JpgSize]);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i,v;
|
int v;
|
||||||
// get a full frame, first print the status
|
// get a full frame, first print the status
|
||||||
t1=t2;
|
|
||||||
gettimeofday(&t2, NULL);
|
|
||||||
buf85pointer=0;
|
buf85pointer=0;
|
||||||
|
|
||||||
unsigned short pix[160*120]; // original Flir 16 Bit RAW
|
unsigned short *pix=tdata->raw_ir_buffer; // original Flir 16 Bit RAW
|
||||||
int x, y;
|
int x, y;
|
||||||
unsigned char *fb_proc,*fb_proc2;
|
|
||||||
|
|
||||||
fb_proc = malloc(160 * 128); // 8 Bit gray buffer really needs only 160 x 120
|
// fb_proc = malloc(160 * 128); // 8 Bit gray buffer really needs only 160 x 120
|
||||||
memset(fb_proc, 128, 160*128); // sizeof(fb_proc) doesn't work, value depends from LUT
|
memset(fb_proc, 128, 160*120); // sizeof(fb_proc) doesn't work, value depends from LUT
|
||||||
|
|
||||||
fb_proc2 = malloc(160 * 128 * 3); // 8x8x8 Bit RGB buffer
|
//fb_proc2 = malloc(160 * 128 * 3); // 8x8x8 Bit RGB buffer
|
||||||
|
|
||||||
int min = 0x10000, max = 0;
|
int min = 0x10000, max = 0;
|
||||||
float rms = 0;
|
float rms = 0;
|
||||||
|
@ -321,33 +301,33 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
|
||||||
// calc medium of 2x2 center pixels
|
// calc medium of 2x2 center pixels
|
||||||
int med = (pix[59 * 160 + 79]+pix[59 * 160 + 80]+pix[60 * 160 + 79]+pix[60 * 160 + 80])/4;
|
int med = (pix[59 * 160 + 79]+pix[59 * 160 + 80]+pix[60 * 160 + 79]+pix[60 * 160 + 80])/4;
|
||||||
|
|
||||||
t_min = raw2temperature(min);
|
tdata->t_min = raw2temperature(min);
|
||||||
t_max = raw2temperature(max);
|
tdata->t_max = raw2temperature(max);
|
||||||
t_center = raw2temperature(med);
|
tdata->t_center = raw2temperature(med);
|
||||||
|
|
||||||
if (ir_buffer == NULL) {
|
if (tdata->ir_buffer == NULL) {
|
||||||
ir_buffer = (unsigned char *)malloc(640*480*4);
|
tdata->ir_buffer = (unsigned char *)malloc(640*480*4);
|
||||||
fprintf(stderr, "nb\n");
|
fprintf(stderr, "nb\n");
|
||||||
}
|
}
|
||||||
for (y = 0; y < 120; ++y) {
|
for (y = 0; y < 120; ++y) {
|
||||||
for (x = 0; x < 160; ++x) {
|
for (x = 0; x < 160; ++x) {
|
||||||
// fb_proc is the gray scale frame buffer
|
// fb_proc is the gray scale frame buffer
|
||||||
v=fb_proc[y * 160 + x] ; // unsigned char!!
|
v=fb_proc[y * 160 + x] ; // unsigned char!!
|
||||||
ir_buffer[4*y * 160 + x*4] =
|
tdata->ir_buffer[4*y * 160 + x*4] =
|
||||||
color_palette[3 * v + 2]; // B
|
tdata->color_palette[3 * v + 2]; // B
|
||||||
ir_buffer[(4*y * 160 + x*4)+1] =
|
tdata->ir_buffer[(4*y * 160 + x*4)+1] =
|
||||||
color_palette[3 * v + 1]; // G
|
tdata->color_palette[3 * v + 1]; // G
|
||||||
ir_buffer[(4*y * 160 + x*4)+2] =
|
tdata->ir_buffer[(4*y * 160 + x*4)+2] =
|
||||||
color_palette[3 * v]; // R
|
tdata->color_palette[3 * v]; // R
|
||||||
// ir_buffer[(4*y * 160 + x*4)+3] =
|
// ir_buffer[(4*y * 160 + x*4)+3] =
|
||||||
// 0x00; // A, empty
|
// 0x00; // A, empty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jpeg_size == 0 && JpgSize > 0) {
|
if (tdata->jpeg_size == 0 && JpgSize > 0) {
|
||||||
jpeg_size=JpgSize;
|
tdata->jpeg_size=JpgSize;
|
||||||
jpeg_buffer=(unsigned char *)malloc(jpeg_size);
|
tdata->jpeg_buffer=(unsigned char *)malloc(tdata->jpeg_size);
|
||||||
memcpy(jpeg_buffer, &buf85[28+ThermalSize], jpeg_size);
|
memcpy(tdata->jpeg_buffer, &buf85[28+ThermalSize], tdata->jpeg_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp ((char *)&buf85[28+ThermalSize+JpgSize+17],"FFC",3)==0) {
|
if (strncmp ((char *)&buf85[28+ThermalSize+JpgSize+17],"FFC",3)==0) {
|
||||||
|
@ -361,8 +341,8 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// free memory
|
// free memory
|
||||||
free(fb_proc); // thermal RAW
|
//free(fb_proc); // thermal RAW
|
||||||
free(fb_proc2); // visible jpg
|
//free(fb_proc2); // visible jpg
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -476,7 +456,7 @@ int r = 1;
|
||||||
int state = 1;
|
int state = 1;
|
||||||
// int ct=0;
|
// int ct=0;
|
||||||
|
|
||||||
while (flir_run) {
|
while (tdata->flir_run) {
|
||||||
switch(state) {
|
switch(state) {
|
||||||
case 1:
|
case 1:
|
||||||
/* Flir config
|
/* Flir config
|
||||||
|
@ -615,7 +595,6 @@ int r = 1;
|
||||||
// poll Endpoints 0x81, 0x83
|
// poll Endpoints 0x81, 0x83
|
||||||
r = libusb_bulk_transfer(devh, 0x81, buf, sizeof(buf), &actual_length, 10);
|
r = libusb_bulk_transfer(devh, 0x81, buf, sizeof(buf), &actual_length, 10);
|
||||||
if (actual_length > 16) {
|
if (actual_length > 16) {
|
||||||
int i;
|
|
||||||
unsigned int magic, second, len;
|
unsigned int magic, second, len;
|
||||||
|
|
||||||
magic=*(unsigned int *)&buf[0];
|
magic=*(unsigned int *)&buf[0];
|
||||||
|
@ -627,6 +606,7 @@ int r = 1;
|
||||||
parse_config_in(&buf[16]);
|
parse_config_in(&buf[16]);
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
|
int i;
|
||||||
for (i=0; i<actual_length; i++) {
|
for (i=0; i<actual_length; i++) {
|
||||||
if (buf[i] > 31 && buf[i]<128)
|
if (buf[i] > 31 && buf[i]<128)
|
||||||
fprintf(stderr, "%c", buf[i]);
|
fprintf(stderr, "%c", buf[i]);
|
||||||
|
@ -702,6 +682,7 @@ int r = 1;
|
||||||
|
|
||||||
gpointer cam_thread_main(gpointer user_data)
|
gpointer cam_thread_main(gpointer user_data)
|
||||||
{
|
{
|
||||||
|
tdata=(struct t_data_t *)user_data;
|
||||||
EPloop(NULL);
|
EPloop(NULL);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
15
cam-thread.h
15
cam-thread.h
|
@ -28,4 +28,19 @@ struct battery_state_t {
|
||||||
double chargingCurrent;
|
double chargingCurrent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct t_data_t {
|
||||||
|
unsigned short *raw_ir_buffer;
|
||||||
|
unsigned char *jpeg_buffer;
|
||||||
|
unsigned int jpeg_size;
|
||||||
|
unsigned char *ir_buffer;
|
||||||
|
double emissivity;
|
||||||
|
double tempreflected;
|
||||||
|
double t_min, t_max, t_center;
|
||||||
|
struct shutter_state_t shutter_state;
|
||||||
|
struct battery_state_t battery_state;
|
||||||
|
gboolean flir_run;
|
||||||
|
unsigned char *color_palette;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
182
flirgtk.c
182
flirgtk.c
|
@ -51,13 +51,13 @@ static cairo_surface_t *psurface;
|
||||||
static gboolean take_vis_shot=FALSE;
|
static gboolean take_vis_shot=FALSE;
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
int colorpalette=9;
|
static int colorpalette=9;
|
||||||
double emissivity=0.9;
|
|
||||||
double tempreflected=20.0;
|
|
||||||
|
|
||||||
static gboolean show_battery=TRUE;
|
static gboolean show_battery=TRUE;
|
||||||
static gboolean show_palette=TRUE;
|
static gboolean show_palette=TRUE;
|
||||||
static gboolean show_crosshair=TRUE;
|
static gboolean show_crosshair=TRUE;
|
||||||
|
static gboolean shot_store_visual=FALSE;
|
||||||
|
static gboolean shot_store_ir_raw=FALSE;
|
||||||
|
|
||||||
static double vis_surface_alpha=0.3;
|
static double vis_surface_alpha=0.3;
|
||||||
static double vis_surface_scaling=(1./2.25);
|
static double vis_surface_scaling=(1./2.25);
|
||||||
|
@ -69,24 +69,18 @@ static double vis_y_offset=0.;
|
||||||
gboolean pending=FALSE;
|
gboolean pending=FALSE;
|
||||||
gboolean ircam=TRUE;
|
gboolean ircam=TRUE;
|
||||||
gboolean viscam=FALSE;
|
gboolean viscam=FALSE;
|
||||||
gboolean flir_run = FALSE;
|
//gboolean flir_run = FALSE;
|
||||||
unsigned char *color_palette;
|
//unsigned char *color_palette;
|
||||||
|
|
||||||
gpointer cam_thread_main(gpointer user_data);
|
gpointer cam_thread_main(gpointer user_data);
|
||||||
|
|
||||||
extern double t_min, t_max, t_center;
|
// data structure shared with camera thread
|
||||||
extern struct shutter_state_t shutter_state;
|
static struct t_data_t tdata;
|
||||||
extern struct battery_state_t battery_state;
|
|
||||||
|
|
||||||
unsigned char *ir_buffer=NULL;
|
|
||||||
unsigned char *jpeg_buffer=NULL;
|
|
||||||
unsigned int jpeg_size=0;
|
|
||||||
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
configure_event (GtkWidget *widget,
|
configure_event (GtkWidget *widget, GdkEventConfigure *event, gpointer data)
|
||||||
GdkEventConfigure *event,
|
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
//GtkAllocation allocation;
|
//GtkAllocation allocation;
|
||||||
|
|
||||||
|
@ -119,9 +113,9 @@ char tdisp[16];
|
||||||
memset(fbdata,0,(640*20*4));
|
memset(fbdata,0,(640*20*4));
|
||||||
y=P_YPOS;
|
y=P_YPOS;
|
||||||
for (x=0; x<256; x++) {
|
for (x=0; x<256; x++) {
|
||||||
fbdata[4* y * 640 + ((x+P_XPOS)*4)] = color_palette[3 * x + 2]; // B
|
fbdata[4* y * 640 + ((x+P_XPOS)*4)] = tdata.color_palette[3 * x + 2]; // B
|
||||||
fbdata[(4* y * 640 + ((x+P_XPOS)*4))+1] = color_palette[3 * x + 1]; // G
|
fbdata[(4* y * 640 + ((x+P_XPOS)*4))+1] = tdata.color_palette[3 * x + 1]; // G
|
||||||
fbdata[(4* y * 640 + ((x+P_XPOS)*4))+2] = color_palette[3 * x]; // R
|
fbdata[(4* y * 640 + ((x+P_XPOS)*4))+2] = tdata.color_palette[3 * x]; // R
|
||||||
}
|
}
|
||||||
y=P_YPOS;
|
y=P_YPOS;
|
||||||
p1 = (unsigned int *)&fbdata[4 * y * 640 + (P_XPOS*4)]; // pointer to start of line
|
p1 = (unsigned int *)&fbdata[4 * y * 640 + (P_XPOS*4)]; // pointer to start of line
|
||||||
|
@ -131,7 +125,7 @@ char tdisp[16];
|
||||||
}
|
}
|
||||||
|
|
||||||
// update palette scale temperature range
|
// update palette scale temperature range
|
||||||
snprintf(tdisp, 16, "%.1f°C", t_min);
|
snprintf(tdisp, 16, "%.1f°C", tdata.t_min);
|
||||||
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
||||||
cairo_select_font_face (cr, "Sans",
|
cairo_select_font_face (cr, "Sans",
|
||||||
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
|
@ -139,7 +133,7 @@ char tdisp[16];
|
||||||
cairo_move_to (cr, 102, 16);
|
cairo_move_to (cr, 102, 16);
|
||||||
cairo_show_text (cr, tdisp);
|
cairo_show_text (cr, tdisp);
|
||||||
|
|
||||||
snprintf(tdisp, 16, "%.1f°C", t_max);
|
snprintf(tdisp, 16, "%.1f°C", tdata.t_max);
|
||||||
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
||||||
cairo_select_font_face (cr, "Sans",
|
cairo_select_font_face (cr, "Sans",
|
||||||
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
|
@ -183,6 +177,40 @@ int fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
store_raw_ir_shot(void)
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
struct tm *loctime;
|
||||||
|
char pname[PATH_MAX];
|
||||||
|
const char *tmp;
|
||||||
|
char fname[30];
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if (tdata.raw_ir_buffer == NULL) {
|
||||||
|
g_printerr("raw IR buffer == NULL\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
now = time(NULL);
|
||||||
|
loctime = localtime (&now);
|
||||||
|
strftime (fname, 30, "ir-%y%m%d%H%M%S", loctime);
|
||||||
|
|
||||||
|
tmp=g_get_user_special_dir(G_USER_DIRECTORY_PICTURES);
|
||||||
|
if (tmp == NULL)
|
||||||
|
tmp = "./";
|
||||||
|
strncpy(pname, tmp, PATH_MAX-30-4); // leave room for filename+extension
|
||||||
|
strncat(pname, "/", PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
||||||
|
strncat(pname, fname, PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
||||||
|
strncat(pname, ".raw", PATH_MAX-1); // -5 to leave space for trailing \0 byte + extension
|
||||||
|
|
||||||
|
fd=open(pname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
||||||
|
if (fd>=0) {
|
||||||
|
write (fd, (unsigned char *)tdata.raw_ir_buffer, 160*120*2);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
draw_event (GtkWidget *widget,
|
draw_event (GtkWidget *widget,
|
||||||
cairo_t *wcr,
|
cairo_t *wcr,
|
||||||
|
@ -200,8 +228,8 @@ cairo_t *cr;
|
||||||
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
|
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
|
||||||
|
|
||||||
// first draw the frame buffer containing the IR frame
|
// first draw the frame buffer containing the IR frame
|
||||||
if (ircam && ir_buffer!=NULL) {
|
if (ircam && tdata.ir_buffer!=NULL) {
|
||||||
ir_surface=cairo_image_surface_create_for_data (ir_buffer,
|
ir_surface=cairo_image_surface_create_for_data (tdata.ir_buffer,
|
||||||
CAIRO_FORMAT_RGB24,
|
CAIRO_FORMAT_RGB24,
|
||||||
160,
|
160,
|
||||||
120,
|
120,
|
||||||
|
@ -214,13 +242,13 @@ cairo_t *cr;
|
||||||
cairo_surface_destroy (ir_surface);
|
cairo_surface_destroy (ir_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jpeg_size != 0 && jpeg_buffer != NULL) {
|
if (tdata.jpeg_size != 0 && tdata.jpeg_buffer != NULL) {
|
||||||
if (take_vis_shot) {
|
if (take_vis_shot) {
|
||||||
take_vis_shot=FALSE;
|
take_vis_shot=FALSE;
|
||||||
store_vis_shot(jpeg_buffer, jpeg_size);
|
store_vis_shot(tdata.jpeg_buffer, tdata.jpeg_size);
|
||||||
}
|
}
|
||||||
if (viscam) {
|
if (viscam) {
|
||||||
jpeg_surface=cairo_image_surface_create_from_jpeg_mem(jpeg_buffer, jpeg_size);
|
jpeg_surface=cairo_image_surface_create_from_jpeg_mem(tdata.jpeg_buffer, tdata.jpeg_size);
|
||||||
cairo_save(cr);
|
cairo_save(cr);
|
||||||
cairo_scale (cr, vis_surface_scaling, vis_surface_scaling);
|
cairo_scale (cr, vis_surface_scaling, vis_surface_scaling);
|
||||||
cairo_set_source_surface (cr, jpeg_surface, vis_x_offset, vis_y_offset);
|
cairo_set_source_surface (cr, jpeg_surface, vis_x_offset, vis_y_offset);
|
||||||
|
@ -231,8 +259,8 @@ cairo_t *cr;
|
||||||
cairo_restore(cr);
|
cairo_restore(cr);
|
||||||
cairo_surface_destroy (jpeg_surface);
|
cairo_surface_destroy (jpeg_surface);
|
||||||
}
|
}
|
||||||
jpeg_size=0;
|
tdata.jpeg_size=0;
|
||||||
jpeg_buffer=NULL;
|
tdata.jpeg_buffer=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// then draw decoration on top
|
// then draw decoration on top
|
||||||
|
@ -267,7 +295,7 @@ cairo_t *cr;
|
||||||
cairo_stroke (cr);
|
cairo_stroke (cr);
|
||||||
|
|
||||||
// print center temperature near crosshair
|
// print center temperature near crosshair
|
||||||
snprintf(tdisp, 16, "%.1f°C", t_center);
|
snprintf(tdisp, 16, "%.1f°C", tdata.t_center);
|
||||||
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
||||||
cairo_select_font_face (cr, "Sans",
|
cairo_select_font_face (cr, "Sans",
|
||||||
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
|
@ -278,7 +306,7 @@ cairo_t *cr;
|
||||||
|
|
||||||
// print battery % top right
|
// print battery % top right
|
||||||
if (show_battery) {
|
if (show_battery) {
|
||||||
snprintf(tdisp, 16, "%d%%", battery_state.percentage);
|
snprintf(tdisp, 16, "%d%%", tdata.battery_state.percentage);
|
||||||
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
|
||||||
cairo_select_font_face (cr, "Sans",
|
cairo_select_font_face (cr, "Sans",
|
||||||
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
|
@ -328,8 +356,12 @@ const char *tmp;
|
||||||
strncat(pname, "/", PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
strncat(pname, "/", PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
||||||
strncat(pname, fname, PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
strncat(pname, fname, PATH_MAX-5); // -5 to leave space for trailing \0 byte + extension
|
||||||
strncat(pname, ".png", PATH_MAX-1); // -1 to leave space for trailing \0 byte
|
strncat(pname, ".png", PATH_MAX-1); // -1 to leave space for trailing \0 byte
|
||||||
|
|
||||||
cairo_surface_write_to_png (psurface, pname);
|
cairo_surface_write_to_png (psurface, pname);
|
||||||
|
|
||||||
|
if (shot_store_ir_raw)
|
||||||
|
store_raw_ir_shot();
|
||||||
|
|
||||||
|
if (shot_store_visual)
|
||||||
take_vis_shot=TRUE;
|
take_vis_shot=TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,12 +369,12 @@ void
|
||||||
start_clicked(GtkWidget *button, gpointer user_data)
|
start_clicked(GtkWidget *button, gpointer user_data)
|
||||||
{
|
{
|
||||||
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(play_button))) {
|
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(play_button))) {
|
||||||
flir_run = TRUE;
|
tdata.flir_run = TRUE;
|
||||||
memset(&shutter_state, 0, sizeof(shutter_state));
|
memset(&tdata.shutter_state, 0, sizeof(tdata.shutter_state));
|
||||||
memset(&battery_state, 0, sizeof(battery_state));
|
memset(&tdata.battery_state, 0, sizeof(tdata.battery_state));
|
||||||
if (ir_buffer == NULL)
|
if (tdata.ir_buffer == NULL)
|
||||||
g_printerr("ir_buffer\n");
|
g_printerr("ir_buffer\n");
|
||||||
g_thread_new ("CAM thread", cam_thread_main, NULL);
|
g_thread_new ("CAM thread", cam_thread_main, &tdata);
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(stop_button), FALSE);
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(stop_button), FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -351,7 +383,7 @@ void
|
||||||
stop_clicked(GtkWidget *button, gpointer user_data)
|
stop_clicked(GtkWidget *button, gpointer user_data)
|
||||||
{
|
{
|
||||||
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_button))) {
|
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(stop_button))) {
|
||||||
flir_run = FALSE;
|
tdata.flir_run = FALSE;
|
||||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(play_button), FALSE);
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(play_button), FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -378,8 +410,6 @@ static void
|
||||||
close_window (void)
|
close_window (void)
|
||||||
{
|
{
|
||||||
// clean up and quit
|
// clean up and quit
|
||||||
//window = NULL;
|
|
||||||
// gtk_main_quit();
|
|
||||||
// g_application_quit(gapp);
|
// g_application_quit(gapp);
|
||||||
gtk_application_remove_window(gapp, GTK_WINDOW(window));
|
gtk_application_remove_window(gapp, GTK_WINDOW(window));
|
||||||
}
|
}
|
||||||
|
@ -393,16 +423,16 @@ int act;
|
||||||
if (act < 0) {
|
if (act < 0) {
|
||||||
g_printerr("oops, palette selection = %d\n", act);
|
g_printerr("oops, palette selection = %d\n", act);
|
||||||
} else {
|
} else {
|
||||||
if (act == 0) color_palette = palette_7;
|
if (act == 0) tdata.color_palette = palette_7;
|
||||||
if (act == 1) color_palette = palette_15;
|
if (act == 1) tdata.color_palette = palette_15;
|
||||||
if (act == 2) color_palette = palette_17;
|
if (act == 2) tdata.color_palette = palette_17;
|
||||||
if (act == 3) color_palette = palette_85;
|
if (act == 3) tdata.color_palette = palette_85;
|
||||||
if (act == 4) color_palette = palette_92;
|
if (act == 4) tdata.color_palette = palette_92;
|
||||||
if (act == 5) color_palette = palette_Grayscale;
|
if (act == 5) tdata.color_palette = palette_Grayscale;
|
||||||
if (act == 6) color_palette = palette_Grey;
|
if (act == 6) tdata.color_palette = palette_Grey;
|
||||||
if (act == 7) color_palette = palette_Iron2;
|
if (act == 7) tdata.color_palette = palette_Iron2;
|
||||||
if (act == 8) color_palette = palette_Iron_Black;
|
if (act == 8) tdata.color_palette = palette_Iron_Black;
|
||||||
if (act == 9) color_palette = palette_Rainbow;
|
if (act == 9) tdata.color_palette = palette_Rainbow;
|
||||||
colorpalette=act;
|
colorpalette=act;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -410,13 +440,13 @@ int act;
|
||||||
void
|
void
|
||||||
emissivity_changed (GtkRange *range, gpointer user_data)
|
emissivity_changed (GtkRange *range, gpointer user_data)
|
||||||
{
|
{
|
||||||
emissivity=gtk_range_get_value (range);
|
tdata.emissivity=gtk_range_get_value (range);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
tempreflected_changed (GtkSpinButton *spin_button, gpointer user_data)
|
tempreflected_changed (GtkSpinButton *spin_button, gpointer user_data)
|
||||||
{
|
{
|
||||||
tempreflected=gtk_spin_button_get_value (spin_button);
|
tdata.tempreflected=gtk_spin_button_get_value (spin_button);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -472,7 +502,7 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
gtk_scale_add_mark (GTK_SCALE(w), 0.60, GTK_POS_BOTTOM, "half shiny");
|
gtk_scale_add_mark (GTK_SCALE(w), 0.60, GTK_POS_BOTTOM, "half shiny");
|
||||||
gtk_scale_add_mark (GTK_SCALE(w), 0.80, GTK_POS_TOP, "half matte");
|
gtk_scale_add_mark (GTK_SCALE(w), 0.80, GTK_POS_TOP, "half matte");
|
||||||
gtk_scale_add_mark (GTK_SCALE(w), 0.90, GTK_POS_BOTTOM, "matte");
|
gtk_scale_add_mark (GTK_SCALE(w), 0.90, GTK_POS_BOTTOM, "matte");
|
||||||
gtk_range_set_value(GTK_RANGE(w), emissivity);
|
gtk_range_set_value(GTK_RANGE(w), tdata.emissivity);
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
g_signal_connect (w, "value-changed",
|
g_signal_connect (w, "value-changed",
|
||||||
G_CALLBACK (emissivity_changed), NULL);
|
G_CALLBACK (emissivity_changed), NULL);
|
||||||
|
@ -481,7 +511,7 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
|
|
||||||
w=gtk_spin_button_new_with_range(-100.0, +100.0, 0.5);
|
w=gtk_spin_button_new_with_range(-100.0, +100.0, 0.5);
|
||||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), tempreflected);
|
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), tdata.tempreflected);
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
g_signal_connect (w, "value-changed",
|
g_signal_connect (w, "value-changed",
|
||||||
G_CALLBACK (tempreflected_changed), NULL);
|
G_CALLBACK (tempreflected_changed), NULL);
|
||||||
|
@ -510,6 +540,18 @@ show_crosshair_toggled (GtkToggleButton *togglebutton, gpointer user_data)
|
||||||
show_crosshair=gtk_toggle_button_get_active(togglebutton);
|
show_crosshair=gtk_toggle_button_get_active(togglebutton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
shot_visual_toggled (GtkToggleButton *togglebutton, gpointer user_data)
|
||||||
|
{
|
||||||
|
shot_store_visual=gtk_toggle_button_get_active(togglebutton);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
shot_ir_raw_toggled (GtkToggleButton *togglebutton, gpointer user_data)
|
||||||
|
{
|
||||||
|
shot_store_ir_raw=gtk_toggle_button_get_active(togglebutton);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ui_settings_activate (GSimpleAction *simple,
|
ui_settings_activate (GSimpleAction *simple,
|
||||||
GVariant *parameter,
|
GVariant *parameter,
|
||||||
|
@ -550,6 +592,18 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
g_signal_connect (w, "toggled",
|
g_signal_connect (w, "toggled",
|
||||||
G_CALLBACK (show_palette_toggled), NULL);
|
G_CALLBACK (show_palette_toggled), NULL);
|
||||||
|
|
||||||
|
w=gtk_check_button_new_with_label ("Shot store visual image");
|
||||||
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), shot_store_visual);
|
||||||
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
|
g_signal_connect (w, "toggled",
|
||||||
|
G_CALLBACK (shot_visual_toggled), NULL);
|
||||||
|
|
||||||
|
w=gtk_check_button_new_with_label ("Shot store raw IR image");
|
||||||
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), shot_store_ir_raw);
|
||||||
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
|
g_signal_connect (w, "toggled",
|
||||||
|
G_CALLBACK (shot_ir_raw_toggled), NULL);
|
||||||
|
|
||||||
gtk_widget_show_all(c);
|
gtk_widget_show_all(c);
|
||||||
gtk_dialog_run(GTK_DIALOG(dialog));
|
gtk_dialog_run(GTK_DIALOG(dialog));
|
||||||
gtk_widget_destroy(dialog);
|
gtk_widget_destroy(dialog);
|
||||||
|
@ -630,7 +684,7 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
w=gtk_label_new("X Offset");
|
w=gtk_label_new("X Offset");
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
|
|
||||||
w=gtk_spin_button_new_with_range(-100.0, +100.0, 1.);
|
w=gtk_spin_button_new_with_range(-200.0, +200.0, 1.);
|
||||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), vis_x_offset);
|
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), vis_x_offset);
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
g_signal_connect (w, "value-changed",
|
g_signal_connect (w, "value-changed",
|
||||||
|
@ -639,7 +693,7 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
w=gtk_label_new("Y Offset");
|
w=gtk_label_new("Y Offset");
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
|
|
||||||
w=gtk_spin_button_new_with_range(-100.0, +100.0, 1.);
|
w=gtk_spin_button_new_with_range(-200.0, +200.0, 1.);
|
||||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), vis_y_offset);
|
gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), vis_y_offset);
|
||||||
gtk_container_add (GTK_CONTAINER (vb), w);
|
gtk_container_add (GTK_CONTAINER (vb), w);
|
||||||
g_signal_connect (w, "value-changed",
|
g_signal_connect (w, "value-changed",
|
||||||
|
@ -654,10 +708,7 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
quit_activate
|
quit_activate (GSimpleAction *simple, GVariant *parameter, gpointer user_data)
|
||||||
(GSimpleAction *simple,
|
|
||||||
GVariant *parameter,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
{
|
||||||
close_window ();
|
close_window ();
|
||||||
}
|
}
|
||||||
|
@ -680,7 +731,7 @@ const GActionEntry entries[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// init default color palette
|
// init default color palette
|
||||||
color_palette = palette_Rainbow;
|
tdata.color_palette = palette_Rainbow;
|
||||||
|
|
||||||
// gappw=gtk_application_window_new(gapp);
|
// gappw=gtk_application_window_new(gapp);
|
||||||
// window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
// window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||||
|
@ -787,17 +838,20 @@ GtkWidget *widget;
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
tdata.ir_buffer = (unsigned char *)malloc(640*480*4);
|
||||||
|
tdata.raw_ir_buffer = (unsigned short *)malloc(169*120*2);
|
||||||
|
tdata.emissivity=0.9;
|
||||||
|
tdata.tempreflected=20.0;
|
||||||
|
tdata.t_min=0.0;
|
||||||
|
tdata.t_max=0.0;
|
||||||
|
tdata.t_center=0.0;
|
||||||
|
tdata.flir_run=FALSE;
|
||||||
|
|
||||||
gapp=gtk_application_new("org.gnome.flirgtk", G_APPLICATION_FLAGS_NONE);
|
gapp=gtk_application_new("org.gnome.flirgtk", G_APPLICATION_FLAGS_NONE);
|
||||||
// gtk_init(&argc, &argv);
|
|
||||||
|
|
||||||
//create_main_window();
|
|
||||||
g_signal_connect(gapp, "activate", G_CALLBACK (flirgtk_app_activate), NULL);
|
g_signal_connect(gapp, "activate", G_CALLBACK (flirgtk_app_activate), NULL);
|
||||||
|
|
||||||
g_application_run (G_APPLICATION (gapp), argc, argv);
|
g_application_run (G_APPLICATION (gapp), argc, argv);
|
||||||
g_object_unref (gapp);
|
g_object_unref (gapp);
|
||||||
|
|
||||||
// gtk_main();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
planck.h
2
planck.h
|
@ -19,7 +19,7 @@
|
||||||
#define PlanckR2 0.0125
|
#define PlanckR2 0.0125
|
||||||
|
|
||||||
// Reflected Apparent Temperature [°C]
|
// Reflected Apparent Temperature [°C]
|
||||||
#define TempReflected 20.0
|
#define TempReflected 22.0
|
||||||
|
|
||||||
// 0.01 to 0.99 on the emissivity scale.
|
// 0.01 to 0.99 on the emissivity scale.
|
||||||
// Highly polished metallic surfaces such as copper or aluminum usually have an emissivity below 0.10.
|
// Highly polished metallic surfaces such as copper or aluminum usually have an emissivity below 0.10.
|
||||||
|
|
Loading…
Reference in a new issue