⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit111.pas

📁 模型飞机测控平台是在模型飞机使用的设备基础上增加测量和控制设备.
💻 PAS
📖 第 1 页 / 共 3 页
字号:
       MemsStrArray[3]:=FloatToStrF((5.0/4095.0)*((15 and MemsDataArray[6])*256+MemsDataArray[7]-(15 and MemsDataArrayZero[6])*256-MemsDataArrayZero[7]),ffFixed,4,2);
       MemsStrArray[4]:=FloatToStrF((5.0/4095.0)*((15 and MemsDataArray[8])*256+MemsDataArray[9]-(15 and MemsDataArrayZero[8])*256-MemsDataArrayZero[9]),ffFixed,4,2);
       MemsStrArray[5]:=FloatToStrF((5.0/4095.0)*((15 and MemsDataArray[10])*256+MemsDataArray[11]-(15 and MemsDataArrayZero[10])*256-MemsDataArrayZero[11]),ffFixed,4,2);
       MemHeight:=0.26*((15 and MemsDataArray[12])*256+MemsDataArray[13]-(15 and MemsDataArrayZero[12])*256-MemsDataArrayZero[13]);
       MemsStrArray[6]:=FloatToStrF(MemHeight,ffFixed,4,2);
       MemsStrArray[7]:=FloatToStrF(0.00244*((15 and MemsDataArray[14])*256+MemsDataArray[15]),ffFixed,4,2);
       tmpDbl:=(5.0/4095.0)*((15 and MemsDataArray[16])*256+MemsDataArray[17]);
       tmpDbl:=1.048*sqrt(2*1000*(tmpDbl+0.2947)/(1.25*4.67652));//
       MemsStrArray[8]:=FloatToStrF(tmpDbl,ffFixed,4,2);
       kMemHeight:=0.26*((15 and MemsDataArray[18])*256+MemsDataArray[19]-(15 and MemsDataArrayZero[18])*256-MemsDataArrayZero[19]);
       MemsStrArray[9]:=FloatToStrF(kMemHeight,ffFixed,4,2);

       DspContrValue[0]:=MemsDataArray[20]*256+MemsDataArray[21];
       DspContrStr[0]:=IntToStr(DspContrValue[0]);
       DspContrValue[1]:=MemsDataArray[22]*256+MemsDataArray[23];
       DspContrStr[1]:=IntToStr(DspContrValue[1]);
       ContrValue[0]:=2290-MemsDataArray[24]*256-MemsDataArray[25];
       ContrStr[0]:=IntToStr(ContrValue[0]);
       ContrValue[1]:=2580-MemsDataArray[26]*256-MemsDataArray[27];
       ContrStr[1]:=IntToStr(ContrValue[1]);
    end;
    if GpsNewDataFlag =True then
    begin
        tmpSInt:=GpsDataArray[0]*256+GpsDataArray[1];//动向 x
        tmpSInt1:=GpsDataArray[2]*256+GpsDataArray[3];//北向 y
        XPoint:=0.1*tmpSInt;
        YPoint:=0.1*tmpSInt1;
        if (abs(XPoint-posXArray[posLength-1])<100) and (abs(YPoint-posYArray[posLength-1])<100) then //filter
        begin
                posXArray[posLength] := XPoint;
                posYArray[posLength] := YPoint;
                inc(posLength);
                if posLength = Length(posXArray) then
                begin
                      SetLength(posXArray,posLength+1000);
                      SetLength(posYArray,posLength+1000);
                end;
        end;
        GpsStrArray[0]:=FloatToStrF(XPoint,ffFixed,4,2);//X;
        GpsStrArray[1]:=FloatToStrF(YPoint,ffFixed,4,2);//Y;

        tmpSInt:=((GpsDataArray[4]*256+GpsDataArray[5])shr 1);
        tmpDbl:=0.514*0.02*tmpSInt;
        GpsSpeed:=Round(tmpDbl);
        GpsStrArray[2]:=FloatToStrF(tmpDbl,ffFixed,4,1);              //速度 m/s
        GpsStrArray[4]:=FloatToStrF(3.6*tmpDbl,ffFixed,4,1);          //km/h

        tmpSInt:=((GpsDataArray[6]*256+GpsDataArray[7])shr 1);
        tmpDbl:=0.02*tmpSInt;
        GpsNavAngel:=Round(tmpDbl);
        GpsStrArray[3]:=FloatToStrF(tmpDbl,ffFixed,4,1);//航向
   end;
