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

📄 run.~pas

📁 dephi 7.0实现的TDMA工作原理.用于演示TDMA的工作流程
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
      sended_data_temp[max_user]:=sended_data_temp[max_user]+1;

      //分配时隙
      timegap[i]:=max_user;
      end;


  end;

  //处理用户退出请求
for i:=1 to 6 do
   begin
   if user_cancel[i]=true then      //用户退出
      begin
      //回收已分配给用户i的时隙
      for j:=0 to 5 do
         begin
         if timegap[j]=i then
            timegap[j]:=0;
         end;
      //接受撤销请求,用户初始化
      initialize_user(i);
      end;
   end;

//确定阻塞用户
for i:=1 to 6 do
   begin
   if check_box[i].Checked then               //用户有数据要传输
      begin
      user_stop[i]:=true;
      for ii:=0 to 5 do
         begin
         if timegap[ii]=i then
            user_stop[i]:=false;
         end;
      end;
   end;

   //激发硬件回答过程
   hardware_answer();
end;

procedure Trunfrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
Mainfrm.ActiveMDIChild.WindowState:=wsMaximized;
end;

procedure Trunfrm.FormDestroy(Sender: TObject);
begin
runfrm:=nil;
end;

procedure Trunfrm.Timer1Timer(Sender: TObject);
var
   gap_temp:integer;
   user_now:integer;
   temp1,temp2:integer;
   target_dct,source_dct:TRect;
   i:integer;
begin
if tag=1 then
   begin
   frame_count:=frame_count+1;
   label46.Caption:=inttostr(frame_count);
 //  for i:=0 to 5 do
 //     memo1.lines.add(inttostr(timegap[i])); 
   end;

//时隙计时器
if timer1_a=true then
   begin
   tag:=0;
   timer1_a:=false;
   end;
label1.Caption:=inttostr(tag div 2);
target_dct:=rect(0,0,32,32);
source_dct:=rect(0,0,32,32);

if tag=14 then
   begin
   //询问硬件下一帧的情况,并等待串口回复
   initialize_image_state();
   timer1.Enabled:=false;         //停止计时
   tag:=0;
   if mode_select=2 then
    begin
   try                       //计时归零
   request_hardware();   //发送请求队列
   except
   on EInvalidPointer do
   end;
   end
   else if mode_select=3 then
    begin
   try                       //计时归零
   request_hardware();   //发送请求队列
   except
   on EAccessViolation do
   end;
   end;
  // ask_hardware(); //询问硬件

   end
else
   begin
   if tag in[2,4,6,8,10,12] then            //偶数Tag刷新发送数据显示
      begin
      initialize_image_state();
      gap_temp:=(tag div 2)-1;
      user_now:=timegap[gap_temp];              //当前时隙被哪个用户占用  0:无用户通信   1~6:用户号
      if user_now<>0 then
         begin
         {
         if sended_data[user_now]=user_length[user_now] then
            begin
            //用户数据发送完毕     用户信息初始化
            //initialize_user(user_now);
            timegap[user_now-1]:=0;   //释放时隙
            end
            }
        // else
         if sended_data[user_now]<user_length[user_now] then            //用户数据尚未发送完
            begin
            sended_data[user_now]:=sended_data[user_now]+1;
            temp1:=user_length[user_now]-sended_data[user_now];
            image_state[user_now].Canvas.CopyRect(target_dct,image_tran.Canvas,source_dct);      //状态显示
            user_state_label[user_now].Caption:='数据传输中';
            data_show(temp1,user_now,'S');                             //画图区显示
            end;
         end;
      end
   else if tag in [3,5,7,9,11,13] then      //奇数Tag刷新接收数据显示
      begin
      gap_temp:=(tag div 2)-1;
      user_now:=timegap[gap_temp];
      if user_now<>0 then
         begin
         if sended_data[user_now]=user_length[user_now] then
            begin
            //用户数据发送完毕
            data_show(sended_data[user_now],user_now,'R');
            rvdata_show(user_now,gap_temp,frame_count,'Y');
            initialize_user(user_now);        //用户信息初始化
            user_cancel[user_now]:=true;      //用户加入撤销队列
            {
            //show
            if label19.Caption='' then
               label19.Caption:=inttostr(user_now)
            else
               label19.Caption:=label19.Caption+'、'+inttostr(user_now);
            }
            user_request_label[user_now].Caption:='请求退出';
          //  timegap[gap_temp]:=0;   //释放时隙
            end
         else if sended_data[user_now]<user_length[user_now] then            //用户数据尚未发送完
            begin
            temp2:=sended_data[user_now];
            data_show(temp2,user_now,'R');
            rvdata_show(user_now,gap_temp,frame_count,'Y');                                  //画图区显示
            end;
         end
         else if user_now=0 then
            rvdata_show(user_now,gap_temp,frame_count,'N');
      end;
   end;
   {
   if protect_gap=true then
     begin
      timer1.Enabled:=false;
      label48.Caption:='开';
      TimeDelay(100);
      end;
      }
 //     timer1.Enabled:=true;
 //     label48.Caption:='关';
      tag:=tag+1;
