1349 lines
43 KiB
C++
1349 lines
43 KiB
C++
#include<SensorIS11.h>
|
||
#include"servo.h"
|
||
Ds1302 ds1302_date(0, 8, 7);
|
||
Ds1302::DateTime sys_time;
|
||
|
||
struct IS11_datastruct IS11_datastruct_fanshelv;
|
||
|
||
STRSensorInfo SensorIS11::initSensor()
|
||
{
|
||
// IS1Sensor.SetPortName(id);
|
||
|
||
radiance_struct_up.shutter = 1;
|
||
radiance_struct_down.shutter = 1;
|
||
|
||
for (uint32_t i = 0; i < 2048; i++)
|
||
{
|
||
radiance_struct_up.gain[i] = 1;
|
||
radiance_struct_down.gain[i] = 1;
|
||
radiance_struct_up.offset[i] = 0;
|
||
radiance_struct_down.offset[i] = 0;
|
||
}
|
||
SensorInfo.BandNum = 2048;
|
||
SensorInfo.maxValue = 65535;
|
||
uint8_t buff[4];
|
||
String path2 = "/system/index.bin";
|
||
File file;
|
||
if(SD_MMC.exists(path2))
|
||
{
|
||
file = SD_MMC.open(path2,"rb");
|
||
file.read(buff,4);
|
||
file.flush();
|
||
file.close();
|
||
memcpy(&index,buff,4);
|
||
|
||
write_log(log_path,"index is " + String(index),10);
|
||
}
|
||
|
||
return SensorInfo=GetSensorInfo();
|
||
// return SensorInfo;
|
||
// return true;
|
||
}
|
||
|
||
STRSensorInfo SensorIS11::GetSensorInfo()
|
||
{
|
||
// Serial.println("init ok");
|
||
// write_log(log_path,"init isSensorInit",10);
|
||
STRSensorInfo setem;
|
||
if (!isSensorInit())
|
||
{
|
||
// Serial.println("sensor is 123123");
|
||
// write_log(log_path,"sensor is 123123",10);
|
||
return setem;
|
||
}
|
||
|
||
|
||
// write_log(log_path,"init ok",10);
|
||
int retlenth= SendGetSensorInfo((u_char *)GET_SERIAL_NUMBER,sizeof(GET_SERIAL_NUMBER));
|
||
vTaskDelay(100);
|
||
// write_log(log_path,String(retlenth),10);
|
||
|
||
char * result=new char[retlenth];
|
||
memcpy(result,DataRetrun+3,retlenth);
|
||
//result[4]='\0';
|
||
// std::string str11(result);
|
||
// setem.serialnumber = str11;
|
||
setem.serialnumber = String(result);
|
||
delete[] result;
|
||
// Serial.println(String(setem.serialnumber.c_str()));
|
||
|
||
// write_log(log_path,"serialnumber :"+String(setem.serialnumber.c_str()),10);
|
||
// write_log(log_path,"serialnumber :"+setem.serialnumber,10);
|
||
retlenth= SendGetSensorInfo((u_char *)GET_PRODUCT_NAME,sizeof(GET_PRODUCT_NAME));
|
||
vTaskDelay(100);
|
||
result=new char[retlenth];
|
||
memcpy(result,DataRetrun+3,retlenth);
|
||
// vTaskDelay(500);
|
||
|
||
// result[4]='\0';
|
||
// std::string str1(result);
|
||
// write_log(log_path,"productname :"+String(setem.SensorName.c_str()),10);
|
||
|
||
setem.SensorName = String(result);
|
||
// write_log(log_path,"productname :"+setem.SensorName,10);
|
||
|
||
delete result;
|
||
setem.BandNum=2048;
|
||
// Serial.println(String(setem.SensorName.c_str())+"_"+String(setem.serialnumber.c_str()));
|
||
// write_log(log_path,String(setem.SensorName.c_str())+"_"+String(setem.serialnumber.c_str()),10);
|
||
|
||
setem.maxValue=65535;
|
||
setem.wavelenthlist = new float[setem.BandNum]();
|
||
retlenth= SendGetSensorInfo((u_char *)GET_WAVELENTH_COEFF,sizeof(GET_WAVELENTH_COEFF));
|
||
vTaskDelay(100);
|
||
float a[4];
|
||
memcpy(a,DataRetrun+3,16);
|
||
|
||
// write_log(log_path,"CoverLittleAndBig",10);
|
||
CoverLittleAndBig((char *)a,4*sizeof(float));
|
||
int bandsss= setem.BandNum;
|
||
#ifdef ARDUINO
|
||
|
||
|
||
// Serial.print("a0:");
|
||
// Serial.print(a[0]);
|
||
// Serial.print(" a1:");
|
||
// Serial.print(a[1]);
|
||
// Serial.print(" a2:");
|
||
// Serial.print(a[2]);
|
||
// Serial.print(" a3:");
|
||
// Serial.println(a[3]);
|
||
// write_log(log_path,"ARDUINO",10);
|
||
// write_log(log_path,"a0:"+String(a[0])+" a1:"+String(a[1])+" a2:"+String(a[2])+" a3:"+String(a[3]),10);
|
||
|
||
#endif
|
||
setem.a1=a[0];
|
||
setem.a2=a[1];
|
||
setem.a3=a[2];
|
||
setem.a4=a[3];
|
||
for ( int i = 1; i <=bandsss ; i++)
|
||
{
|
||
setem.wavelenthlist[i-1] = a[0] * i*i*i + a[1] * i*i + a[2] * i + a[3];
|
||
setem.WavelenthStr=setem.WavelenthStr+String( setem.wavelenthlist[i-1]).c_str()+",";
|
||
}
|
||
// vTaskDelay(500);
|
||
// Serial.write(dataretrun,retlenth);
|
||
// memcpy(a,dataretrun+)
|
||
u_char temp[2]={0x00,0x01};
|
||
retlenth=SendSettingCommand((u_char*)SET_AVERAGE_NUMBER,sizeof(SET_AVERAGE_NUMBER),temp,sizeof(temp));
|
||
// Serial.println("init ok");
|
||
|
||
return setem;
|
||
}
|
||
|
||
//shutter1 1关 2开
|
||
void SensorIS11::SetShutter(int id)
|
||
{
|
||
switch (id) {
|
||
case 1:{ //关
|
||
digitalWrite(5,LOW);
|
||
vTaskDelay(200);
|
||
break;
|
||
}
|
||
case 2:{ //开
|
||
digitalWrite(5,HIGH);
|
||
vTaskDelay(200);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//0下 1上
|
||
void SensorIS11::servo_direction(int direction)
|
||
{
|
||
switch (direction)
|
||
{
|
||
case 0:{
|
||
// servo_set_angle(12);
|
||
servo_down();
|
||
vTaskDelay(1500);
|
||
break;
|
||
}
|
||
case 1:{
|
||
// servo_set_angle(200);
|
||
servo_up();
|
||
vTaskDelay(1500);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
///这获取到的是4096的那个数组
|
||
void SensorIS11::GetOneDate(int msc)
|
||
{
|
||
if (msc!=shutternow)
|
||
{
|
||
u_char shutter[2];
|
||
shutter[0]=msc/256;
|
||
shutter[1]=msc%256;
|
||
SendSettingCommand((u_char *) SET_INTEGRAL_TIME,sizeof(SET_INTEGRAL_TIME),shutter,sizeof(shutter));
|
||
}
|
||
shutternow=msc;
|
||
|
||
size_t retsize= SendGetData(shutternow);
|
||
//DATABUFF 4096 需要输出的数据
|
||
memcpy(DATABUFF,DataRetrun+4,4096);
|
||
shortLittletoBiG(DATABUFF, SensorInfo.BandNum*2);
|
||
}
|
||
|
||
|
||
//获取SHUTTER时间,返回的是最大值
|
||
// int SensorIS11::OptSnenser(int persent)
|
||
// {
|
||
// long maxtime = 20000;
|
||
// int maxvalue=SensorInfo.maxValue*1.0*persent / 100;
|
||
// int maxvaluenow = 0;
|
||
// static float shutternow = 100;
|
||
// GetOneDate(100);
|
||
// maxvaluenow= Getmaxvalue(DATABUFF, SensorInfo.BandNum);
|
||
// // Serial.print("now Shutter is :");
|
||
// // Serial.print(shutternow);
|
||
// // Serial.print(" maxvalue is :");
|
||
// // Serial.println(maxvaluenow);
|
||
// // write_log(log_path,"now Shutter is :"+String(shutternow)+" maxvalue is :"+String(maxvaluenow),10);
|
||
|
||
// static int numberoftry;
|
||
// write_log(log_path,"numberoftry is :"+String(numberoftry),10);
|
||
// while (maxvaluenow<maxvalue*0.95 || maxvaluenow>maxvalue) {
|
||
// if(numberoftry == 0) shutternow = 100;
|
||
// if (maxvaluenow > maxvalue)
|
||
// {
|
||
// shutternow = shutternow *0.7;
|
||
// }
|
||
// else
|
||
// {
|
||
// shutternow = maxvalue * 0.98 / (maxvaluenow * 1.0)*shutternow + 1;
|
||
// }
|
||
// if (shutternow > maxtime)
|
||
// {
|
||
// shutternow = maxtime;
|
||
// break;
|
||
// }
|
||
// GetOneDate(shutternow);
|
||
// maxvaluenow= Getmaxvalue(DATABUFF, SensorInfo.BandNum);
|
||
// #ifdef ARDUINO
|
||
// // Serial.print("now Shutter is :");
|
||
// // Serial.print(shutternow);
|
||
// // Serial.print(" maxvalue is :");
|
||
// // Serial.println(maxvaluenow);
|
||
// // write_log(log_path,"now Shutter is :"+String(shutternow)+" maxvalue is :"+String(maxvaluenow),10);
|
||
// #endif
|
||
// numberoftry++;
|
||
// if (numberoftry > 200)
|
||
// {
|
||
// numberoftry = 1;
|
||
// return maxtime;
|
||
// }
|
||
// if (shutternow == maxtime)
|
||
// {
|
||
|
||
// return maxtime;
|
||
// }
|
||
// vTaskDelay(1);
|
||
// }
|
||
// #ifdef ARDUINO
|
||
// // Serial.print("zi dong value:");
|
||
// // Serial.println(shutternow);
|
||
// write_log(log_path,"zi dong value:"+String(shutternow),10);
|
||
// #endif
|
||
// if (shutternow<0)
|
||
// {
|
||
// shutternow=maxtime;
|
||
// /* code */
|
||
// }
|
||
// write_log(log_path,"Finish OptSnenser",10);
|
||
// shutternow = shutternow;
|
||
// return shutternow;
|
||
// }
|
||
|
||
|
||
int SensorIS11::OptSnenser(int persent)
|
||
{
|
||
long maxtime = 20000;
|
||
int minvalue=(float)SensorInfo.maxValue * ((float)persent / 100.f);
|
||
int maxvalue=(float)SensorInfo.maxValue * 0.95;
|
||
int maxvaluenow = 0;
|
||
int shutternow = 100;
|
||
GetOneDate(shutternow);
|
||
maxvaluenow= Getmaxvalue(DATABUFF, SensorInfo.BandNum);
|
||
|
||
int numberoftry = 0;
|
||
while (maxvaluenow<minvalue || maxvaluenow>maxvalue)
|
||
{
|
||
if (maxvaluenow > maxvalue)
|
||
{
|
||
shutternow = shutternow *0.7;
|
||
}
|
||
else
|
||
{
|
||
shutternow = ((float)maxvalue / (float)(maxvaluenow)) *shutternow + 1;
|
||
}
|
||
|
||
if (shutternow > maxtime)
|
||
{
|
||
shutternow = maxtime;
|
||
break;
|
||
}
|
||
GetOneDate(shutternow);
|
||
maxvaluenow = Getmaxvalue(DATABUFF, SensorInfo.BandNum);
|
||
#ifdef ARDUINO
|
||
|
||
#endif
|
||
numberoftry++;
|
||
if (numberoftry > 200)
|
||
{
|
||
numberoftry = 1;
|
||
return maxtime;
|
||
}
|
||
|
||
if (shutternow == maxtime)
|
||
{
|
||
return maxtime;
|
||
}
|
||
vTaskDelay(1);
|
||
}
|
||
#ifdef ARDUINO
|
||
write_log(log_path,"zi dong value:"+String(shutternow),10);
|
||
#endif
|
||
if (shutternow<0)
|
||
{
|
||
shutternow=maxtime;
|
||
/* code */
|
||
}
|
||
write_log(log_path,"Finish OptSnenser",10);
|
||
shutternow = shutternow;
|
||
return shutternow;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void SensorIS11::shortLittletoBiG(unsigned short *data,int lenth)
|
||
{
|
||
CoverLittleAndBig((char *)data,lenth);
|
||
}
|
||
|
||
|
||
int SensorIS11::Getmaxvalue(unsigned short *data,int lenth)
|
||
{
|
||
int ret=-1;
|
||
for (int i = 0; i < lenth; ++i) {
|
||
if (data[i]>ret){
|
||
ret=data[i];
|
||
}
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
|
||
struct IS11_datastruct IS11_datastruct_up;
|
||
struct IS11_datastruct IS11_datastruct_down;
|
||
struct IS11_datastruct IS11_datastruct_dark_up;
|
||
struct IS11_datastruct IS11_datastruct_dark_down;
|
||
|
||
void SensorIS11::TakeOneJob1(bool dingbing)
|
||
{
|
||
ds1302_date.getDateTime(&sys_time);
|
||
// String path = "/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)+ "/"+ String(sys_time.hour) + "-" + String(sys_time.minute) + "-" + String(sys_time.second) + ".bin";
|
||
String time = String(sys_time.year) +"."+ String(sys_time.month) +"."+ String(sys_time.day)+" "+String(sys_time.hour)+":"+String(sys_time.minute)+":"+String(sys_time.second);
|
||
write_log(log_path,time,20);
|
||
write_log(log_path,"start take one job.",20);
|
||
work_progress = 0 ;
|
||
float temp[8];
|
||
getall_temp(temp);
|
||
//opt_up opt_down dark_up dn_up dn_down dark_down
|
||
|
||
//1 opt_up
|
||
servo_direction(1);
|
||
SetShutter(2);
|
||
shutterup=OptSnenser(70);
|
||
SetShutter(1);
|
||
work_progress = 15;
|
||
|
||
//2 opt_down
|
||
servo_direction(0);
|
||
SetShutter(2);
|
||
shutterdown=OptSnenser(70);
|
||
SetShutter(1);
|
||
work_progress = 30;
|
||
|
||
//3 dark_up
|
||
SetShutter(1);
|
||
GetOneDate(shutterup);
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastruct_dark_up.data[i] = DATABUFF[i];
|
||
}
|
||
|
||
IS11_datastruct_dark_up.type = 0;
|
||
IS11_datastruct_dark_up.direction = 2;
|
||
IS11_datastruct_dark_up.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_dark_up.year = sys_time.year;
|
||
IS11_datastruct_dark_up.month = sys_time.month;
|
||
IS11_datastruct_dark_up.day = sys_time.day;
|
||
IS11_datastruct_dark_up.hour = sys_time.hour;
|
||
IS11_datastruct_dark_up.minute = sys_time.minute;
|
||
IS11_datastruct_dark_up.second = sys_time.second;
|
||
IS11_datastruct_dark_up.shutter_time = shutterup;
|
||
IS11_datastruct_dark_up.index = index;
|
||
memcpy(IS11_datastruct_dark_up.temprature,temp,8*sizeof(float));
|
||
work_progress = 45;
|
||
|
||
//4 dn_up
|
||
servo_direction(1);
|
||
SetShutter(2);
|
||
GetOneDate(shutterup);
|
||
SetShutter(1);
|
||
SensorInfo.BandNum = 2048;
|
||
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastruct_up.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_up.type = 0;
|
||
IS11_datastruct_up.direction = 0;
|
||
IS11_datastruct_up.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_up.year = sys_time.year;
|
||
IS11_datastruct_up.month = sys_time.month;
|
||
IS11_datastruct_up.day = sys_time.day;
|
||
IS11_datastruct_up.hour = sys_time.hour;
|
||
IS11_datastruct_up.minute = sys_time.minute;
|
||
IS11_datastruct_up.second = sys_time.second;
|
||
IS11_datastruct_up.shutter_time = shutterup;
|
||
IS11_datastruct_up.index = index;
|
||
memcpy(IS11_datastruct_up.temprature,temp,8*sizeof(float));
|
||
work_progress = 60;
|
||
|
||
//5 dn_down
|
||
servo_direction(0);
|
||
SetShutter(2);
|
||
GetOneDate(shutterdown);
|
||
SetShutter(1);
|
||
|
||
for (int i = 0; i < SensorInfo.BandNum;i++) {
|
||
IS11_datastruct_down.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_down.type = 0;
|
||
IS11_datastruct_down.direction = 1;
|
||
IS11_datastruct_down.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_down.year = sys_time.year;
|
||
IS11_datastruct_down.month = sys_time.month;
|
||
IS11_datastruct_down.day = sys_time.day;
|
||
IS11_datastruct_down.hour = sys_time.hour;
|
||
IS11_datastruct_down.minute = sys_time.minute;
|
||
IS11_datastruct_down.second = sys_time.second;
|
||
IS11_datastruct_down.shutter_time = shutterdown;
|
||
IS11_datastruct_down.index = index;
|
||
memcpy(IS11_datastruct_down.temprature,temp,8*sizeof(float));
|
||
work_progress = 75;
|
||
|
||
//6 dark_down
|
||
SetShutter(1);
|
||
GetOneDate(shutterdown);
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastruct_dark_down.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_dark_down.type = 0;
|
||
IS11_datastruct_dark_down.direction = 3;
|
||
IS11_datastruct_dark_down.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_dark_down.year = sys_time.year;
|
||
IS11_datastruct_dark_down.month = sys_time.month;
|
||
IS11_datastruct_dark_down.day = sys_time.day;
|
||
IS11_datastruct_dark_down.hour = sys_time.hour;
|
||
IS11_datastruct_dark_down.minute = sys_time.minute;
|
||
IS11_datastruct_dark_down.second = sys_time.second;
|
||
IS11_datastruct_dark_down.shutter_time = shutterdown;
|
||
IS11_datastruct_dark_down.index = index;
|
||
memcpy(IS11_datastruct_dark_down.temprature,temp,8*sizeof(float));
|
||
servo_off();
|
||
work_progress = 90;
|
||
//save data to file
|
||
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year));
|
||
}
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month));
|
||
}
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day));
|
||
}
|
||
String path1 = "/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)+ "/"+ String(sys_time.hour) + "-" + String(sys_time.minute) + "-" + String(sys_time.second);
|
||
sdcard::Mkdir(path1);
|
||
|
||
String path2 = path1 + "/up.bin";
|
||
File file;
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *)(&IS11_datastruct_up),sizeof(IS11_datastruct));
|
||
file.flush();
|
||
file.close();
|
||
work_progress = 92;
|
||
|
||
path2 = path1 + "/dark_up.bin";
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *)(&IS11_datastruct_dark_up),sizeof(IS11_datastruct));
|
||
file.flush();
|
||
file.close();
|
||
work_progress = 94;
|
||
|
||
path2 = path1 + "/down.bin";
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *)(&IS11_datastruct_down),sizeof(IS11_datastruct));
|
||
file.flush();
|
||
file.close();
|
||
work_progress = 96;
|
||
|
||
path2 = path1 + "/dark_down.bin";
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *)(&IS11_datastruct_dark_down),sizeof(IS11_datastruct));
|
||
file.flush();
|
||
file.close();
|
||
|
||
index++;
|
||
work_progress = 100 ;
|
||
IS11_datastruct_fanshelv.NCa = 0;
|
||
write_log(log_path,"take one job end.",20);
|
||
}
|
||
|
||
void SensorIS11::TakeOneJob()
|
||
{
|
||
index++;
|
||
ds1302_date.getDateTime(&sys_time);
|
||
String time = String(sys_time.year) +"."+ String(sys_time.month) +"."+ String(sys_time.day)+" "+String(sys_time.hour)+":"+String(sys_time.minute)+":"+String(sys_time.second);
|
||
write_log(log_path,time + " start take one job",10);
|
||
SensorInfo.BandNum = 2048;
|
||
work_progress = 0 ;
|
||
float temp[8];
|
||
getall_temp(temp);
|
||
//opt_up opt_down dark_up dn_up dn_down dark_down
|
||
// write_log(log_path,"start take one jon",20);
|
||
// write_log(log_path,"start",10);
|
||
|
||
//1 opt_up
|
||
#if SHUTTER_TYPE == 1
|
||
servo_direction(1);
|
||
SetShutter(2);
|
||
#elif SHUTTER_TYPE == 2
|
||
shutter_up();
|
||
#endif
|
||
|
||
shutterup=OptSnenser(70);
|
||
shutterdown = shutterup;
|
||
|
||
|
||
#if SHUTTER_TYPE == 1
|
||
SetShutter(1);
|
||
#elif SHUTTER_TYPE == 2
|
||
shutter_off();
|
||
#endif
|
||
work_progress = 30;
|
||
|
||
//2 dark
|
||
//dark_up
|
||
#if SHUTTER_TYPE == 1
|
||
SetShutter(1);
|
||
#elif SHUTTER_TYPE == 2
|
||
shutter_up();
|
||
#endif
|
||
|
||
GetOneDate(shutterup);
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastruct_dark_up.data[i] = DATABUFF[i];
|
||
IS11_datastruct_dark_down.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_dark_up.type = 0;
|
||
IS11_datastruct_dark_up.direction = 2;
|
||
IS11_datastruct_dark_up.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_dark_up.year = sys_time.year;
|
||
IS11_datastruct_dark_up.month = sys_time.month;
|
||
IS11_datastruct_dark_up.day = sys_time.day;
|
||
IS11_datastruct_dark_up.hour = sys_time.hour;
|
||
IS11_datastruct_dark_up.minute = sys_time.minute;
|
||
IS11_datastruct_dark_up.second = sys_time.second;
|
||
IS11_datastruct_dark_up.shutter_time = shutterup;
|
||
IS11_datastruct_dark_up.index = index;
|
||
memcpy(IS11_datastruct_dark_up.temprature,temp,8*sizeof(float));
|
||
|
||
// dark_down
|
||
IS11_datastruct_dark_down.type = 0;
|
||
IS11_datastruct_dark_down.direction = 3;
|
||
IS11_datastruct_dark_down.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_dark_down.year = sys_time.year;
|
||
IS11_datastruct_dark_down.month = sys_time.month;
|
||
IS11_datastruct_dark_down.day = sys_time.day;
|
||
IS11_datastruct_dark_down.hour = sys_time.hour;
|
||
IS11_datastruct_dark_down.minute = sys_time.minute;
|
||
IS11_datastruct_dark_down.second = sys_time.second;
|
||
IS11_datastruct_dark_down.shutter_time = shutterdown;
|
||
IS11_datastruct_dark_down.index = index;
|
||
memcpy(IS11_datastruct_dark_down.temprature,temp,8*sizeof(float));
|
||
|
||
work_progress = 45;
|
||
|
||
//3 dn_up
|
||
#if SHUTTER_TYPE == 1
|
||
SetShutter(2);
|
||
GetOneDate(shutterup);
|
||
SetShutter(1);
|
||
#elif SHUTTER_TYPE == 2
|
||
shutter_up();
|
||
GetOneDate(shutterup);
|
||
shutter_off();
|
||
#endif
|
||
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastruct_up.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_up.type = 0;
|
||
IS11_datastruct_up.direction = 0;
|
||
IS11_datastruct_up.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_up.year = sys_time.year;
|
||
IS11_datastruct_up.month = sys_time.month;
|
||
IS11_datastruct_up.day = sys_time.day;
|
||
IS11_datastruct_up.hour = sys_time.hour;
|
||
IS11_datastruct_up.minute = sys_time.minute;
|
||
IS11_datastruct_up.second = sys_time.second;
|
||
IS11_datastruct_up.shutter_time = shutterup;
|
||
IS11_datastruct_up.index = index;
|
||
memcpy(IS11_datastruct_up.temprature,temp,8*sizeof(float));
|
||
work_progress = 60;
|
||
|
||
//4 dn_down
|
||
|
||
#if SHUTTER_TYPE == 1
|
||
servo_direction(0);
|
||
SetShutter(2);
|
||
GetOneDate(shutterdown);
|
||
SetShutter(1);
|
||
#elif SHUTTER_TYPE == 2
|
||
shutter_down();
|
||
GetOneDate(shutterup);
|
||
shutter_off();
|
||
#endif
|
||
|
||
for (int i = 0; i < SensorInfo.BandNum;i++) {
|
||
IS11_datastruct_down.data[i] = DATABUFF[i];
|
||
}
|
||
IS11_datastruct_down.type = 0;
|
||
IS11_datastruct_down.direction = 1;
|
||
IS11_datastruct_down.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_down.year = sys_time.year;
|
||
IS11_datastruct_down.month = sys_time.month;
|
||
IS11_datastruct_down.day = sys_time.day;
|
||
IS11_datastruct_down.hour = sys_time.hour;
|
||
IS11_datastruct_down.minute = sys_time.minute;
|
||
IS11_datastruct_down.second = sys_time.second;
|
||
IS11_datastruct_down.shutter_time = shutterdown;
|
||
IS11_datastruct_down.index = index;
|
||
memcpy(IS11_datastruct_down.temprature,temp,8*sizeof(float));
|
||
servo_off();
|
||
work_progress = 75;
|
||
|
||
write_log(log_path,"start SD.",10);
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year));
|
||
}
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month));
|
||
}
|
||
if(!SD_MMC.exists("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day)))
|
||
{
|
||
sdcard::Mkdir("/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day));
|
||
}
|
||
String path1 = "/guangpu_data/"+ String(sys_time.year) + "/" + String(sys_time.month) + "/" + String(sys_time.day);
|
||
|
||
// sdcard::Mkdir(path1);
|
||
|
||
String path2 = path1 + "/" + String(sys_time.hour) + "-" + String(sys_time.minute) + "-" + String(sys_time.second) + ".bin";
|
||
File file;
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *)(&IS11_datastruct_up),sizeof(IS11_datastruct));
|
||
file.write((uint8_t *)(&IS11_datastruct_dark_up),sizeof(IS11_datastruct));
|
||
file.write((uint8_t *)(&IS11_datastruct_down),sizeof(IS11_datastruct));
|
||
file.write((uint8_t *)(&IS11_datastruct_dark_down),sizeof(IS11_datastruct));
|
||
file.flush();
|
||
file.close();
|
||
work_progress = 90;
|
||
|
||
|
||
path2 = "/system/index.bin";
|
||
file = SD_MMC.open(path2,"wb");
|
||
file.write((uint8_t *) &index,4);
|
||
file.flush();
|
||
file.close();
|
||
|
||
|
||
work_progress = 100;
|
||
IS11_datastruct_fanshelv.NCa = 0;
|
||
write_log(log_path,"take one job end.",10);
|
||
}
|
||
|
||
|
||
SensorIS11::SensorIS11()
|
||
{
|
||
shutternow = 0;
|
||
DataRetrun = GetDataBufferPTR();
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
void SensorIS11::send_dn(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure,uint32_t fengbao_num)
|
||
{
|
||
int32_t send_lenth;
|
||
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
|
||
|
||
if(fengbao_num >= 1)
|
||
{
|
||
u_char *data_buff = new u_char[960+1];
|
||
data_buff[0] = fengbao_num;
|
||
uint32_t x = sizeof(IS11_datastruct) / 960;
|
||
uint32_t n = 960;
|
||
if(fengbao_num == x+1)
|
||
{
|
||
data_buff[0] = fengbao_num | 0x80;
|
||
n = sizeof(IS11_datastruct) % 960;
|
||
}
|
||
memcpy(data_buff+1,(uint8_t *)IS11_datastructure+960*(fengbao_num-1),n);
|
||
send_lenth = IRIS_Protocol_Pack(0x02,n+1,data_buff,send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
delete data_buff;
|
||
}
|
||
else
|
||
{
|
||
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)IS11_datastructure,send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
}
|
||
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)IS11_datastructure,send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
delete send_buff;
|
||
vTaskDelay(50);
|
||
}
|
||
|
||
|
||
void SensorIS11::send_radiance(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure,uint32_t fengbao_num)
|
||
{
|
||
struct IS11_datastruct IS11_datastruct_send = *IS11_datastructure;
|
||
int32_t send_lenth;
|
||
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
|
||
IS11_datastruct_send.type = 0x01;
|
||
if(fengbao_num <= 1 )
|
||
{
|
||
if(IS11_datastructure == &IS11_datastruct_up)
|
||
{
|
||
for (int i = 0; i < 2048;i++)
|
||
{
|
||
IS11_datastruct_send.data[i] = IS11_datastruct_send.data[i] / IS11_datastruct_send.shutter_time * radiance_struct_up.shutter * radiance_struct_up.gain[i] - radiance_struct_up.offset[i];
|
||
}
|
||
}
|
||
else if(IS11_datastructure == &IS11_datastruct_down)
|
||
{
|
||
for (int i = 0; i < 2048;i++)
|
||
{
|
||
IS11_datastruct_send.data[i] = IS11_datastruct_send.data[i] / IS11_datastruct_send.shutter_time * radiance_struct_down.shutter * radiance_struct_down.gain[i] - radiance_struct_down.offset[i];
|
||
}
|
||
}
|
||
}
|
||
|
||
if(fengbao_num >= 1)
|
||
{
|
||
// uint32_t n= 960;
|
||
// if(fengbao_num == 8) n = 568;
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,n,(uint8_t *)(&IS11_datastruct_send) + 960*(fengbao_num-1),send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
|
||
u_char *data_buff = new u_char[960+1];
|
||
data_buff[0] = fengbao_num;
|
||
uint32_t x = sizeof(IS11_datastruct) / 960;
|
||
uint32_t n = 960;
|
||
if(fengbao_num == x+1)
|
||
{
|
||
data_buff[0] = fengbao_num | 0x80;
|
||
n = sizeof(IS11_datastruct) % 960;
|
||
}
|
||
memcpy(data_buff+1,(uint8_t *)(&IS11_datastruct_send)+960*(fengbao_num-1),n);
|
||
send_lenth = IRIS_Protocol_Pack(0x02,n+1,data_buff,send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
delete data_buff;
|
||
}
|
||
else
|
||
{
|
||
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_send),send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
}
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_send),send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
delete send_buff;
|
||
vTaskDelay(50);
|
||
}
|
||
|
||
|
||
void SensorIS11::send_chongcaiyang(HardwareSerial *wb485Serial,IS11_datastruct *IS11_datastructure,uint32_t fengbao_num)
|
||
{
|
||
struct IS11_datastruct IS11_datastruct_send = *IS11_datastructure;
|
||
int32_t send_lenth;
|
||
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
|
||
IS11_datastruct_send.type = 0x02;
|
||
|
||
if(fengbao_num <= 1 )
|
||
{
|
||
const int numValues = 2048;
|
||
float xValues[2048];
|
||
float *yValues = IS11_datastructure->data;
|
||
for (uint32_t i = 0; i < 2048; i++)
|
||
{
|
||
xValues[i] = SensorInfo.a1 * i * i * i + SensorInfo.a2 * i * i + SensorInfo.a3 * i+ SensorInfo.a4;
|
||
}
|
||
|
||
if(chongcaiyang_step <= 0.5)
|
||
{
|
||
chongcaiyang_step = 0.5;
|
||
}
|
||
|
||
float xValue_target = ceil(SensorInfo.a4);
|
||
float xValue_stop = SensorInfo.a1 * 2047 *2047*2047 + SensorInfo.a2 *2047*2047 + SensorInfo.a3 *2047 + SensorInfo.a4;
|
||
|
||
|
||
uint32_t b = 0;
|
||
while(xValue_target < xValue_stop)
|
||
{
|
||
IS11_datastruct_send.data[b] = CatmullSpline(xValues, yValues, numValues, xValue_target);
|
||
b++;
|
||
xValue_target += chongcaiyang_step;
|
||
}
|
||
|
||
for(uint32_t c = b; c < 2048; c++)
|
||
{
|
||
IS11_datastruct_send.data[c] = 0;
|
||
}
|
||
IS11_datastruct_send.index = b+1;
|
||
}
|
||
|
||
if(fengbao_num >= 1)
|
||
{
|
||
// uint32_t n= 960;
|
||
// if(fengbao_num == 8) n = 568;
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,n,(uint8_t *)(&IS11_datastruct_send) + 960*(fengbao_num-1),send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
|
||
u_char *data_buff = new u_char[960+1];
|
||
data_buff[0] = fengbao_num;
|
||
uint32_t x = sizeof(IS11_datastruct) / 960;
|
||
uint32_t n = 960;
|
||
if(fengbao_num == x+1)
|
||
{
|
||
data_buff[0] = fengbao_num | 0x80;
|
||
n = sizeof(IS11_datastruct) % 960;
|
||
}
|
||
memcpy(data_buff+1,(uint8_t *)(&IS11_datastruct_send)+960*(fengbao_num-1),n);
|
||
send_lenth = IRIS_Protocol_Pack(0x02,n+1,data_buff,send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
delete data_buff;
|
||
}
|
||
else
|
||
{
|
||
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_send),send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
}
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_send),send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
|
||
delete send_buff;
|
||
vTaskDelay(50);
|
||
}
|
||
|
||
|
||
|
||
|
||
void SensorIS11::get_fanshelv()
|
||
{
|
||
IS11_datastruct_fanshelv.type = 0x06;
|
||
IS11_datastruct_fanshelv.direction = IS11_datastruct_up.direction;
|
||
IS11_datastruct_fanshelv.tuigan_stat = IS11_datastruct_up.tuigan_stat;
|
||
IS11_datastruct_fanshelv.year = IS11_datastruct_up.year;
|
||
IS11_datastruct_fanshelv.month = IS11_datastruct_up.month;
|
||
IS11_datastruct_fanshelv.day = IS11_datastruct_up.day;
|
||
IS11_datastruct_fanshelv.minute = IS11_datastruct_up.minute;
|
||
IS11_datastruct_fanshelv.hour = IS11_datastruct_up.hour;
|
||
IS11_datastruct_fanshelv.second = IS11_datastruct_up.second;
|
||
IS11_datastruct_fanshelv.NCa = IS11_datastruct_up.NCa;
|
||
IS11_datastruct_fanshelv.NCb = IS11_datastruct_up.NCb;
|
||
IS11_datastruct_fanshelv.NCc = IS11_datastruct_up.NCc;
|
||
// IS11_datastruct_fanshelv.NCc = 0;
|
||
IS11_datastruct_fanshelv.shutter_time = IS11_datastruct_up.shutter_time;
|
||
IS11_datastruct_fanshelv.index = IS11_datastruct_up.index;
|
||
for(int i = 0; i < 8;i++)
|
||
{
|
||
IS11_datastruct_fanshelv.temprature[i] = IS11_datastruct_up.temprature[i];
|
||
}
|
||
for (int i = 0; i < 2048;i++)
|
||
{
|
||
IS11_datastruct_fanshelv.data[i] = (IS11_datastruct_down.data[i] - IS11_datastruct_dark_down.data[i]) / (IS11_datastruct_up.data[i] - IS11_datastruct_dark_up.data[i]);
|
||
if(fanshelv_struct.shutter == 1)
|
||
{
|
||
IS11_datastruct_fanshelv.data[i] =IS11_datastruct_fanshelv.data[i]*fanshelv_struct.gain[i];
|
||
}
|
||
}
|
||
// Serial0.println("fanshelv");
|
||
Serial0.printf("fanshelv_struct.data[%d] = %f\n",1,IS11_datastruct_fanshelv.data[0]);
|
||
Serial0.printf("fanshelv_struct.data[%d] = %f\n",2047,IS11_datastruct_fanshelv.data[2047]);
|
||
IS11_datastruct_fanshelv.NCa = 1;
|
||
}
|
||
|
||
|
||
// void SensorIS11::send_fanshelv(HardwareSerial *wb485Serial)
|
||
// {
|
||
// if(IS11_datastruct_fanshelv.NCa == 0)
|
||
// {
|
||
// get_fanshelv();
|
||
// }
|
||
|
||
// int32_t send_lenth;
|
||
// u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
|
||
|
||
// send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_fanshelv),send_buff);
|
||
// wb485Serial->write(send_buff,send_lenth);
|
||
// delete send_buff;
|
||
// vTaskDelay(50);
|
||
// }
|
||
|
||
void SensorIS11::send_fanshelv(HardwareSerial * wb485Serial,uint32_t fengbao_num)
|
||
{
|
||
if(fengbao_num <= 1)
|
||
{
|
||
if(IS11_datastruct_fanshelv.NCa == 0)
|
||
{
|
||
get_fanshelv();
|
||
}
|
||
}
|
||
|
||
int32_t send_lenth;
|
||
u_char *send_buff = new u_char[sizeof(IS11_datastruct) + 7];
|
||
if(fengbao_num >= 1)
|
||
{
|
||
u_char *data_buff = new u_char[960+1];
|
||
data_buff[0] = fengbao_num;
|
||
uint32_t x = sizeof(IS11_datastruct) / 960;
|
||
uint32_t n = 960;
|
||
if(fengbao_num == x+1)
|
||
{
|
||
data_buff[0] = fengbao_num | 0x80;
|
||
n = sizeof(IS11_datastruct) % 960;
|
||
}
|
||
memcpy(data_buff+1,(uint8_t *)(&IS11_datastruct_fanshelv)+960*(fengbao_num-1),n);
|
||
send_lenth = IRIS_Protocol_Pack(0x02,n+1,data_buff,send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
delete data_buff;
|
||
}
|
||
else
|
||
{
|
||
send_lenth = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), (uint8_t *)(&IS11_datastruct_fanshelv),send_buff);
|
||
wb485Serial->write(send_buff,send_lenth);
|
||
}
|
||
|
||
delete send_buff;
|
||
vTaskDelay(50);
|
||
}
|
||
|
||
|
||
void SensorIS11::calculation(float bochang1,float bochang2)
|
||
{
|
||
if(IS11_datastruct_fanshelv.NCa == 0)
|
||
{
|
||
get_fanshelv();
|
||
}
|
||
|
||
float xValues[2048];
|
||
float *yValues = IS11_datastruct_fanshelv.data;
|
||
const int numValues = 2048;
|
||
for(uint32_t i = 0; i < 2048; i++)
|
||
{
|
||
xValues[i] = SensorInfo.a1 * i * i * i + SensorInfo.a2 * i * i + SensorInfo.a3 * i+ SensorInfo.a4;
|
||
}
|
||
float R1 = CatmullSpline(xValues, yValues, numValues, bochang1);
|
||
float R2 = CatmullSpline(xValues, yValues, numValues, bochang2);
|
||
|
||
calculation_value = (R1 - R2) / (R1 + R2);
|
||
}
|
||
|
||
|
||
|
||
|
||
//send_data_type 0x00 DN类型 只回传up、down、up_darknoise、down_darknoise
|
||
//send_data_type 0x01 DN类型 只回传up、down
|
||
//send_data_type 0x02 DN类型 只回传up
|
||
//send_data_type 0x03 DN类型 只回传down
|
||
//send_data_type 0x04 DN类型 只回传up_darknosie
|
||
//send_data_type 0x05 DN类型 只回传down_darknoise
|
||
//send_data_type 0x06 DN类型 只回传dark (这个dark主要是在高级模式下才有,高级模式下dark不用区分方向)
|
||
|
||
|
||
//send_data_type 0x10 radiance类型 只回传up、down和DN类型的 up_darknoise、down_darknoise
|
||
//send_data_type 0x11 radiance类型 只回传up、down
|
||
//send_data_type 0x12 radiance类型 只回传up
|
||
//send_data_type 0x13 radiance类型 只回传down
|
||
//send_data_type 0x14 radiance类型 反射率
|
||
|
||
//send_data_type 0x20 重采样值 只回传up、down和DN类型的 up_darknoise、down_darknoise
|
||
//send_data_type 0x21 重采样值 只回传up、down
|
||
//send_data_type 0x22 重采样值 只回传up
|
||
//send_data_type 0x23 重采样值 只回传down
|
||
//send_data_type 0x24 重采样值 只回传up_darknosie
|
||
//send_data_type 0x25 重采样值 只回传down_darknoise
|
||
//send_data_type 0x26 重采样值 只回传dark (这个dark主要是在高级模式下才有,高级模式下dark不用区分方向)
|
||
|
||
void SensorIS11::senddata(HardwareSerial *wb485Serial,u_int32_t send_data_type,uint32_t fengbao_num)
|
||
{
|
||
switch (send_data_type)
|
||
{
|
||
case 0X00:
|
||
send_dn(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_down, fengbao_num);
|
||
break;
|
||
case 0X01:
|
||
send_dn(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X02:
|
||
send_dn(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
break;
|
||
case 0X03:
|
||
send_dn(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X04:
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
break;
|
||
case 0X05:
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_down, fengbao_num);
|
||
break;
|
||
|
||
case 0X10:
|
||
send_radiance(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_radiance(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
send_dn(wb485Serial,&IS11_datastruct_dark_down, fengbao_num);
|
||
break;
|
||
case 0X11:
|
||
send_radiance(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_radiance(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X12:
|
||
send_radiance(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
break;
|
||
case 0X13:
|
||
send_radiance(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X14:
|
||
send_fanshelv(wb485Serial,fengbao_num);
|
||
// send_fanshelv(wb485Serial);
|
||
break;
|
||
|
||
case 0X20:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_dark_down, fengbao_num);
|
||
break;
|
||
case 0X21:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X22:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_up, fengbao_num);
|
||
break;
|
||
case 0X23:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_down, fengbao_num);
|
||
break;
|
||
case 0X24:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
break;
|
||
case 0X25:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_dark_down, fengbao_num);
|
||
break;
|
||
case 0X26:
|
||
send_chongcaiyang(wb485Serial,&IS11_datastruct_dark_up, fengbao_num);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
///
|
||
|
||
|
||
|
||
/*
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
高级模式
|
||
支持选择采集的方向,up、down、dark
|
||
是否自动扣除暗电流
|
||
不支持自动曝光,
|
||
平均次数
|
||
|
||
|
||
direction 0:up 1:down 2:dark
|
||
shutter_time 使用指定时间曝光 单位毫秒 最大时长30秒 必须大于0
|
||
remove_dark 0:不扣除 1:扣除
|
||
collect_times 采集次数
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
*/
|
||
void SensorIS11::advanced_mode(u_int32_t direction,u_int32_t shutter_time,u_int32_t collect_times,u_int32_t remove_dark)
|
||
{
|
||
|
||
work_progress = 0;
|
||
struct IS11_datastruct *IS11_datastructure_avn = nullptr;
|
||
switch (direction)
|
||
{
|
||
case 0:
|
||
servo_direction(1);
|
||
SetShutter(2);
|
||
IS11_datastructure_avn = &IS11_datastruct_up;
|
||
break;
|
||
case 1:
|
||
servo_direction(0);
|
||
SetShutter(2);
|
||
IS11_datastructure_avn = &IS11_datastruct_down;
|
||
break;
|
||
case 2:
|
||
SetShutter(1);
|
||
IS11_datastructure_avn = &IS11_datastruct_dark_up;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
int aa = collect_times;
|
||
uint32_t caiji_times = 0;
|
||
memset(IS11_datastructure_avn->data,0,8192);
|
||
getall_temp(IS11_datastructure_avn->temprature);
|
||
ds1302_date.getDateTime(&sys_time);
|
||
IS11_datastructure_avn->year = sys_time.year;
|
||
IS11_datastructure_avn->month = sys_time.month;
|
||
IS11_datastructure_avn->day = sys_time.day;
|
||
IS11_datastructure_avn->hour = sys_time.hour;
|
||
IS11_datastructure_avn->minute = sys_time.minute;
|
||
IS11_datastructure_avn->second = sys_time.second;
|
||
|
||
while(aa > 0)
|
||
{
|
||
work_progress = (caiji_times * 100) / (collect_times * 2) ;
|
||
|
||
GetOneDate(shutter_time);
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastructure_avn->data[i] += DATABUFF[i];
|
||
}
|
||
IS11_datastructure_avn->type = 0;
|
||
IS11_datastructure_avn->direction = direction;
|
||
IS11_datastructure_avn->tuigan_stat = get_tuigan_status();
|
||
IS11_datastructure_avn->shutter_time = shutter_time;
|
||
IS11_datastructure_avn->index = index;
|
||
|
||
if(remove_dark == 1 && direction != 2)
|
||
{
|
||
|
||
// write_log(log_path,"remove_dark",10);
|
||
SetShutter(1);
|
||
GetOneDate(shutter_time);
|
||
SetShutter(2);
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
// if (i==1000)
|
||
// {
|
||
// write_log(log_path,"or data:"+String(IS11_datastructure_avn->data[i])+ " darkdata:"+String(DATABUFF[i]),10);
|
||
|
||
// /* code */
|
||
// }
|
||
IS11_datastructure_avn->data[i] -= DATABUFF[i];
|
||
IS11_datastruct_dark_up.data[i] = DATABUFF[i];
|
||
}
|
||
|
||
IS11_datastruct_dark_up.type = 0;
|
||
IS11_datastruct_dark_up.direction = 2;
|
||
IS11_datastruct_dark_up.tuigan_stat = get_tuigan_status();
|
||
IS11_datastruct_dark_up.shutter_time = shutter_time;
|
||
IS11_datastruct_dark_up.index = index;
|
||
// getall_temp(IS11_datastruct_dark_up.temprature);
|
||
}
|
||
aa--;
|
||
caiji_times++;
|
||
}
|
||
for (int i = 0; i < SensorInfo.BandNum;i++)
|
||
{
|
||
IS11_datastructure_avn->data[i] = IS11_datastructure_avn->data[i] / collect_times;
|
||
}
|
||
SetShutter(1);
|
||
servo_off();
|
||
IS11_datastruct_fanshelv.NCa = 0;
|
||
work_progress = 100;
|
||
}
|
||
|
||
/*
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
opt
|
||
方向有up、down、dark
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
*/
|
||
void SensorIS11::opt(u_int32_t direction)
|
||
{
|
||
switch (direction)
|
||
{
|
||
case 0:
|
||
// servo_direction(1);
|
||
SetShutter(2);
|
||
break;
|
||
case 1:
|
||
// servo_direction(0);
|
||
SetShutter(2);
|
||
break;
|
||
case 2:
|
||
SetShutter(1);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
work_progress = 50;
|
||
dingbiao_shutter = OptSnenser(70);
|
||
work_progress = 100;
|
||
SetShutter(1);
|
||
}
|
||
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
void SensorIS11::save_dingbiao(uint8_t * data)
|
||
{
|
||
IS11_datastruct *IS11_datastructure = (IS11_datastruct *)data;
|
||
float ab = 0;
|
||
write_log(log_path,"save_dingbiao",10);
|
||
write_log(log_path,"direction:"+String(IS11_datastructure->direction),10);
|
||
write_log(log_path,"type:"+String(IS11_datastructure->type),10);
|
||
if(IS11_datastructure->direction == 0) //up
|
||
{
|
||
if (IS11_datastructure->type == 4)
|
||
{
|
||
radiance_struct_up.shutter = IS11_datastructure->shutter_time;
|
||
write_log(log_path,"shutter_time:"+String(IS11_datastructure->shutter_time),10);
|
||
for (int i = 0; i < BANDNUMBER;i++)
|
||
{
|
||
radiance_struct_up.gain[i] = IS11_datastructure->data[i];
|
||
}
|
||
ab = IS11_datastructure->data[0] * 1000000;
|
||
write_log(log_path,"gain:"+String(ab),10);
|
||
}
|
||
else if (IS11_datastructure->type == 5)
|
||
{
|
||
for (int i = 0; i < BANDNUMBER;i++)
|
||
{
|
||
radiance_struct_up.offset[i] = IS11_datastructure->data[i];
|
||
}
|
||
write_log(log_path,"offset:"+String(IS11_datastructure->data[0]),10);
|
||
}
|
||
else if (IS11_datastructure->type == 6)
|
||
{
|
||
for (int i = 0; i < BANDNUMBER;i++)
|
||
{
|
||
fanshelv_struct.shutter = 1;
|
||
fanshelv_struct.gain[i] = IS11_datastructure->data[i];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
}
|
||
else if(IS11_datastructure->direction == 1) //down
|
||
{
|
||
if (IS11_datastructure->type == 4)
|
||
{
|
||
radiance_struct_down.shutter = IS11_datastructure->shutter_time;
|
||
write_log(log_path,"shutter_time:"+String(IS11_datastructure->shutter_time),10);
|
||
for (int i = 0; i < BANDNUMBER;i++)
|
||
{
|
||
radiance_struct_down.gain[i] = IS11_datastructure->data[i];
|
||
}
|
||
ab = IS11_datastructure->data[0] * 1000000;
|
||
write_log(log_path,"gain:"+String(ab),10);
|
||
}
|
||
else if (IS11_datastructure->type == 5)
|
||
{
|
||
for (int i = 0; i < BANDNUMBER;i++)
|
||
{
|
||
radiance_struct_down.offset[i] = IS11_datastructure->data[i];
|
||
}
|
||
write_log(log_path,"offset:"+String(IS11_datastructure->data[0]),10);
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
/*
|
||
////////////////////////////
|
||
波长 序列号x 能量值
|
||
=a1*x^3+a2*x^2+a3*x+a4 0 1111
|
||
|
||
|
||
DC
|
||
暗电流测量的目的 设备本身的干扰 主要受到温度的影响
|
||
测试不同的波长对应的能量
|
||
|
||
DN
|
||
通过光栅将光分解为不同的波长 然后照射到CCD上
|
||
CCD的将不同波长的能量采集出来转换为DN值
|
||
|
||
|
||
opt 最佳曝光的时长
|
||
采集到的能量和曝光时间有关
|
||
CCD采集能量的最好范围是 70%到90%之间是线性的 可信度最高 准确率最好
|
||
*/
|
||
|
||
|
||
/*
|
||
Radiance = DN / shuttertime * shutter * a -b;
|
||
|
||
|
||
|
||
*/
|
||
|
||
|
||
|
||
|
||
|
||
//send_data_type 0x02 DN类型 只回传up
|
||
//send_data_type 0x03 DN类型 只回传down
|
||
//send_data_type 0x04 DN类型 只回传up_darknosie
|
||
//send_data_type 0x05 DN类型 只回传down_darknoise
|
||
|
||
//send_data_type 0x12 radiance类型 只回传up
|
||
//send_data_type 0x13 radiance类型 只回传down
|
||
//send_data_type 0x14 radiance类型 反射率
|
||
|
||
//send_data_type 0x22 重采样值 只回传up
|
||
//send_data_type 0x23 重采样值 只回传down
|