end;

procedure TSerialInThread.PostData ;
var
    tmpDbl:double;
    i:integer;
    tmpStr:String;
begin
    Form1.RchdtSerialIn.Text:=SerialStr;
    DownStr:=DownStr+SerialStr;
    if Seriallength>0 then
    begin
        Form1.RchdtSerialIn.SelStart := Length(Form1.RchdtSerialIn.Text)-Seriallength;
        Form1.RchdtSerialIn.Perform(EM_SCROLLCARET, 0, 0);
    end;        
    if MemsNewDataFlag =True then
    begin
       MemsNewDataFlag:=False;
       Form1.lbGyroY.Caption:=MemsStrArray[0];
       Form1.lbGyroX.Caption:=MemsStrArray[1];
       Form1.lbGyroZ.Caption:=MemsStrArray[2];
       Form1.lbAccY.Caption:=MemsStrArray[3];
       Form1.lbAccX.Caption:=MemsStrArray[4];
       Form1.lbAccZ.Caption:=MemsStrArray[5];
       Form1.lbRawHeight.Caption:=MemsStrArray[6];
       Form1.lbSystemVolt.Caption:=MemsStrArray[7];
       Form1.lbRevs1.Caption:=MemsStrArray[8];
       Form1.lbAilSpeed.Caption:=MemsStrArray[9];

       Form1.sldHeight.Caption:=MemsStrArray[6];
       Form1.sldHeight.Pointers.Item(1).Value:=MemHeight;

       Form1.srsRawHeight.AddY(MemHeight);
//       Form1.SrsKalmanHeight.AddY(kMemHeight);

       Form1.srsControlAil.AddY(DspContrValue[0]);
       Form1.srsControlEle.AddY(DspContrValue[1]);

       Form1.srsRawAil.AddY(ContrValue[0]);
       Form1.srsRawEle.AddY(ContrValue[1]);

       Form1.srsGyroY.AddY(GyroDataArray[0]);
       Form1.srsGyroX.AddY(GyroDataArray[1]);
       Form1.srsGyroZ.AddY(GyroDataArray[2]);

       Form1.lbControlAil.Caption:=DspContrStr[0];
       Form1.lbControlEle .Caption:=DspContrStr[1];
       Form1.lbRawAil .Caption:=ContrStr[0];
       Form1.lbRawEle .Caption:=ContrStr[1];

   end;
   if GpsNewDataFlag =True then
   begin
       GpsNewDataFlag:=False;
       Form1.lbGpsX.Caption:=GpsStrArray[0];
       Form1.lbGpsY.Caption:=GpsStrArray[1];
       Form1.lbGpsSpeed.Caption:=GpsStrArray[4];
       Form1.sldSpeed.Pointers.Item(1).Value:=Int(GpsSpeed);
       Form1.sldSpeed.Caption:=GpsStrArray[2];

       if (GpsNavAngel<360) and (GpsNavAngel>=0) then
         Form1.sldNavAngel.Pointers.Item(1).Value:=Int(GpsNavAngel);
       Form1.sldNavAngel.Caption:=GpsStrArray[3];
       Form1.lbGpsNav.Caption:=GpsStrArray[3];

       Form1.DrawAxis;
   end;
   if AgueNewDataFlag then
   begin
       AgueNewDataFlag:=False;
       Form1.lbAgue0.Caption:=IntToStr(AgueDataArray[0]);
       Form1.lbAgue1.Caption:=IntToStr(AgueDataArray[1]);
       Form1.lbAgue2.Caption:=IntToStr(AgueDataArray[2]);
       Form1.lbAgue3.Caption:=IntToStr(AgueDataArray[3]);
       Form1.lbAgue4.Caption:=IntToStr(AgueDataArray[4]);
       Form1.lbAgue5.Caption:=IntToStr(AgueDataArray[5]);
       Form1.lbAgue6.Caption:=IntToStr(AgueDataArray[6]);
       Form1.lbAgue7.Caption:=IntToStr(AgueDataArray[7]);
       Form1.lbAgue8.Caption:=IntToStr(AgueDataArray[8]);
       Form1.lbCurModel.Caption:=IntToHex(AgueDataArray[10],2);
       Form1.lbModel.Caption:=Form1.lbCurModel.Caption;
       Form1.lbDspControl.Caption:=IntToStr(AgueDataArray[11]);
       Form1.lbHegihtD.Caption :=IntToStr(AgueDataArray[12]);
       Form1.lbRollD.Caption :=IntToStr(AgueDataArray[13]-128);
       Form1.lbDefD.Caption :=IntToStr(AgueDataArray[14]-128);
       
       Form1.lbModel1.Caption:=LowerCase(IntToHex(AgueDataArray[15],2));
       Form1.lbModel2.Caption:=LowerCase(IntToHex(AgueDataArray[16],2));
       Form1.lbModel3.Caption:=LowerCase(IntToHex(AgueDataArray[17],2));
       Form1.lbModel4.Caption:=LowerCase(IntToHex(AgueDataArray[18],2));
       
       if ControlFlag then
       begin
          tmpStr:=IntToStr(StartControlCount);
          if AgueDataArray[11]=0 then
          begin
              ControlFlag:=False;
              MemsStr:=MemsStr+chr(13) + chr(10)+'Stop Control:'+IntToStr(AgueDataArray[10])+' '+tmpStr+chr(13) + chr(10);
              GpsStr1:=GpsStr1+chr(13) + chr(10)+'Stop Control:'+IntToStr(AgueDataArray[10])+' '+tmpStr+chr(13) + chr(10);
          end;
       end
       else
       begin
          tmpStr:=IntToStr(StartControlCount);
          if AgueDataArray[11]=1 then
          begin
              ControlFlag:=True;
              inc(StartControlCount);
              MemsStr:=MemsStr+chr(13) + chr(10)+chr(13) + chr(10)+'Start Control:'+IntToStr(AgueDataArray[10])+' '+tmpStr+chr(13) + chr(10);
              GpsStr1:=GpsStr1+chr(13) + chr(10)+chr(13) + chr(10)+'Start Control:'+IntToStr(AgueDataArray[10])+' '+tmpStr+chr(13) + chr(10);
          end;
       end;
   end;
