#include"Define.h" #include #include #include #include #include #include #include //#include "MyWebServer.h" #include "SDmanger.h" //#include "HttpsOTAUpdate.h" #include "slave.h" #include "log.h" #include #include #include #include "IRIS_Method.h" #include "DS18B20.h" #include "Servo.h" #include "jiaresi.h" #include #include "servo.h" #include "SensorIS11.h" #include "tuigan.h" #include "beep.h" #include "My74HC595.h" #include "SolarCalculator.h" #define LOGGING #define wb485PORT_RX 3 #define wb485PORT_TX 2 #define MY74HC595_dataPin 35 #define MY74HC595_clockPin 33 #define MY74HC595_latchPin 34 #define IS1Serial_port 1 #define IS1Serial_RX 18 #define IS1Serial_TX 17 // u_char ret[17]; // Ticker ticker; /* 任务名:Task0 任务功能:光谱数据采集 */ TaskHandle_t Task0_Handler; void Task0(void *pvParameters); /* 任务名:Task1 任务功能:外设控制,加热 、推杆、舵机、温度采集、时间获取 */ TaskHandle_t Task1_Handler; void Task1(void *pvParameters); /* 任务名:Task2 任务功能:数据上传 */ TaskHandle_t Task2_Handler; void Task2(void *pvParameters); //work_mode 0:手动 1:时间模式 time_mode 2:高级模式 advanced_mode 3:low_power_mode //caiji_mode 0;停止 1:单次 2:连续 3:定标 4:高级模式 5:回传数据 6:低功耗模式 //atuo_return 0:不自动返回 1:自动返回 //return_mode 设置返回模式 暂时没用 //return_data_type 详情见你懂的O.o //time_interval 时间间隔不能等于0; //caiji_state 0 :未采集(no) 1:采集完成(finish) 2:采集中(working) //dingbiao_time 0自动曝光 非0使用这个时长曝光 volatile u_int32_t work_mode = 0,caiji_mode = 0,return_mode = 1,atuo_return = 0,return_data_type = 0x00,time_interval = 60 * 2,caiji_state = 0 ,db_shutter,db_avn; volatile float start_time = 9.0,stop_time = 15.30,maximum_temperature = 40,Minimum_temperature = 0,bc_b1,bc_b2,bc_b3,bc_b4; /// @brief 高级模式参数 // advanced_direction 0:up 1:down 2:dark // advanced_shutter_time 曝光时间 // advanced_collect_times 采集次数 // advanced_remove_dark 0:不去暗 1:去暗 volatile u_int32_t advanced_direction=0,advanced_shutter_time=0,advanced_collect_times=0,advanced_remove_dark=0; u_int32_t timeOut = 10000; // SoftwareSerial *wb485port; SemaphoreHandle_t xMutexInventory = NULL; //创建信号量Handler //json DynamicJsonDocument doc(1024);//接收串口json DynamicJsonDocument sys_sd_doc(1024);//读取系统json DynamicJsonDocument ds18b20_doc(1024);//读取ds18b20 json void json_command(); void sys_info_init(); //////ds1302时间///////// Ds1302 rtc(0, 8, 7); Ds1302::DateTime now; bool sys_set_time(uint32_t year,uint32_t month,uint32_t day); // const static char* WeekDays[] = // { // "Monday", // "Tuesday", // "Wednesday", // "Thursday", // "Friday", // "Saturday", // "Sunday" // }; struct IS11_datastruct *IS11_datastructure; //////is11///////// SensorIS11 *is11Sensor; STRSensorInfo STRSensorInfos_structure; // SoftwareSerial *IS1Serial; HardwareSerial *IS1Serial; //原来 HardwareSerial wb485Serial(0); size_t serialwrite(u_char* data,size_t lenth) { // return IS1Serial->write(data,lenth); while (IS1Serial->available() > 0) { IS1Serial->read(); } int rec=IS1Serial->write(data,lenth); return rec; } size_t serialread(u_char *data, size_t lenth) { lenth=IS1Serial->available(); if (lenth<=0 ) { /* code */ return 0; } int lenthofread = IS1Serial->readBytes(data,lenth); return lenthofread; } ////////////////////////////////AIR780EG/////////////////////////////////////////// GSMMannger *gsmmanger; struct gps_struct{ uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; float latitude; float longitude; }; String get_GPS(gps_struct *gps); String getnetData(); HttpClient *http; //////////////////////////////////////////////////////////////////////////////////// // void save_sd_ds18b20_address(uint8_t num,uint8_t *addr); // void sd_read_set_ds18b20_address(); bool read_dingbiao(String dingbiao_path,uint8_t *dianbiao_data_buff); void send_dingbiao(String dingbiao_path); void dingbiao_init(String dingbiao_path); void rm_dir_or_file(const char * dirname); void low_power_mode(uint8_t state); void setup() { //关闭光谱仪 pinMode(36,INPUT); vTaskDelay(1000); log_init(); // Serial.begin(115200); // wb485Serial.begin(115200); wb485Serial.begin(115200, SERIAL_8N1, wb485PORT_RX, wb485PORT_TX, false); vTaskDelay(1000); vTaskDelay(5000); IS1Serial =new HardwareSerial(IS1Serial_port); IS1Serial->begin(115200, SERIAL_8N1, IS1Serial_RX, IS1Serial_TX); IS1Serial->setTimeout(1); //初始化SD卡 sdcard::init_sdcard(); sdcard::testwriet(); sdcard::Mkdir("/guangpu_data"); sdcard::Mkdir("/up"); sdcard::Mkdir("/down"); sdcard::Mkdir("/other"); sdcard::Mkdir("/gps"); sdcard::Mkdir("/log"); sdcard::Mkdir("/dingbiao"); /// // while(1) // { // write_log(log_path,"hello world",10); // if(SD_MMC.exists("/guangpu_data/0")) // { // rm_dir_or_file("/guangpu_data/0"); // } // } dingbiao_init("/dingbiao/dingbiao_up_gain.bin"); dingbiao_init("/dingbiao/dingbiao_up_offset.bin"); dingbiao_init("/dingbiao/dingbiao_down_gain.bin"); dingbiao_init("/dingbiao/dingbiao_down_offset.bin"); //检查SD卡是否有log.log文件 没有则创建 // unsigned char log_level = 10; if(!SD_MMC.exists(log_path)) { File file; file = SD_MMC.open(log_path,"ab+"); file.flush(); file.close(); } if(!SD_MMC.exists(gp_log)) { //检查SD卡是否有log.log文件 没有则创建 File file; file = SD_MMC.open(gp_log,"ab+"); file.flush(); file.close(); } // 初始化DS18b20 uint8_t temp_number = DS18b20_init(); // float temp[temp_number]; // getall_temp(temp); // while (1) // { // getall_temp(temp); // for (size_t i = 0; i < temp_number; i++) // { // write_log(log_path,"temp " + String(i) + ": " + String(temp[i]),10); // } // vTaskDelay(1000 * 2); // } // sd_read_set_ds18b20_address(); //初始化舵机 servo_init(21,0); //初始化蜂鸣器 beep_init(6,2000,12); // while (1) // { // servo_set_angle(120); // vTaskDelay(1000 * 1.5); // servo_set_angle(0); // beep_run(2000,1000); // vTaskDelay(1000 * 3); // beep_stop(); // } // while(1) // { // beep_run(2000,1000); // vTaskDelay(1000 * 3); // beep_stop(); // vTaskDelay(1000 * 3); // } //初始化时间 rtc.init(); // now.year = 24; // now.month = 5; // now.day = 21; // now.hour = 13; // now.minute = 45; // now.second = 0; // now.dow = Ds1302::DOW_WED; // rtc.setDateTime(&now); rtc.getDateTime(&now); //初始化74hc595 my74hc595_init(); ///////////////////////////加热测试//////////////////////////////////// // while(1) // { // write_log(log_path,"start jiaresi",10); // jiaresi(0,start_jiare); // jiaresi(1,start_jiare); // jiaresi(2,start_jiare); // jiaresi(3,start_jiare); // jiaresi(4,start_jiare); // jiaresi(5,start_jiare); // tuigan(tui); // vTaskDelay(1000 * 15); // write_log(log_path,"stop jiaresi",10); // jiaresi(0,start_jiare); // jiaresi(1,stop_jiare); // jiaresi(2,stop_jiare); // jiaresi(3,stop_jiare); // jiaresi(4,stop_jiare); // jiaresi(5,stop_jiare); // tuigan(suo); // vTaskDelay(1000 * 15); // } ///////////////////////////加热测试//////////////////////////////////// ///////////////////////////推杆测试///////////////////////////////////// // uint32_t x = 0; // float n = 5; // uint32_t data_length; // uint8_t read_buf[100]; // while (1) // { // while(wb485Serial.available()) // { // data_length += wb485Serial.readBytes(&read_buf[data_length],100); // for (uint32_t i = 0; i < 5000; i++) // { // if(wb485Serial.available() > 0) // { // break; // } // } // } // //如果接收到数据 // if (data_length > 0) // { // if(read_buf[0] == 'n') // { // //将转换为数字 // n = atof((const char *) (read_buf+1)); // if(n<5) n = 5; // } // if(read_buf[0] == 'H') // { // wb485Serial.println("n = " + String(n)); // } // memset(read_buf, 0, sizeof(read_buf)); // data_length = 0; // } // if(x == 1) // { // wb485Serial.println("start tuigan tui"); // tuigan(tui); // } // else if(x == 1000 *n) // { // wb485Serial.println("start tuigan suo"); // tuigan(suo); // } // else if(x == 1000 * 2 * n) // { // x = 0; // } // x++; // vTaskDelay(1); // } ///////////////////////////推杆测试///////////////////////////////////// // //初始化AIR780EG gsmmanger = new GSMMannger(2, 19, 20); http = new HttpClient(*gsmmanger->client, "82.156.1.111"); String Date = getnetData(); write_log(log_path,"date is :"+Date,10); // while(1) // { // String Date = getnetData(); // write_log(log_path,"date is :"+Date,10); // vTaskDelay(1000); // } // //初始化AIR780EG // gsmmanger = new GSMMannger(); // //获取GPS gps_struct gps_structure; String gpsbac = get_GPS(&gps_structure); //计算日出日落 double transit, sunrise, sunset; double utc_offset = 8; // int i=0; // while(1) // { // gpsbac = get_GPS(&gps_structure); // write_log(log_path,String(i)+"Getting GPS " + gpsbac,10); // vTaskDelay(1000); // i++; // if (gpsbac != "-1") // { // calcSunriseSunset(now.year+2000, now.month, now.day,gps_structure.latitude, gps_structure.longitude, transit, sunrise, sunset); // write_log(log_path,"sunrise: " + String(sunrise),10); // write_log(log_path,"sunset: " + String(sunset),10); // write_log(log_path,"transit: " + String(transit),10); // write_log(log_path,"latitude: " + String(gps_structure.latitude),10); // write_log(log_path,"longitude: " + String(gps_structure.longitude),10); // write_log(log_path,"gps_date: " + gpsbac,10); // } // } if (gpsbac != "-1") { calcSunriseSunset(now.year+2000, now.month, now.day,gps_structure.latitude, gps_structure.longitude, transit, sunrise, sunset); } else { write_log(log_path,"no gps",10); } //开启光谱仪 pinMode(36,OUTPUT); digitalWrite(36,LOW); vTaskDelay(1000 * 2); InitFunction(serialwrite,serialread); is11Sensor = new SensorIS11(); STRSensorInfos_structure = is11Sensor->initSensor(); // while(1) // { // is11Sensor->SetShutter(2); // vTaskDelay(1000); // is11Sensor->SetShutter(1); // vTaskDelay(1000); // } // 删除原来SD卡的系统信息 sys_info_init(); servo_set_angle(120); vTaskDelay(1000 * 1.5); servo_set_angle(0); vTaskDelay(1000 * 1.5); beep_run(2000,1000); vTaskDelay(1000 * 1.5); beep_stop(); // sys_sd_doc["is_spacial"] = "yes"; // deserializeJson(sys_sd_doc,system_info); // while (1) // { // } xMutexInventory = xSemaphoreCreateMutex(); //创建MUTEX if (xMutexInventory == NULL) { } else{ //创建并启动Core1的任务 xTaskCreatePinnedToCore xTaskCreatePinnedToCore( Task0, /* 任务函数 */ "Task0", /* 任务名称 */ 1024 * 50, /* 栈大小 */ NULL, /* 任务参数 */ 2, /* 任务优先级 */ &Task0_Handler, /* 任务句柄 */ 0); /* Core 0 */ xTaskCreatePinnedToCore( Task1, /* 任务函数 */ "Task1", /* 任务名称 */ 1024 * 5, /* 栈大小 */ NULL, /* 任务参数 */ 1, /* 任务优先级 */ &Task1_Handler, /* 任务句柄 */ 0); //创建并启动Core0的任务 xTaskCreatePinnedToCore( Task2, /* 任务函数 */ "Task2", /* 任务名称 */ 1024 * 30, /* 栈大小 */ NULL, /* 任务参数 */ 20, /* 任务优先级 */ &Task2_Handler, /* 任务句柄 */ 1); } // write_log(log_path,"setup ok",log_level); // beep_run(2000,512); // vTaskDelay(1000 * 3); // beep_stop(); } void loop() { } void Task0(void *pvParameters) { vTaskDelay(1); write_log(log_path,"task 0",10); uint32_t uint_work_task0 = 100; while (1) { if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { if(uint_work_task0 == 100 && caiji_mode != 2) { caiji_mode = 0; uint_work_task0 = 0; } if (caiji_state == 2) { caiji_state = 1; } uint_work_task0 = caiji_mode; } xSemaphoreGive(xMutexInventory); //caiji_mode 0停止 1单次 2连续 3定标 4定标 5回传数据 switch (uint_work_task0) { case 0: break; case 1: if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { caiji_state = 2; } xSemaphoreGive(xMutexInventory); is11Sensor->TakeOneJob(false); if (atuo_return == 1) { is11Sensor->senddata(&wb485Serial,return_data_type); } uint_work_task0 = 100; break; case 2: if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { caiji_state = 2; } xSemaphoreGive(xMutexInventory); is11Sensor->TakeOneJob(false); if (atuo_return == 1) { is11Sensor->senddata(&wb485Serial,return_data_type); } vTaskDelay(1000 * time_interval); break; case 3: is11Sensor->senddata(&wb485Serial,return_data_type); uint_work_task0 = 100; break; case 4: if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { caiji_state = 2; } xSemaphoreGive(xMutexInventory); is11Sensor->advanced_mode(advanced_direction,advanced_shutter_time,advanced_collect_times,advanced_remove_dark); uint_work_task0 = 100; break; case 5: if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { caiji_state = 2; } xSemaphoreGive(xMutexInventory); is11Sensor->opt(advanced_direction); uint_work_task0 = 100; break; default: break; } vTaskDelay(10); } } //Task1的实现 void Task1(void *pvParameters) { vTaskDelay(10); write_log(log_path,"task 1",10); while(1) { // vTaskDelay(1000); // //获取时间 // rtc.getDateTime(&now); // //获取温度 // // float temp[8]; // // getall_temp(temp); // // //平均温度 // // float temp_ave = 0; // // for (size_t i = 0; i < 8; i++) // // { // // temp_ave += temp[i]; // // } // // temp_ave = temp_ave / 8; // // write_log(log_path,"temp_ave: " + String(temp_ave),log_level); // //获取GPS // gps_struct gps_structure; // String gpsbac = get_GPS(&gps_structure); // //计算日出日落 // double transit, sunrise, sunset; // double utc_offset = 8; // if (gpsbac != "-1") // { // calcSunriseSunset(now.year+2000, now.month, now.day,gps_structure.latitude, gps_structure.longitude, transit, sunrise, sunset); // } // else // { // write_log(log_path,"no gps",10); // } // //日出日落控制 太阳升起前推杆缩,太阳落下后推杆伸 // write_log(log_path,"now.hour: " + String(now.hour),log_level); // write_log(log_path,"sunrise: " + String((int)sunrise),log_level); // write_log(log_path,"sunset: " + String((int)sunset),log_level); // if (now.hour+1 == (int)sunrise) // { // tuigan(suo); // } // else if (now.hour+1 >= (int)sunset) // { // tuigan(tui); // } // if(sys_sd_doc["work_mode"] == "time_mode") // { // float now_time = now.hour + now.minute/100; // if(now_time > start_time && now_time < stop_time) // { // } // else // { // if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) // { // caiji_mode = 0; // } // xSemaphoreGive(xMutexInventory); // } // } // write_log(log_path,"temp_ave: " + String(temp_ave),log_level); // if(temp_ave < Minimum_temperature) // { // write_log(log_path,"start jiaresi",10); // jiaresi(5,start_jiare); // vTaskDelay(1000 * 10); // } // else if (temp_ave > Minimum_temperature + 5) // { // write_log(log_path,"stop jiaresi",10); // jiaresi(5,stop_jiare); // } // for(int ab ; ab < 10; ab++) // { rtc.getDateTime(&now); // String path = "/guangpu_data/"+ String(now.year) + "/" + String(now.month) + "/" + String(now.day); // if(!SD_MMC.exists(log_path)) ////////////////////////////////////////////////////////////////////////////////////////////////////////// double cardSize = SD_MMC.cardSize() / (1024 * 1024); double used_size = SD_MMC.usedBytes() / (1024 * 1024); float used_percent = used_size / cardSize; write_log(log_path,"used_percent: " + String(used_percent),10); //数据清除规则:1、满十年清除第一年数据 2、当数据>90%时删除最前一个月数据 if(used_percent >= 0.8) { if (used_percent >= 0.9) { //删除文件 String path_b = "/gaugpu_data"; for(int i=24;i<255 ;i++) { for (uint8_t j = 1; j < 13; i++) { String path_a = path_b + "/" +String(i)+ "/" +String(j); if(SD_MMC.exists(path_a)) { rm_dir_or_file(path_a.c_str()); } } } } //报警 write_log(log_path,"sdcard will full," + String(used_percent * 100) + "%" +"used.",10); } if(SD_MMC.exists("/guangpu_data/"+ String(now.year - 10) )) { String path = "/guangpu_data/"+ String(now.year - 10); rm_dir_or_file(path.c_str()); } // write_log(log_path,"delete /guangpu_data/0 1111111111",10); // if(SD_MMC.exists("/guangpu_data/0")) // { // write_log(log_path,"delete /guangpu_data/0 2222222222222222",10); // // sdcard::deleteFolderOrFile("/gaugpu_data/0"); // rm_dir_or_file("/guangpu_data/0"); // } /////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////时间//////////////////////////////////////////////////////////// //获取RTC时间 rtc.getDateTime(&now); // 获取网络时间 gps_struct net_structure; String net_date = getnetData(); write_log(log_path,"net_date is :"+net_date,10); // 2024-07-12 07:12:45 //截取时间 if(net_date != "-1") { net_structure.year = net_date.substring(0,4).toInt() - 2000; net_structure.month = net_date.substring(5,7).toInt(); net_structure.day = net_date.substring(8,10).toInt(); net_structure.hour = net_date.substring(11,13).toInt(); net_structure.minute = net_date.substring(14,16).toInt(); net_structure.second = net_date.substring(17,-1).toInt(); if(now.year != net_structure.year || now.month != net_structure.month || now.day != net_structure.day || now.hour - net_structure.hour || (fabs(now.minute - net_structure.minute)>5 )) { now.year = net_structure.year; now.month = net_structure.month; now.day = net_structure.day; now.hour = net_structure.hour; now.minute = net_structure.minute; now.second = net_structure.second; rtc.setDateTime(&now); } } ////获取GPS gps_struct gps_structure; String gpsbac = get_GPS(&gps_structure); if(net_date != "-1" && gpsbac != "-1") { gps_structure.year = gps_structure.year - 2000; if(now.year != gps_structure.year || now.month != gps_structure.month || now.day != gps_structure.day || now.hour != gps_structure.hour || (fabs(now.minute - net_structure.minute)>5 )) { now.year = gps_structure.year; now.month = gps_structure.month; now.day = gps_structure.day; now.hour = gps_structure.hour; now.minute = gps_structure.minute; now.second = gps_structure.second; rtc.setDateTime(&now); }else write_log(log_path,"no gps",10); } ////////////////////////////////////////////////////////////////////////////////////////////////////////// //获取时间 rtc.getDateTime(&now); if(sys_sd_doc["work_mode"] == "time_mode") { float now_time = now.hour + now.minute/100; if(now_time > start_time && now_time < stop_time) { } else { if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { caiji_mode = 0; } xSemaphoreGive(xMutexInventory); } } // sdcard::Mkdir(path); float temp4 = getone_temp(4); float temp6 = getone_temp(6); write_log(log_path,"temp4 : " + String(temp4),10); write_log(log_path,"temp6 : " + String(temp6),10); if((temp4+temp6)/2 < 0) { write_log(log_path,"start jiaresi",10); jiaresi(5,start_jiare); vTaskDelay(1000 * 10); } else if ((temp4+temp6)/2 > 5) { write_log(log_path,"stop jiaresi",10); jiaresi(5,stop_jiare); } vTaskDelay(1000 * 10); } } // Task2的实现 void Task2(void *pvParameters) { vTaskDelay(20); write_log(log_path,"task 2",10); unsigned char read_buf[1024*10]; unsigned char command_data[1024 * 10]; unsigned char data_type; String send_data ; int send_lenth; u_char send_buff[300]; while(1) { unsigned short data_length = 0; //监测接收串口数据 while(wb485Serial.available()) { data_length += wb485Serial.readBytes(&read_buf[data_length],1024*10); for (uint32_t i = 0; i < 5000; i++) { if(wb485Serial.available() > 0) { break; } } } //如果接收到数据 if (data_length > 0) { // 测试数据 write_log(log_path,"data_length: " + String(data_length),log_level); data_length = IRIS_Cut_Befor_Header(read_buf,data_length); if (data_length < 0) { send_data = "send data error"; write_log(log_path,send_data,log_level); send_lenth = IRIS_Protocol_Pack(0x01,(uint16_t)send_data.length(), (uint8_t *)send_data.c_str(),send_buff); wb485Serial.write(send_buff,send_lenth); // return; } int ret = IRIS_STM32_Protocol_Unpack(read_buf,data_length,&data_type,command_data); write_log(log_path,"ret:" +String(ret),log_level); if (ret > 0) { write_log(log_path,"data_type:" +String(data_type),log_level); if(data_type == 0x00)//json { deserializeJson(doc,command_data); write_log(log_path,"start json_command",log_level); json_command(); doc.clear(); } else if (data_type == 0x01)//String { // write_log(command_data,0); } else if (data_type == 0x03) //hex { write_log(log_path,"",log_level); String dingbiao_path; if (command_data[0] == 4 || command_data[0] == 5) { // is11Sensor->save_dingbiao(command_data); //保存到sd卡 if(command_data[0] == 4) { if(command_data[1] == 0) dingbiao_path = "/dingbiao/dingbiao_up_gain.bin"; else if(command_data[1] == 1) dingbiao_path = "/dingbiao/dingbiao_up_offset.bin"; } else if(command_data[0] == 5) { if(command_data[1] == 0) dingbiao_path = "/dingbiao/dingbiao_down_gain.bin"; else if(command_data[1] == 1) dingbiao_path = "/dingbiao/dingbiao_down_offset.bin"; } is11Sensor->save_dingbiao(command_data); File file = SD_MMC.open(dingbiao_path, "wb"); file.write((uint8_t *)&command_data, ret); file.flush(); file.close(); } } else if(data_type == 0x04) { uint8_t num = command_data[0]; set_ds18b20_address(num,command_data+1); } send_data = "wb485 success"; write_log(log_path,send_data,log_level); // send_lenth = IRIS_Protocol_Pack(0x01,(uint16_t)send_data.length(), (uint8_t *)send_data.c_str(),send_buff); // wb485Serial.write(send_buff,send_lenth); } else { send_data = "send data error"; write_log(log_path,send_data,log_level); send_lenth = IRIS_Protocol_Pack(0x01,(uint16_t)send_data.length(), (uint8_t *)send_data.c_str(),send_buff); wb485Serial.write(send_buff,send_lenth); } memset(read_buf, 0, sizeof(read_buf)); memset(command_data, 0, sizeof(command_data)); } // vTaskDelay(1); } } /* //处理json命令 command : 1、get_sensor_info 2、set_sensor_info 3、set_work_mode 4、get_work_mode 5、set_time_interval 6、start_work 7、stop_work 8、set_return_mode 9、set_atuo_return 10、set_return_data_type 11、get_9 12、 13、get_data 14、set_bochangxishu 15、get_bochangxishu 16、get_chongcaiyangbochang 18、get_darkcurrent 19、set_servo_offset 20、set_start_time 21、set_stop_time 22、set_maximum_temperature 23、set_Minimum_temperature 24、 */ /*{"command":"","name":"gaoguangpu","version":"v2.0","SN":"123456","date":"","caiji_mode":"","time_interval":"","return_data_type":"","bochangxishu":""}*/ void json_command() { int ret; bool save = false; String send_str; u_char send_buff[1000]; if(xSemaphoreTake(xMutexInventory, timeOut) == pdPASS) { //command 1 if (doc["command"] == "get_sensor_info") { rtc.getDateTime(&now); sys_sd_doc["date"] = String(now.year+2000) + "-" + String(now.month) + "-" + String(now.day) + " " + String(now.hour) + ":" + String(now.minute) + ":" + String(now.second); send_str = ""; serializeJson(sys_sd_doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); serializeJson(sys_sd_doc, send_str); wb485Serial.write(send_buff, ret); } //command 2 else if (doc["command"] == "set_sensor_info") { write_log(log_path,"set_sensor_info",log_level); if(doc["name"] == NULL) { send_str = ""; doc["state"] = "failed"; doc["info"] = "Name cannot be null"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { save = true ; sys_sd_doc["name"] = doc["name"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } if(doc["version"] == NULL) { } else { save = true ; sys_sd_doc["version"] = doc["version"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 3 else if (doc["command"] == "set_work_mode") { if(doc["work_mode"] == "manual_mode") { if(sys_sd_doc["work_mode"]=="low_power_mode") low_power_mode(1); save = true ; sys_sd_doc["work_mode"] = "manual_mode"; sys_sd_doc["caiji_mode"] = "single"; sys_sd_doc["atuo_return"] ="no"; sys_sd_doc["return_data_type"] = 0x00; work_mode = 0; caiji_mode = 0; atuo_return = 0; return_data_type = 0x00; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if (doc["work_mode"] == "time_mode") { if(sys_sd_doc["work_mode"]=="low_power_mode") low_power_mode(1); save = true; sys_sd_doc["work_mode"] = "time_mode"; sys_sd_doc["caiji_mode"] = "continue"; sys_sd_doc["atuo_return"] = "yes"; sys_sd_doc["return_data_type"] = 0x00; work_mode = 1; caiji_mode = 0; atuo_return = 1; return_data_type = 0x00; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if(doc["work_mode"] == "advanced_mode") { if(sys_sd_doc["work_mode"]=="low_power_mode") low_power_mode(1); save = true; sys_sd_doc["work_mode"] = "advanced_mode"; sys_sd_doc["caiji_mode"] = "advanced"; sys_sd_doc["atuo_return"] = "no"; sys_sd_doc["return_data_type"] = 0x00; work_mode = 2; caiji_mode = 0; atuo_return = 0; return_data_type = 0x00; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if(doc["work_mode"] == "low_power_mode") { save = true; sys_sd_doc["work_mode"] = "low_power_mode"; sys_sd_doc["caiji_mode"] = "low_power"; sys_sd_doc["atuo_return"] = "no"; sys_sd_doc["return_data_type"] = 0x00; work_mode = 3; low_power_mode(0); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "work mode error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 4.1 else if (doc["command"] == "set_caiji_mode") { if(doc["caiji_mode"] == "start") { if(sys_sd_doc["caiji_mode"]=="continue") caiji_mode = 2; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if(doc["caiji_mode"] == "stop") { if(sys_sd_doc["caiji_mode"]=="continue") caiji_mode = 0; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if(doc["caiji_mode"] == "single") { save = true; sys_sd_doc["caiji_mode"] = doc["caiji_mode"].as(); caiji_mode = 1; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if(doc["caiji_mode"] == "continue") { save = true; sys_sd_doc["caiji_mode"] = doc["caiji_mode"].as(); caiji_mode = 2; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "work mode error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 4.2 else if (doc["command"] == "take_one_job") { if(caiji_mode == 0) { caiji_mode = 1; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "Working"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 4.3 else if (doc["command"] == "set_time_interval") { if (doc["time_interval"]>0) { save = true; sys_sd_doc["time_interval"] = doc["time_interval"]; time_interval = doc["time_interval"]; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "time_interval error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 5 else if (doc["command"] == "get_work_mode") { doc.clear(); send_str = ""; doc["work_mode"] = sys_sd_doc["work_mode"].as(); doc["caiji_mode"] = sys_sd_doc["caiji_mode"].as(); doc["atuo_return"] = sys_sd_doc["atuo_return"].as(); doc["return_data_type"] =sys_sd_doc["return_data_type"]; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } //command 6 else if(doc["command"] == "set_atuo_return") { if(doc["atuo_return"] == "yes") { save = true; sys_sd_doc["atuo_return"] = doc["atuo_return"].as(); atuo_return = 1; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else if (doc["atuo_return"] == "no") { save = true; sys_sd_doc["atuo_return"] = doc["atuo_return"].as(); atuo_return = 0; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "atuo_return error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 7 else if (doc["command"] == "set_return_data_type") { u_int8_t a = 0; u_int32_t b = doc["return_data_type"]; switch (b) { case 0x00: a=1; break; case 0x01: a=1; break; case 0x02: a=1; break; case 0x03: a=1; break; case 0x04: a=1; break; case 0x05: a=1; break; case 0x10: a=1; break; case 0x11: a=1; break; case 0x12: a=1; break; case 0x13: a=1; break; default: break; } if(a) { save = true; sys_sd_doc["return_data_type"] = doc["return_data_type"]; return_data_type = doc["return_data_type"]; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "return_data_type error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 8 //保留,没用 else if (doc["command"] == "set_return_mode") { save = true; sys_sd_doc["return_mode"] = doc["return_mode"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); /*设置回传模式 */ } //command 9 else if (doc["command"] == "get_data") { u_int8_t a = 0; u_int32_t b = doc["return_data_type"]; switch (b) { case 0x00: a=1; break; case 0x01: a=1; break; case 0x02: a=1; break; case 0x03: a=1; break; case 0x04: a=1; break; case 0x05: a=1; break; case 0x06: a=1; break; case 0x10: a=1; break; case 0x11: a=1; break; case 0x12: a=1; break; case 0x13: a=1; break; default: break; } if(a && caiji_mode !=3) { return_data_type = doc["return_data_type"]; caiji_mode = 3; } else { send_str = ""; doc["caiji_state"] = "working"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } /* code */ } //command 10 else if (doc["command"] == "set_bochangxishu") { float b1=0,b2=0,b3=0,b4=0; b1 = doc["bochangxishu"]["b0"].as(); b2 = doc["bochangxishu"]["b1"].as(); b3 = doc["bochangxishu"]["b2"].as(); b4 = doc["bochangxishu"]["b3"].as(); if(b1!=0 && b2 !=0 && b3 != 0 && b4 != 0) { save = true; bc_b1 = doc["bochangxishu"]["b0"].as(); bc_b2 = doc["bochangxishu"]["b1"].as(); bc_b3 = doc["bochangxishu"]["b2"].as(); bc_b4 = doc["bochangxishu"]["b3"].as(); sys_sd_doc["bochangxishu"]["b0"] = doc["bochangxishu"]["b0"].as(); sys_sd_doc["bochangxishu"]["b1"] = doc["bochangxishu"]["b1"].as(); sys_sd_doc["bochangxishu"]["b2"] = doc["bochangxishu"]["b2"].as(); sys_sd_doc["bochangxishu"]["b3"] = doc["bochangxishu"]["b3"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "bochangxishu error or null"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 11 else if (doc["command"] == "get_bochangxishu") { doc.clear(); doc["bochangxishu"]["a0"] = sys_sd_doc["bochangxishu"]["a0"].as(); doc["bochangxishu"]["a1"] = sys_sd_doc["bochangxishu"]["a1"].as(); doc["bochangxishu"]["a2"] = sys_sd_doc["bochangxishu"]["a2"].as(); doc["bochangxishu"]["a3"] = sys_sd_doc["bochangxishu"]["a3"].as(); doc["bochangxishu"]["b0"] = sys_sd_doc["bochangxishu"]["b0"].as(); doc["bochangxishu"]["b1"] = sys_sd_doc["bochangxishu"]["b1"].as(); doc["bochangxishu"]["b2"] = sys_sd_doc["bochangxishu"]["b2"].as(); doc["bochangxishu"]["b3"] = sys_sd_doc["bochangxishu"]["b3"].as(); send_str = ""; doc["state"] = "ok"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } //command 12 else if (doc["command"] == "get_chongcaiyangbochang") { // String chongcaiyangbochang; /* code */ } //command 14 else if(doc["command"] == "set_servo_offset") { float angle = doc["servo_offset_angle"]; if(angle > 0 || angle < 180) { save = true; sys_sd_doc["servo_offset_angle"] = doc["servo_offset_angle"].as(); servo_offset(angle); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "servo_offset_angle error or out of range"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 15 else if(doc["command"] == "set_start_time") { float t = doc["start_time"].as(); if(t>0 && t < 24) { save = true; sys_sd_doc["start_time"] = doc["start_time"].as(); start_time = doc["start_time"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "start_time error or out of range"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 16 else if(doc["command"] == "set_stop_time") { float tt = doc["stop_time"].as(); if(tt>0 && tt < 24 && tt > start_time) { save = true; sys_sd_doc["stop_time"] = doc["stop_time"].as(); stop_time = doc["stop_time"]; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "stop_time error or out of range"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 17 else if(doc["command"] == "set_maximum_temperature") { float te = doc["maximum_temperature"].as(); if(te < 100) { save = true; maximum_temperature = doc["maximum_temperature"].as(); sys_sd_doc["maximum_temperature"] = doc["maximum_temperature"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "maximum_temperature error or out of range"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 18 else if(doc["command"] == "set_Minimum_temperature") { float tte = doc["Minimum_temperature"].as(); if(tte < maximum_temperature) { save = true; maximum_temperature = doc["Minimum_temperature"].as(); sys_sd_doc["Minimum_temperature"] = doc["Minimum_temperature"].as(); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "Minimum_temperature error or out of range"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 19 else if(doc["command"] == "get_date") { send_str = ""; doc.clear(); rtc.getDateTime(&now); doc["state"] = "ok"; doc["date"]["year"]= now.year; doc["date"]["month"]= now.month; doc["date"]["day"]= now.day; doc["date"]["hour"]= now.hour; doc["date"]["minute"]= now.minute; doc["date"]["second"]= now.second; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } //command 20 else if(doc["command"] == "get_caiji_state") { uint32_t percent; send_str = ""; doc.clear(); if(caiji_state == 1) { doc["caiji_state"] = "finish"; percent = is11Sensor->work_progress; doc["percent"] = percent; doc["info"] = "end"; } else if(caiji_state == 2 ) { doc["caiji_state"] = "working"; percent = is11Sensor->work_progress; doc["percent"] = percent; if(percent < 100) { doc["info"] = "working"; } else { doc["info"] = "end"; } } else doc["caiji_state"] = "no"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } //command 21 else if(doc["command"] == "start_opt") { if(sys_sd_doc["work_mode"] == "advanced_mode") { caiji_mode = 5; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "The working mode is not advanced_mode"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 22 else if(doc["command"] == "get_opt") { if(sys_sd_doc["work_mode"] == "advanced_mode") { send_str = ""; uint32_t aa = is11Sensor->dingbiao_shutter; doc["opt"] = aa; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "The working mode is not advanced_mode"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } else if(doc["command"] == "start_collect") { bool collect = true; if(sys_sd_doc["work_mode"] == "advanced_mode") { // caiji_mode = 3; if (doc["direction"] == "up") { advanced_direction = 0; } else if (doc["direction"] == "down") { advanced_direction = 1; } else if (doc["direction"] == "dark") { advanced_direction = 2; } else { collect = false; // send_str = ""; // doc["state"] = "failed"; // doc["info"] = "direction error"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); } if(doc["shutter_time"]>=1) { advanced_shutter_time = doc["shutter_time"]; } else { collect = false; // send_str = ""; // doc["state"] = "failed"; // doc["info"] = "shutter_time error"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); } if(doc["collect_times"]>0) { advanced_collect_times = doc["collect_times"]; } else { collect = false; // send_str = ""; // doc["state"] = "failed"; // doc["info"] = "collect_times error"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); } if(doc["remove_dark"] == "yes") { advanced_remove_dark = 1; } else if(doc["remove_dark"] == "no") { advanced_remove_dark = 0; } else { collect = false; // send_str = ""; // doc["state"] = "failed"; // doc["info"] = "remove_dark error"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); } if (collect) { caiji_mode = 4; send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "parameter error"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "The working mode is not advanced_mode"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } //command 25 else if(doc["command"] == "set_sys_time") { uint32_t year,month,day,hour,minute,second; year = doc["year"]; month = doc["month"]; day = doc["day"]; hour = doc["hour"]; minute = doc["minute"]; second = doc["second"]; write_log(log_path,"year" + String(year) + "month" + String(month) + "day" + String(day) + "hour" + String(hour) + "minute" + String(minute) + "second" + String(second),10); if(year>99 || month>12 || day>31 || hour > 23 || minute >59 || second > 59) { send_str = ""; doc["state"] = "failed"; doc["info"] = "date error1"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { if(sys_set_time(year,month,day)) { now.year = year; now.month = month; now.day = day; now.hour = hour; now.minute =minute; now.second =second; // now.dow = 5; rtc.setDateTime(&now); send_str = ""; doc["state"] = "success"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } else { send_str = ""; doc["state"] = "failed"; doc["info"] = "date error2"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } } } //command 26 // else if(doc["command"] == "set_ds18b20_address") // { // uint8_t num = doc["num"]; // uint8_t addr[8]; // if (num>=0 && num<8) // { // addr[0] = doc["addr"]["0"]; // addr[1] = doc["addr"]["1"]; // addr[2] = doc["addr"]["2"]; // addr[3] = doc["addr"]["3"]; // addr[4] = doc["addr"]["4"]; // addr[5] = doc["addr"]["5"]; // addr[6] = doc["addr"]["6"]; // addr[7] = doc["addr"]["7"]; // set_ds18b20_address(num, addr); // save_sd_ds18b20_address(num,addr); // send_str = ""; // doc["state"] = "success"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); // } // else // { // send_str = ""; // doc["state"] = "failed"; // doc["info"] = "num error"; // serializeJson(doc, send_str); // ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); // wb485Serial.write(send_buff, ret); // } // } else if(doc["command"] == "get_dingbiao") { send_dingbiao("/dingbiao/dingbiao_up_gain.bin"); send_dingbiao("/dingbiao/dingbiao_up_offset.bin"); send_dingbiao("/dingbiao/dingbiao_down_gain.bin"); send_dingbiao("/dingbiao/dingbiao_down_offset.bin"); } //command error else { send_str = ""; doc["state"] = "failed"; doc["info"] = "no command"; serializeJson(doc, send_str); ret = IRIS_Protocol_Pack(0x00,(uint16_t)send_str.length(), (uint8_t *)send_str.c_str(),send_buff); wb485Serial.write(send_buff, ret); } //将修改后的系统信息写入内存卡 if(save == true) { send_str = ""; serializeJson(sys_sd_doc, send_str); File file; file = SD_MMC.open("/system_info.json","w+"); file.println(send_str); file.flush(); file.close(); } } xSemaphoreGive(xMutexInventory); } String get_GPS(gps_struct *gps) { write_log(log_path,"start get GPS ",10); String gpsbac,Date,temp,Latitude,Longitude; gsmmanger->modem->sendAT(GF("+CGNSPWR?")); gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->sendAT(GF("+CGNSPWR=1")); gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->sendAT(GF("+CGNSAID=31,1,1,1")); gsmmanger->modem->waitResponse("OK"); gsmmanger->modem->sendAT(GF("+CGNSINF")); //获取gps信息 gsmmanger->modem->waitResponse(5000,gpsbac); write_log(log_path,"gpsbac is " + gpsbac,10); //检测是否有效 temp = gpsbac.substring(16,17); // write_log(log_path,"hahaha :" + temp,10); if(temp != "1") { // write_log(log_path,"gps error,hahahaha",10); return "-1"; } //截取时间 Date = gpsbac.substring(18,32); temp = Date.substring(0,4) + "-" + Date.substring(4,6) + "-" +Date.substring(6,8) + " " + Date.substring(8,10) + ":" +Date.substring(10,12) + ":" +Date.substring(12,-1); gps->year = Date.substring(0,4).toInt(); gps->month = Date.substring(4,6).toInt(); gps->day = Date.substring(6,8).toInt(); gps->hour = Date.substring(8,10).toInt(); gps->minute = Date.substring(10,12).toInt(); gps->second = Date.substring(12,-1).toInt(); Date = temp; // +CGNSINF: 1,1,20240430052525,40.040938,116.328013,51.900,0.26,0.00,3,,2.14,2.42,4.00,,10,8,,,34,, // OK ////////获取经纬度////////// temp = gpsbac.substring(33); // write_log(log_path,"Longitude is :" + temp,10); int pos = temp.indexOf(","); Latitude = temp.substring(0,pos); gps->latitude = Latitude.toFloat(); // write_log(log_path,"Latitude ::::" + Latitude,10); temp = temp.substring(pos+1); // write_log(log_path,"Longitude is :" + temp,10); pos = temp.indexOf(","); Longitude = temp.substring(0,pos); gps->longitude = Longitude.toFloat(); // write_log(log_path,"Longitude ::::" + Longitude,10); if(Date.indexOf(",") != -1) { return "-1"; } return Date; } void sys_info_init() { gps_struct gps_structure; String system_info; String rtcdate_now ="20" + String(now.year) + "-" + String(now.month) + "-" + String(now.day) + " " + String(now.hour) + ":" + String(now.minute) + ":" + String(now.second); write_log(log_path,rtcdate_now,10); if(SD_MMC.exists("/system_info.json")) { write_log(log_path,"has system_info.json file",log_level); File file; file = SD_MMC.open("/system_info.json","rb+"); system_info = file.readString(); file.flush(); file.close(); deserializeJson(doc, system_info); //初始化系统信息 sys_sd_doc["name"] = doc["name"].as(); sys_sd_doc["serialnumber"] = STRSensorInfos_structure.serialnumber; // sys_sd_doc["serialnumber"] = "is110008"; sys_sd_doc["version"] = doc["version"].as(); sys_sd_doc["date"] = rtcdate_now; sys_sd_doc["work_mode"] = doc["work_mode"].as(); //一会 if(doc["work_mode"] == "manual_mode") { work_mode = 0; } else if (doc["work_mode"] == "time_mode") { work_mode = 1; } else { work_mode = 0; } // if(caiji_mode == 7) // { // sys_sd_doc["work_mode"] = "specify"; // } sys_sd_doc["caiji_mode"] = doc["caiji_mode"].as();//一会 if(doc["caiji_mode"] == "start") { if(sys_sd_doc["caiji_mode"]=="continue") caiji_mode = 2; } else if(doc["caiji_mode"] == "stop") { if(sys_sd_doc["caiji_mode"]=="continue") caiji_mode = 0; } else if(doc["caiji_mode"] == "single") { sys_sd_doc["caiji_mode"] = doc["caiji_mode"].as(); caiji_mode = 1; } else if(doc["caiji_mode"] == "continue") { sys_sd_doc["caiji_mode"] = doc["caiji_mode"].as(); caiji_mode = 2; } else { } sys_sd_doc["time_interval"] = doc["time_interval"]; time_interval = doc["time_interval"].as(); sys_sd_doc["start_time"] = doc["start_time"].as(); start_time = doc["start_time"].as(); sys_sd_doc["stop_time"] = doc["stop_time"].as(); stop_time = doc["stop_time"].as(); sys_sd_doc["maximum_temperature"] = doc["maximum_temperature"].as(); maximum_temperature = doc["maximum_temperature"].as(); sys_sd_doc["Minimum_temperature"] = doc["Minimum_temperature"].as(); Minimum_temperature = doc["Minimum_temperature"].as(); sys_sd_doc["servo_offset_angle"] = doc["servo_offset_angle"].as(); float a = doc["servo_offset_angle"].as(); servo_offset(a); sys_sd_doc["bochangxishu"]["a0"] = STRSensorInfos_structure.a1; sys_sd_doc["bochangxishu"]["a1"] = STRSensorInfos_structure.a2; sys_sd_doc["bochangxishu"]["a2"] = STRSensorInfos_structure.a3; sys_sd_doc["bochangxishu"]["a3"] = STRSensorInfos_structure.a4; sys_sd_doc["bochangxishu"]["b0"] = doc["bochangxishu"]["b0"].as(); sys_sd_doc["bochangxishu"]["b1"] = doc["bochangxishu"]["b1"].as(); sys_sd_doc["bochangxishu"]["b2"] = doc["bochangxishu"]["b2"].as(); sys_sd_doc["bochangxishu"]["b3"] = doc["bochangxishu"]["b3"].as(); sys_sd_doc["return_data_type"] = doc["return_data_type"].as(); sys_sd_doc["return_mode"] = doc["return_mode"]; //暂定 sys_sd_doc["atuo_return"] = doc["atuo_return"].as();//一会 if(doc["atuo_return"] == "yes") { atuo_return = 1; } else { atuo_return = 0; } sys_sd_doc["gps_info"]["latitude"] = gps_structure.latitude; sys_sd_doc["gps_info"]["longitude"] = gps_structure.longitude; system_info = ""; serializeJson(sys_sd_doc, system_info); write_log(log_path, system_info,log_level); doc.clear(); } else{ write_log(log_path,"do not has system_info.json file" ,log_level); sys_sd_doc["name"] = "HS"; // sys_sd_doc["serialnumber"] = "is110008"; sys_sd_doc["serialnumber"] = STRSensorInfos_structure.serialnumber; sys_sd_doc["version"] = "v2.0"; sys_sd_doc["date"] = rtcdate_now; sys_sd_doc["work_mode"] = "manual_mode"; sys_sd_doc["caiji_mode"] = "stop"; sys_sd_doc["time_interval"] = time_interval; sys_sd_doc["start_time"] = start_time; sys_sd_doc["stop_time"] = stop_time; sys_sd_doc["maximum_temperature"] = maximum_temperature; sys_sd_doc["Minimum_temperature"] = Minimum_temperature; sys_sd_doc["servo_offset_angle"] = 0; sys_sd_doc["bochangxishu"]["a0"] = STRSensorInfos_structure.a1; sys_sd_doc["bochangxishu"]["a1"] = STRSensorInfos_structure.a2; sys_sd_doc["bochangxishu"]["a2"] = STRSensorInfos_structure.a3; sys_sd_doc["bochangxishu"]["a3"] = STRSensorInfos_structure.a4; sys_sd_doc["bochangxishu"]["b0"] = bc_b1; sys_sd_doc["bochangxishu"]["b1"] = bc_b2; sys_sd_doc["bochangxishu"]["b2"] = bc_b3; sys_sd_doc["bochangxishu"]["b3"] = bc_b4; sys_sd_doc["return_data_type"] = return_data_type; sys_sd_doc["return_mode"] = ""; //暂定 sys_sd_doc["atuo_return"] = "no"; sys_sd_doc["gps_info"]["latitude"] = gps_structure.latitude; sys_sd_doc["gps_info"]["longitude"] = gps_structure.longitude; serializeJson(sys_sd_doc, system_info); write_log(log_path, system_info,log_level); File file; file = SD_MMC.open("/system_info.json","w+"); file.println(system_info); file.flush(); file.close(); } } bool sys_set_time(uint32_t year,uint32_t month,uint32_t day) { uint32_t m[4] ={4,6,9,11}; year = year + 2000; for(int i = 0; i < 4; i++) { if(month == m[i]) { if(day >= 31) return false; } } if(month == 2) { if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { // write_log(log_path,"is ruannian" + String(day),10); if(day > 29) return false; } else { // write_log(log_path,"not is " + String(day),10); if(day > 28) return false; } } return true; } // void save_ds18b20_address(uint8_t *data) // { // uint8_t add[8][8]={0}; // uint8_t num = data[0]; // for(uint8_t i = 0; i < 8; i++) // { // add[num][i] = data[i+1]; // } // File file = SD_MMC.open("/ds18b20_address.bin", "wb"); // file.write((uint8_t *)add, 64); // file.flush(); // file.close(); // } // void read_ds18b20_address() // { // uint8_t add[8][8]={0}; // File file = SD_MMC.open("/ds18b20_address.bin", "rb"); // file.read((uint8_t *)add, 64); // file.flush(); // file.close(); // for(uint8_t i = 0; i < 8; i++) // { // set_ds18b20_address(i,add[i]); // } // } // void sd_read_set_ds18b20_address() // { // uint8_t add[8]; // String str1[8] = {"sensor0","sensor1","sensor2","sensor3","sensor4","sensor5","sensor6","sensor7"}; // String str2[8] = {"byte0","byte1","byte2","byte3","byte4","byte5","byte6","byte7"}; // if(SD_MMC.exists("/temp_sensor.json")) // { // File file; // file = SD_MMC.open("/temp_sensor.json","rb+"); // String temp_sensor = file.readString(); // file.flush(); // file.close(); // deserializeJson(doc, temp_sensor); // for(uint8_t a = 0; a < 8; a++) // { // for(uint8_t b = 0; b < 8; b++) // { // add[b] = doc[str1[a]][str2[b]]; // ds18b20_doc[a][b] = doc[str1[a]][str2[b]]; // } // set_ds18b20_address(a,add); // } // temp_sensor = ""; // serializeJson(doc, temp_sensor); // write_log(log_path, temp_sensor,log_level); // } // else // { // write_log(log_path,"do not has file",10); // for(uint8_t a = 0; a < 8; a++) // { // for(uint8_t b = 0; b < 8; b++) // { // ds18b20_doc[a][b] = ""; // } // } // File file; // file = SD_MMC.open("/temp_sensor.json","w+"); // file.flush(); // file.close(); // } // doc.clear(); // } // void save_sd_ds18b20_address(uint8_t num,uint8_t *addr) // { // String str1[8] = {"sensor0","sensor1","sensor2","sensor3","sensor4","sensor5","sensor6","sensor7"}; // String str2[8] = {"byte0","byte1","byte2","byte3","byte4","byte5","byte6","byte7"}; // String temp_sensor; // for(uint8_t i = 0; i < 8; i++) // { // ds18b20_doc[str1[num]][str2[i]] = addr[i]; // } // temp_sensor = ""; // serializeJson(ds18b20_doc, temp_sensor); // write_log(log_path, temp_sensor,log_level); // File file; // file = SD_MMC.open("/temp_sensor.json","w+"); // file.println(temp_sensor); // file.flush(); // file.close(); // } //dingbiao_path //1、dingbiao/dingbiao_up_gain.txt //2、dingbiao/dingbiao_up_offset.txt //3、dingbiao/dingbiao_down_gain.txt //4、dingbiao/dingbiao_down_offset.txt bool read_dingbiao(String dingbiao_path,uint8_t *dianbiao_data_buff) { if(SD_MMC.exists(dingbiao_path)) { File file; file = SD_MMC.open(dingbiao_path,"rb"); file.read(dianbiao_data_buff,sizeof(IS11_datastruct)); file.flush(); file.close(); } else { return false; } return true; } void send_dingbiao(String dingbiao_path) { uint32_t dingbiao_len = 0; uint8_t *send_dingbiao_buff = new uint8_t[sizeof(IS11_datastruct)+7]; uint8_t *read_dingbiao_buff = new uint8_t[sizeof(IS11_datastruct)]; if(read_dingbiao(dingbiao_path,read_dingbiao_buff)) { dingbiao_len = IRIS_Protocol_Pack(0x02,(uint16_t)sizeof(IS11_datastruct), read_dingbiao_buff,send_dingbiao_buff); wb485Serial.write(send_dingbiao_buff,dingbiao_len); } delete read_dingbiao_buff; delete send_dingbiao_buff; } void dingbiao_init(String dingbiao_path) { uint8_t *read_dingbiao_buff = new uint8_t[sizeof(IS11_datastruct)]; if(read_dingbiao(dingbiao_path,read_dingbiao_buff)) { is11Sensor->save_dingbiao(read_dingbiao_buff); } delete read_dingbiao_buff; } // /////////////////////////////////上传数据///////////////////////////////////// // bool UpdateData(String path, char *str, size_t lenth, String Contenttype = "") // { // http->beginRequest(); // http->post(path); // if (Contenttype != "") // { // http->sendHeader(HTTP_HEADER_CONTENT_TYPE, Contenttype); // /* code */ // } // http->sendHeader(HTTP_HEADER_CONTENT_LENGTH, lenth); // http->endRequest(); // int err = http->write((const byte *)str, lenth); // delay(1000); // Serial.print("send date size"); // Serial.println(err); // /* // for (size_t i = 0; i < lenth; i++) // { // Serial.print("0x"); // Serial.print(str[i],HEX); // Serial.print(" "); // if (i%20==0) // { // Serial.println(" "); // } // } // */ // // http->write((const byte*)IS1Sensor.UpData, IS1Sensor.SensorInfo.BandNum*2); // // http->stop(); // Serial.println("hear1"); // if (err == 0) // { // http->stop(); // return false; // } // int status = http->responseStatusCode(); // Serial.println("hear3"); // if (!status) // { // http->stop(); // return false; // } // int length = http->contentLength(); // Serial.println("hear4"); // if (length == 0) // { // http->stop(); // return false; // } // String body = http->responseBody(); // Serial.println("body:"+body); // if (body != "ok") // { // http->stop(); // return false; // } // http->stop(); // return true; // } // void ReuploadData(String path, String webpath, String content = "") // { // vTaskDelay(1); // Vector files; // String vec[20]; //每次处理20个 // files.setStorage(vec); // while (!sdcard::ListDir(path.c_str(), files)) // { // if (files.size() != 0) // { // Serial.println("find " + String(files.size()) + "file"); // for (size_t i = 0; i < files.size(); i++) // { // File nowfile = SD_MMC.open(files.at(i).c_str(), "rb"); // size_t size = nowfile.size(); // char *arr = new char[size]; // nowfile.readBytes(arr, size); // bool flagsucc = UpdateData(webpath, arr, size, content); // if (!flagsucc) // { // return; // /* code */ // } // delete[] arr; // sdcard::deleteFolderOrFile(files.at(i).c_str()); // vTaskDelay(1); // /* code */ // } // } // vTaskDelay(1); // } // if (files.size() != 0) // { // Serial.println("find " + String(files.size()) + "file not enough 20"); // for (size_t i = 0; i < files.size(); i++) // { // vTaskDelay(1); // File nowfile = SD_MMC.open(files.at(i).c_str(), "rb"); // size_t size = nowfile.size(); // char *arr = new char[size]; // nowfile.readBytes(arr, size); // Serial.println("run here now"); // bool flagsucc = UpdateData(webpath, arr, size, content); // if (!flagsucc) // { // return; // /* code */ // } // delete[] arr; // sdcard::deleteFolderOrFile(files.at(i).c_str()); // /* code */ // } // } // vTaskDelay(1); // } // /////////////////////////////////////////////////////////////////////////////////////////////////// String getnetData() { write_log(log_path,"start get net data",10); int err = http->get("/weather/php/Date.php"); if (err != 0) { return "-1"; } write_log(log_path,"responseStatusCode",10); int status = http->responseStatusCode(); if (!status) { return "-1"; } int times_try = 0; write_log(log_path,"headerAvailable",10); while (http->headerAvailable()) { if(times_try > 100) { http->stop(); return "-1"; } write_log(log_path,"readHeaderName",10); String headerName = http->readHeaderName(); write_log(log_path,"readHeaderValue",10); String headerValue = http->readHeaderValue(); vTaskDelay(100); times_try++; } write_log(log_path,"isResponseChunked",10); if (http->isResponseChunked()) { } write_log(log_path,"contentLength",10); String body = http->responseBody(); http->stop(); return body; } void rm_dir_or_file( const char * dirname) { File root = SD_MMC.open(dirname); String dir = String(dirname); if(root.isDirectory()) { File file = root.openNextFile(); if(file) { if (file.isDirectory()) { dir = String(dirname) + "/" + String(file.name()); write_log(log_path,dir,10); rm_dir_or_file(dir.c_str()); } else { do { dir = String(dirname) + "/" + String(file.name()); if(SD_MMC.remove(dir)) { write_log(log_path,"remove file success",10); } else { write_log(log_path,"remove file failed",10); break; } file = root.openNextFile(); if(!file) break; } while (!file.isDirectory()); } } else { SD_MMC.rmdir(dir); } } else { SD_MMC.remove(dir); } } // void rm_dir_or_file( const char * dirname) // { // File root = SD_MMC.open(dirname); // String dir = String(dirname); // if(root.isDirectory()) // { // File file = root.openNextFile(); // if(file) // { // while (file.isDirectory()) // { // dir = String(dirname) + "/" + String(file.name()); // write_log(log_path,dir,10); // rm_dir_or_file(dir.c_str()); // file = root.openNextFile(); // } // if(!file.isDirectory()) // { // do // { // dir = String(dirname) + "/" + String(file.name()); // if(SD_MMC.remove(dir)) // { // write_log(log_path,"remove file success",10); // } // else // { // write_log(log_path,"remove file failed",10); // break; // } // file = root.openNextFile(); // if(!file) break; // } while (!file.isDirectory()); // } // } // else // { // SD_MMC.rmdir(dir); // } // } // else // { // SD_MMC.remove(dir); // } // } //0:关闭 1:开启 void low_power_mode(uint8_t state) { if(state == 0) { //关闭光谱仪 pinMode(36,INPUT); //关闭AIR780E pinMode(37,OUTPUT); digitalWrite(37,LOW); } else { //开启光谱仪 pinMode(36,OUTPUT); digitalWrite(36,LOW); //开启AIR780E pinMode(37,OUTPUT); digitalWrite(37,HIGH); } }