end;



procedure Trunfrm.BitBtn2Click(Sender: TObject);
begin
if BitBtn2.Caption='暂停' then
   begin
   BitBtn2.Caption:='继续';
   timer1.Enabled:=false;
   timer_state:=false;
   end
else if BitBtn2.Caption='继续' then
   begin
   BitBtn2.Caption:='暂停';
   timer1.Enabled:=true;
   timer_state:=true;
   end;

end;

procedure Trunfrm.BitBtn3Click(Sender: TObject);
begin
timer1.Enabled:=false;
timer_state:=false;
frame_count:=0;
//硬件初始化
//initialize_hardware();
end;

procedure Trunfrm.BitBtn1Click(Sender: TObject);
begin
timer1_a:=true;
timer1.Enabled:=true;
timer_state:=true;
frame_count:=0;
end;

procedure Trunfrm.checkbox_click(k:integer);
begin
if Check_Box[k].Checked then
   begin
   //检查用户是否在取消队列中
   if user_cancel[k]=true then
      begin
      showmessage('用户已请求退出,若要重新发送,请在下一帧发出请求');
      Check_Box[k].Checked:=false;
      end
   else
      begin
      timer1.Enabled:=false;     //暂停
      adduser_no:=k;               //添加用户1
      a:='1';
      if mode_select=1 then
         begin
         adduserfrm.visible:=true;
         adduserfrm.show;
         end
      else if mode_select=2 then
         begin
         adduser2frm.visible:=true;
         adduser2frm.show;
         end
      else if mode_select=3 then
         begin
         adduserfrm.Visible:=true;
         adduserfrm.Show;
         end;
      end;
   end
else
   begin
   //转入用户退出机制
   usercancel(k);
   end;
end;

procedure Trunfrm.CheckBox1Click(Sender: TObject);
begin
checkbox_click(1);
end;

procedure Trunfrm.CheckBox2Click(Sender: TObject);
begin
checkbox_click(2);
end;

procedure Trunfrm.CheckBox3Click(Sender: TObject);
begin
checkbox_click(3);
end;

procedure Trunfrm.CheckBox4Click(Sender: TObject);
begin
checkbox_click(4);
end;

procedure Trunfrm.CheckBox5Click(Sender: TObject);
begin
checkbox_click(5);
end;

procedure Trunfrm.CheckBox6Click(Sender: TObject);
begin
checkbox_click(6);
end;

procedure Trunfrm.initialize_image_label();
begin
image_datas[1]:=image_data1;
image_datas[2]:=image_data2;
image_datas[3]:=image_data3;
image_datas[4]:=image_data4;
image_datas[5]:=image_data5;
image_datas[6]:=image_data6;

image_S[1]:=Image2;
image_S[2]:=Image4;
image_S[3]:=Image6;
image_S[4]:=Image8;
image_S[5]:=Image10;
image_S[6]:=Image12;

image_R[1]:=Image3;
image_R[2]:=Image5;
image_R[3]:=Image7;
image_R[4]:=Image9;
image_R[5]:=Image11;
image_R[6]:=Image13;

image_state[1]:=Image14;
image_state[2]:=Image15;
image_state[3]:=Image16;
image_state[4]:=Image17;
image_state[5]:=Image18;
image_state[6]:=Image19;

check_box[1]:=checkbox1;
check_box[2]:=checkbox2;
check_box[3]:=checkbox3;
check_box[4]:=checkbox4;
check_box[5]:=checkbox5;
check_box[6]:=checkbox6;