end;

procedure TSerialInThread.Execute;
var
     tmpInt,i:Integer;

begin
  FreeOnTerminate:=True;
  GetData;
  if WaitForSingleObject(hMutex,InFinite) =WAIT_OBJECT_0 then
  begin
    SerialStr:='';
    if Seriallength >0 then
    begin
      for i:= 0 to Seriallength-1 do
        begin
          tmpInt:=SerialInput[i];//tmp
          curStr:=LowerCase(IntToHex(tmpInt,2));
          SerialStr :=SerialStr + curStr+' ';
          begin
            if (curStr='fe') and (not MemsDataFlag)and (not GpsDataFlag) and (not AgueDataFlag)then
            begin
              if AgueDataFlagFirst then
              begin
                 AgueDataFlag:=True;
                 AgueDataFlagFirst:=False;
                 NewOneFlag:=True;
                 AgueDataCount:=0;
              end
              else
              begin
                 AgueDataFlagFirst:=True;
                 GpsDataFlagFirst:=False;
                 MemsDataFlagFirst:=False;
              end;
            end
            else if (curStr='fc') and  (not MemsDataFlag)and (not GpsDataFlag)and (not AgueDataFlag) then
            begin
              if GpsDataFlagFirst then
                 begin
                   GpsDataFlag:=True;
                   NewOneFlag:=True;
                   GpsDataFlagFirst:=False;
                   GpsDataCount:=0;
                 end
              else
              begin
                 AgueDataFlagFirst:=False;
                 GpsDataFlagFirst:=True;
                 MemsDataFlagFirst:=False;
              end;
            end
            else if (curStr='fd') and (not GpsDataFlag) and (not MemsDataFlag)and (not AgueDataFlag) then
            begin
              if MemsDataFlagFirst then
              begin
                MemsDataFlag:=True;
                NewOneFlag:=True;
                MemsDataFlagFirst:=False;
                MemsDataCount:=0;
             end
             else
             begin
               AgueDataFlagFirst:=False;
               GpsDataFlagFirst:=False;
               MemsDataFlagFirst:=True;
             end;
          end
          else if AgueDataFlag then
          begin
             AgueDataArray[AgueDataCount]:=tmpInt;
             inc(AgueDataCount);
             TempAgueStr:=TempAgueStr+curStr+' ';
             if AgueDataCount=AgueDataCountMax then
             begin
                AgueDataFlag:=False;
                AgueNewDataFlag:=True;
                AgueDataCount:=0;
                AgueStr:=AgueStr+TempAgueStr+chr(13) + chr(10);
                FormatDownStr:= FormatDownStr+TempAgueStr+chr(13) + chr(10);
                TempAgueStr:='';
             end;
           end
           else if GpsDataFlag then
           begin
             GpsDataArray[GpsDataCount]:=tmpInt;
             inc(GpsDataCount);
             NewOneFlag:=not NewOneFlag;
             if NewOneFlag then
              TempGpsStr1:=TempGpsStr1+curStr+' '
             else
              TempGpsStr1:=TempGpsStr1+curStr;
             if GpsDataCount=GpsDataCountMax then
             begin
               GpsDataFlag:=False;
               GpsNewDataFlag:=True;
               GpsDataCount:=0;
               GpsStr1:=GpsStr1+TempGpsStr1 +chr(13) + chr(10);
               FormatDownStr:= FormatDownStr+TempGpsStr1+chr(13) + chr(10);
               TempGpsStr1:='';
               end;
             end
             else if MemsDataFlag then
             begin
               MemsDataArray[MemsDataCount]:=tmpInt;
               inc(MemsDataCount);
               NewOneFlag:=not NewOneFlag;
               if  NewOneFlag then
                  TempMemsStr:=TempMemsStr+curStr+' '
               else
                  TempMemsStr:=TempMemsStr+curStr;
                  if MemsDataCount=MemsDataCountMax then
                  begin
                    MemsDataFlag:=False;
                    MemsNewDataFlag:=True;
                    MemsDataCount:=0;
                    MemsStr:=MemsStr+TempMemsStr +chr(13) + chr(10);
                    FormatDownStr:= FormatDownStr+TempMemsStr+chr(13) + chr(10);
                    TempMemsStr:='';
                  end;
                end;
              end;
        end;
        SaveFormatData();
        PostData;
        end;
     end;
     ReleaseMutex(hMutex);
