Files
gaoguangpu/src/SensorIS11.cpp
2026-05-07 09:05:57 +08:00

1349 lines
43 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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