timegap_state_label[1]:=label26;
timegap_state_label[2]:=label27;
timegap_state_label[3]:=label28;
timegap_state_label[4]:=label29;
timegap_state_label[5]:=label30;
timegap_state_label[6]:=label31;

user_state_label[1]:=label33;
user_state_label[2]:=label34;
user_state_label[3]:=label35;
user_state_label[4]:=label36;
user_state_label[5]:=label37;
user_state_label[6]:=label38;

user_request_label[1]:=label39;
user_request_label[2]:=label40;
user_request_label[3]:=label41;
user_request_label[4]:=label42;
user_request_label[5]:=label43;
user_request_label[6]:=label44;

user_pri_label[1]:=label50;
user_pri_label[2]:=label51;
user_pri_label[3]:=label52;
user_pri_label[4]:=label53;
user_pri_label[5]:=label54;
user_pri_label[6]:=label55;

end;

procedure Trunfrm.FormCreate(Sender: TObject);
var
   i:integer;
   dct:TRect;
begin
if runfrm3<>nil then
   begin
   runfrm3.Close;
   runfrm3.Destroy;
   end;

initialize_image_label();             //图标、文字初始化

for i:=0 to 5 do
   begin
   timegap[i]:=0;
   user_length[i+1]:=0;
   sended_data[i+1]:=0;
   user_request[i+1]:=0;
   end;

timer1_a:=false;
timer_state:=false;

for i:=1 to 6 do
   begin
   image_S[i].Canvas.Brush.Color:=RGB(165,203,247);
   Dct:=Rect(0,0,160,16);
   image_S[i].Canvas.FillRect(Dct);
   image_R[i].Canvas.Brush.Color:=RGB(165,203,247);
   Dct:=Rect(0,0,160,16);
   image_R[i].Canvas.FillRect(Dct);
   end;

frame_count:=0;

end;

procedure Trunfrm.BitBtn4Click(Sender: TObject);
begin
memo1.Clear;
end;

procedure Trunfrm.RadioButton2Click(Sender: TObject);
begin
timer1.Interval:=500;
end;

procedure Trunfrm.RadioButton1Click(Sender: TObject);
begin
timer1.Interval:=1000;
end;

procedure Trunfrm.RadioButton3Click(Sender: TObject);
begin
timer1.Interval:=250;
end;

procedure Trunfrm.creatdata();  //根据 timergap 生成数据
var
   i:integer;
begin
for i:=0 to 8191 do
   y1[i]:=0;

for i:=0 to 1023 do
   begin
   y1[i]:=user_data_da[timegap[0]][i];
   end;

for i:= 1363 to 2386 do
   begin
   y1[i]:=user_data_da[timegap[1]][i-1363];
   end;

for i:=2726 to 3749 do
   begin
   y1[i]:=user_data_da[timegap[2]][i-2726];
   end;

for i:=4089 to 5112 do
   begin
   y1[i]:=user_data_da[timegap[3]][i-4089];
   end;

for i:=5452 to 6475 do
   begin
   y1[i]:=user_data_da[timegap[4]][i-5452];
   end;

for i:=6815 to 7838 do
   begin
   y1[i]:=user_data_da[timegap[5]][i-6815];
   end;

end;

procedure Trunfrm.senddata() ;
var
   pdata:^byte;
   TWrite:TWriteParaIOThread;
   tempppp:array[0..131071] of byte;
   i:integer;
   max,min:double;
begin
OpenGPIO();
write37a($f0);
write37a($f4);
write37a($f5);
Writing:=false;

max:=y1[0];
min:=y1[0];
for i:=0 to 8191 do
   begin
   if y1[i]>max then
      max:=y1[i];
   if y1[i]<min then
      min:=y1[i];
   end;

for i:=0 to 8191 do
   begin
   if (max=0)and(min=0) then
      tempppp[i]:=0
   else
      tempppp[i]:=byte(round((y1[i]-min)*80/(max-min)+128));
   end;

pdata:=@tempppp;
TWrite:=TWriteParaIOThread.Create(False, Handle, pdata);
end;


procedure Trunfrm.BitBtn5Click(Sender: TObject);
begin
 timer1.enabled:=true; 
end;

end.

⌨️ 快捷键说明

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