Set::~Set() { if (_cmaps) { delete[] _cmaps; for (int i = 0; i < _numSetups; ++i) { delete _setups[i]._bkgndBm; delete _setups[i]._bkgndZBm; } delete[] _setups; turnOffLights(); delete[] _lights; for (int i = 0; i < _numSectors; ++i) { delete _sectors[i]; } delete[] _sectors; for (StateList::iterator i = _states.begin(); i != _states.end(); ++i) delete (*i); } }
/** * 构造函数传入WorkingStatus status初始化界面 * @param newsinglewidgetapp 是否为单一界面程序(采集程序有可能为单一界面程序,其结束方式与复界面程序不用) @see closeEvent方法 * @param status 工作状态,@see status.h * Collecting = 1 采集时 * Calculating_Backuping = 5 计算备份同时进行 */ MainWidget::MainWidget(bool newsinglewidgetapp, WorkingStatus initstatus, QWidget *parent) : QWidget(parent), ui(new Ui::MainWidget) { ui->setupUi(this); // 初始化结束方式 singlewidgetapp = newsinglewidgetapp; // 初始化工作状态 workingstatus = initstatus; // 初始时采集工程文件名为空 projectfilename = ""; // 默认用户不知道是谁 currentusername = "******"; // 在主界面连接主控底层服务信号槽 connect(MasterProgram::getMasterProgramInstance(), SIGNAL(makeGUIActive(WorkingStatus, bool)), this, SLOT(msgToGUICreateProjectWidget(WorkingStatus, bool))); connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalMsgToGUI(WorkingStatus, QString)), this, SLOT(appendMsg(WorkingStatus, QString))); connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalErrorToGUI(WorkingStatus, QString)), this, SLOT(appendError(WorkingStatus, QString))); // [采集转发消息] connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToLights(HardwareType, QString, HardwareStatus)), this, SLOT(changeHardwareStatus(HardwareType, QString, HardwareStatus))); connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraFC(QString, qint64)), this, SLOT(changeCameraFC_slot(QString, qint64))); // [采集、计算、备份转发消息] connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraTask(WorkingStatus, QString, int, QString, QString)), this, SLOT(changeSlaveCameraTask_slot(WorkingStatus, QString, int, QString, QString))); // [计算转发消息] // 每个从控每个线程每个任务帧号反馈消息转发 connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToCameraTaskFC(WorkingStatus, QString, int, QString, long long)), this, SLOT(changeSlaveCameraTaskFC_slot(WorkingStatus, QString, int, QString, long long))); // 每个从控每个线程每个任务初始化界面(起始帧、终止帧)消息转发 connect(MasterProgram::getMasterProgramInstance(), SIGNAL(signalToSlaveCameraTaskFC_init(WorkingStatus, QString, int, QString, long long, long long)), this, SLOT(changeSlaveCameraTaskFC_init_slot(WorkingStatus, QString, int, QString, long long, long long))); // [计算备份转发消息] connect(MasterProgram::getMasterProgramInstance(), SIGNAL(calcubackupProgressingBar(WorkingStatus, QString, int, int, int, bool)), this, SLOT(changecalcubackupProgressingBar_slot(WorkingStatus, QString, int, int, int, bool))); connect(MasterProgram::getMasterProgramInstance(), SIGNAL(turnOffAllHardware()), this, SLOT(turnOffLights())); //connect(MasterProgram::getMasterProgramInstance(), SIGNAL(makeGUIActive(bool)), this, SLOT(getCalcuBackupGUIActive(bool))); // 重启服务器按钮信号槽 connect(ui->restartServerButton, SIGNAL(clicked()), this, SLOT(restartServer())); // 关闭服务器 connect(ui->closeServerButton, SIGNAL(clicked()), this, SLOT(closeServer())); // 初始时关闭所有提示灯 turnOffLights(); // 开启网络连接从控计算机提示灯 initConnectedSlaves(); /******设置采集机、备份机、相机的状态,正常或者不正常**********/ // statuscollectmessage为从控机发送过来的采集机和备份机的状态信息,如0表示正常,则显示为黄色,1表示异常,则显示为红色。 // if 采集机异常 // ui->slave1Label_net->setPixmap(QPixmap(":/image/lightred.png")); this->setWindowTitle(QObject::tr("铁路隧道建筑限界测量系统-主控终端")); QIcon icon; icon.addFile(QString::fromUtf8(":image/icon.png"), QSize(), QIcon::Normal, QIcon::Off); this->setWindowIcon(icon); // 功能,设置小图标变灰 ui->collectstatuslabel->setPixmap(QString::fromUtf8(":image//collectstatus1_2.png")); ui->backupstatuslabel->setPixmap(QString::fromUtf8(":image//up_alt_2.png")); ui->calculatestatuslabel->setPixmap(QString::fromUtf8(":image//Calculatorstatus1_2.png")); // 导入已有工程、创建新工程界面 CreateProjectWidget * cpwidget = new CreateProjectWidget(workingstatus, ui->createprojwidget); connect(cpwidget, SIGNAL(sendproject_file_name(QString)), this, SLOT(slotprojectfilename(QString))); connect(this, SIGNAL(setCreateProjectWidgetEnabled(bool)), cpwidget, SLOT(setWidgetEnabled(bool))); // @author 范翔 3个界面合二为一之后,关闭重启服务器两个按钮无效 ui->closeServerButton->setVisible(false); ui->restartServerButton->setVisible(false); if (workingstatus == Collecting) { // Tab界面布局 // ui->gridLayout_5是整个Window的最外层布局Layout。可从.ui文件中找出 ui->gridLayout_5->addWidget(ui->page, 4, 0); CollectWidget * collectWidget = new CollectWidget(ui->page, MasterSetting::getSettingInstance()->getDefaultDistanceMode()); QGridLayout *layout5 = new QGridLayout(); layout5->addWidget(collectWidget); ui->page->setLayout(layout5); // 得到帧间隔里程 connect(this, SIGNAL(sendproject_file_name(QString)), collectWidget,SLOT(getDistanceMode(QString))); // 界面信号槽 connect(this, SIGNAL(changeCameraStatus(QString,HardwareStatus)), collectWidget, SLOT(changeCamera(QString, HardwareStatus))); connect(this, SIGNAL(changeLayserStatus(QString,HardwareStatus)), collectWidget, SLOT(changeLayser(QString, HardwareStatus))); connect(this, SIGNAL(changeCameraFC(QString,qint64)), collectWidget, SLOT(changeCameraFC(QString, qint64))); connect(this, SIGNAL(changeSlaveCameraTask(WorkingStatus, QString, int, QString, QString)), collectWidget, SLOT(changeCameraTask(WorkingStatus, QString, int, QString, QString))); connect(this, SIGNAL(turnOffAllHardware()), collectWidget, SLOT(turnOffHardwares()), Qt::DirectConnection); collectWidget->turnOffHardwares(); // 【标记1】此处作废 // 因为有master的单一实例模式+各种对应方法,此处无需接受底层界面发送的消息了,因为底层界面可以直接调用各类主控方法 //connect(calcuWidget,SIGNAL(clicked111()),this,SLOT(sendToMaster(QString))); // 可以导入已有、创建新工程 connect(ui->operationConfigButton, SIGNAL(clicked()), this, SLOT(configCurrentOperation())); connect(ui->operationConfigButton2, SIGNAL(clicked()), this, SLOT(configCurrentOperation2())); // 初始时的界面显示 ui->page->setVisible(true); // projectclass projectclass = LzProjectClass::Collect; projectclassstr = "collect"; }
*/STATUS tcpServer (void) { struct sockaddr_in serverAddr; /* server's socket address */ struct sockaddr_in clientAddr; /* client's socket address */ int sockAddrSize; /* size of socket address structure */ int sFd; /* socket file descriptor */ int newFd; /* socket descriptor from accept */ int ix = 0; /* counter for work task names */ char workName[16]; /* name of work task */ int STOP_DISTANCE = 40; /* distance from the sensor to start slowing down */ int NUM_SPEED_STAGES = 1; /* number of speed stages to accel/decelerate */ int i,j,l; char sensorData; printf("TCP PCPCPCPCP PCAT CPTP"); /* set up the local address */ sockAddrSize = sizeof (struct sockaddr_in); bzero ((char *) &serverAddr, sockAddrSize); serverAddr.sin_family = AF_INET; serverAddr.sin_len = (u_char) sockAddrSize; serverAddr.sin_port = htons (SERVER_PORT_NUM); serverAddr.sin_addr.s_addr = htonl (INADDR_ANY); /* create a TCP-based socket */ if ((sFd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR) { perror ("socket"); return (ERROR); } /* bind socket to local address */ if (bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR) { perror ("bind"); close (sFd); return (ERROR); } /* create queue for client connection requests */ if (listen (sFd, SERVER_MAX_CONNECTIONS) == ERROR) { perror ("listen"); close (sFd); return (ERROR); } /* accept new connect requests and spawn tasks to process them */ if ((newFd = accept (sFd, (struct sockaddr *) &clientAddr, &sockAddrSize)) == ERROR) { perror ("accept"); close (sFd); return (ERROR); } sprintf (workName, "tTcpWork%d", ix++); printf("set up connection with tornado server\n"); /* Open Serial Port */ ser_fd = open("/tyCo/1",O_WRONLY, 0);printf("\nTrain id = %d",ENGINE_ADDRESS); if (ser_fd == -1) printf("\nSerial Port Not Open, error\n",ser_fd,0,0,0,0,0); else printf("\nSerial Port Open, fd = %d \n",ser_fd,0,0,0,0,0); /* Get the train moving to crusising speed */ for (i = 0; i < NUM_SPEED_STAGES; i++) { accelerateOneStage(); } while(1) { fflush(newFd); read(newFd, &sensorData, sizeof(int)); /* If the train is close to the station (arrival process) */ if ((int)sensorData < STOP_DISTANCE) { turnOnLights(); /* Decelerate to stop */ for (i = 0; i < NUM_SPEED_STAGES; i++ ) { decelerateOneStage(); } blowHornOnce(); /* The departure process starts around 60 seconds */ wait60sec(); blowHornOnce(); /* Get the train moving to cruising speed */ for (i = 0; i < NUM_SPEED_STAGES; i++ ) { accelerateOneStage(); } turnOffLights(); } } }