end;

{//}
procedure TForm1.btnSendCodeClick(Sender: TObject);
begin
   if not MSComm1.PortOpen then
   begin
     MSComm1.CommPort :=cmbbxSerialIn.ItemIndex +1;
     MSComm1.Settings :=cmbbxBaudIn.Items[cmbbxBaudIn.ItemIndex]+',n,8,1';
     MSComm1.InputMode  :=1;
     MSComm1.PortOpen := True;
  end;     

   TSerialOutThread.Create(False);

   if rdbtnCode.Checked=False  then
     rchdtSerialOutEvent.Text:=chr(13) + chr(10)+':'+rchdtSerialOut.Text +chr(13) + chr(10)+rchdtSerialOutEvent.Text   
   else
     rchdtSerialOutEvent.Text:=chr(13) + chr(10)+':'+edtSerialOut1.Text +' '+edtSerialOut2.Text
              +' '+edtSerialOut3.Text+' '+edtSerialOut4.Text+rchdtSerialOutEvent.Text;
end;

procedure TForm1.btnHeightorSaveClick(Sender: TObject);
  var
    fileName:String;
begin
  begin
    fileName := '高度信号和舵机输出';
    if dlgDataSave.Execute then
    begin
      fileName:=dlgDataSave .FileName ;
      ChartHeightor.SaveToBitmapFile(fileName+'_Height.bmp');
      ChartControl.SaveToBitmapFile(fileName+'_Control.bmp');
      ChartGyro.SaveToBitmapFile(fileName+'_Gyro.bmp');
    end;
  end;
end;

procedure TForm1.btnHeightorClearClick(Sender: TObject);
begin
  srsControlAil.Clear;
  srsControlEle.Clear;
  srsRawAil.Clear;
  srsRawEle.Clear;
//  srsKalmanHeight.Clear;
  srsRawHeight.Clear;
  srsGyroX.Clear;
  srsGyroY.Clear;
  srsGyroZ.Clear;
end;

procedure TForm1.btnOpenSerialClick(Sender: TObject);
begin
   btnHeightorClearClick(Sender);

   posLength:=0;
   posXArray[posLength] := 0;
   posYArray[posLength] := 0;
   inc(posLength);
   DrawAxis;

   DownStr:='';
   MemsStr:='';
   GpsStr1:='';
   AgueStr:='';
   FormatDownStr:='';
   
   GPSDataFlag:=False;
   MemsDataFlag:=False;
   AgueDataFlag:=False;
   GPSDataFlagFirst:=False;
   MemsDataFlagFirst:=False;
   AgueDataFlagFirst:=False;

   MemsNewDataFlag:=False;
   GPSNewDataFlag:=False;

   MemsDataCount:=0;
   GpsDataCount:=0;
   StartControlCount:=0;

   if MSComm1.PortOpen then
       MSComm1.PortOpen :=False;
   MSComm1.CommPort :=cmbbxSerialIn.ItemIndex +1;
   MSComm1.Settings :=cmbbxBaudIn.Items[cmbbxBaudIn.ItemIndex]+',n,8,1';
   MSComm1.InputMode  :=1;
   MSComm1.PortOpen := True;
   RchdtSerialIn .Text :='';

   tmrSerial .Interval :=350;
   tmrSerial .Enabled :=True;
   btnOpenSerial.Enabled :=False;
   btnAllStart.Enabled :=False;
   cmbbxSerialIn.Enabled :=False;

   btnCloseSerial.Enabled :=True;
   btnHeightorClearClick(Sender);
end;

procedure TForm1.DrawAxis;
var
  step,i,x,y,wid,h: Integer;
  pstep,ratio,maxV : double;
  can: TMetaFileCanvas;
begin
  can := TMetaFileCanvas.Create(gpsMeta,0);
  gpsMeta.Width := ImgTrace.Width;
  gpsMeta.Height := ImgTrace.Height;
  wid := gpsMeta.Width;
  h := gpsMeta.Height;
  maxV := GetMaxValue(posXArray,posYArray,posXArrayLoad,posYArrayLoad,posLength,posLengthLoad);
  if maxV = 0 then
    maxV := 100;
  if maxV <= 10 then
  begin
    maxV := 10;
    step := 1;
  end
  else if maxV <= 100 then
  begin
    maxV := 100;
    step := 10;
  end
  else if maxV <= 200 then
    maxV := 200
  else if maxV<= 500 then
    maxV := 500
  else if maxV <= 1000 then
  begin
    maxV := 1000;
    step := 100;
  end
  else if maxV<= 2000 then
    maxV := 2000
  else if maxV<= 5000 then
    maxV := 5000
  else if maxV <= 10000 then
  begin
    maxV := 10000;
    step := 1000;
  end
  else if maxV<= 50000 then
    maxV := 50000
  else if maxV <=100000 then
  begin
    maxV := 100000;
    step := 10000;
  end
  else
  begin
    maxV := 1000000;
    step := 100000;
  end;
  can.Pen.Color := clBlack;
  can.Pen.Style :=  psSolid;
  can.MoveTo(0,h div 2);
  can.LineTo(wid,h div 2);
  can.MoveTo(wid div 2,0);
  can.LineTo(wid div 2, h);
  can.Font.Height := 15;
  can.Font.Name := 'Arial';
  can.TextOut(0,h div 2 +1,IntToStr(-1*round(maxV)));
  can.TextOut(wid-can.TextWidth(IntToStr(round(maxV))),h div 2 +1,IntToStr(round(maxV)));
  can.TextOut(wid div 2+3,h-can.TextHeight(IntToStr(-1*round(maxV))),IntToStr(-1*round(maxV)));
  can.TextOut(wid div 2+1,0,IntToStr(round(maxV)));
  pstep := wid / 20;
  for i:=0 to 21 do
  begin
    can.MoveTo(round(pstep*i),h div 2 - 2);
    can.LineTo(round(pstep*i),h div 2);
    can.MoveTo(wid div 2,round(pstep*i));
    can.LineTo(wid div 2 + 2, round(pstep*i));
  end;
  if posLengthLoad > 0 then
  begin
    can.Pen.Color := clRed;
    ratio := h / maxV / 2;
    x := round(posXArrayLoad[0]*ratio + wid/2);
    y := round(h/2-posYArrayLoad[0]*ratio);
    can.MoveTo(x,y);
    can.Pixels[x,y] := clRed;
    for i:= 1 to posLengthLoad-1 do
    begin
      x := round(posXArrayLoad[i]*ratio + wid/2);
      y := round(h/2 - posYArrayLoad[i]*ratio);
      can.LineTo(x,y);
    end;
  end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -