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

📄 run3.~pas

📁 dephi 7.0实现的TDMA工作原理.用于演示TDMA的工作流程
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
     begin
     for j:=0  to 5 do
        begin
        //memo1.lines.add('aduser['+inttostr(j+1)+']='+inttostr(aduser[j+1]));
        if aduser[in_user[i]]<aduser[timegap[j]]  then//假如加入的用户优先级高于正在占用时隙的用户
         begin
         //memo1.Lines.Add('加入的用户优先级高于正在占用时隙的用户');
         goon:=true;
         user_remain[timegap[j]]:=user_length[timegap[i]]-sended_data[timegap[i]];
         //memo1.Lines.Add('user_remain['+inttostr(timegap[j])+']='+inttostr(user_remain[timegap[j]]));

         timegap[j]:=in_user[i];
         user_length[in_user[i]]:=user_request[in_user[i]];
         //memo1.Lines.Add('user_length['+inttostr(j+1)+']='+inttostr(user_length[j+1]));
         end
        else if aduser[in_user[i]]>aduser[timegap[j]] then
          begin
          //goon:=false;
          memo1.Lines.Add('加入的用户优先级低于正在占用时隙的用户');
          //ask();
        end;
        end;
          if goon=true  then
         begin
         memo1.Lines.Add('加入的用户优先级高于正在占用时隙的用户');
         user_request[in_user[i]]:=0;
         ask();
         end;

         //memo1.Lines.Add('user_request['+inttostr(j+1)+']='+inttostr(user_request[j+1]));
     end;

        //user_wait[in_user[i]]:=user_request[in_user[i]];

end;

procedure Trunfrm3.ask();
var
  i,k:integer;
begin
{
for  i:=0 to 5 do
  begin
  if user_length[timegap[i]]-sended_data[timegap[i]]<=0 then //是否发送完了,发送完了
      user_length[timegap[i]]:=0;
   end;
for  k:=1 to 6 do
  begin

   if user_remain[k]>0  then
       begin
      user_request[k]:=user_length[k];
         if resend_state=true then
             sended_data[k]:=0;
      end;
   end;
   }
end;

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

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

procedure Trunfrm3.Timer1Timer(Sender: TObject);
var
   gap_temp:integer;
   user_now:integer;
   temp1,temp2:integer;
   target_dct,source_dct:TRect;
   i,j:integer;
   x:string;
begin

if tag=1 then
   begin
   memo1.lines.add('*********一帧数据开始**********');
   frame_count:=frame_count+1;
   label46.Caption:=inttostr(frame_count);
   for i:=0 to 8191 do
   y1[i]:=0;
   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();
   runfrm3.timer1.Enabled:=false;         //停止计时

   memo1.lines.add('★用户申请加入情况( 标号:用户号/ 值:用户数据长度):');
   for j:=1 to 6 do
   memo1.Lines.Add('user_request['+inttostr(j)+']='+inttostr(user_request[j]));

   request_hardware();   //发送请求队列
//   ask_hardware(); //询问硬件

   tag:=0;                        //计时归零
   memo1.Lines.add('\\\\\\\\\\\\\\\\\\\');
   memo1.lines.add('★用户由一帧上传递到下一帧的现有的 申请加入情况&传输数据长度:');
   for j:=1 to 6 do
   memo1.Lines.Add('user_request['+inttostr(j)+']='+inttostr(user_request[j])+'*');
   for j:=1 to 6 do
   memo1.Lines.Add('user_length['+inttostr(j)+']='+inttostr(user_length[j]));
   memo1.lines.add('*********一帧数据结束**********');
   memo1.lines.add('※※※※※※※※※※※※※※※※');
   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;
            memo1.Lines.add('@用户'+inttostr(user_now)+'数据已传输情况:');
            memo1.Lines.Add(inttostr(sended_data[user_now]));
            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 user_cancel[user_now]=true then
         //rvdata_show
         if b[user_now]=true then

             rvdata_show(user_now,gap_temp,frame_count,'b')
          else
          begin
         if sended_data[user_now]=user_length[user_now] then
            begin
            //用户数据发送完毕
            x:='Y';

            data_show(sended_data[user_now],user_now,'R');
            rvdata_show(user_now,gap_temp,frame_count,x);
            initialize_user(user_now);        //用户信息初始化
            user_cancel[user_now]:=true;      //用户加入撤销队列
            b[user_now]:=true;
            //x:='N';
            {
            //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 ;
         end;
          if user_now=0    then
             //x:='N';
         //else if user_cancel[timegap[gap_temp-1]]=true then
            //x:='N';
         //if x='N' 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;
      //x:='N';
end;



procedure Trunfrm3.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 Trunfrm3.BitBtn3Click(Sender: TObject);
begin
timer1.Enabled:=false;
timer_state:=false;
frame_count:=0;
//硬件初始化
//initialize_hardware();
end;

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

procedure Trunfrm3.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:='3';
      adduser2frm.visible:=true;
      adduser2frm.show;
      end;
   end
else
   begin
   //转入用户退出机制
   usercancel(k);
   end;
end;

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

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

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

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

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

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

procedure Trunfrm3.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;

end;

procedure Trunfrm3.FormCreate(Sender: TObject);
var
   i:integer;
   dct:TRect;
begin
if runfrm<>nil then
   begin
   runfrm.Close;
   runfrm.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;

aduser_state:=false;
timer1_a:=false;
timer_state:=false;
resend_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 Trunfrm3.BitBtn4Click(Sender: TObject);
begin
memo1.Clear;
end;

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

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

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

procedure Trunfrm3.creatdata();//k为用户号 ,g为时隙号
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 Trunfrm3.senddata() ;
var
   pdata:^byte;
   TWrite:TWriteParaIOThread;
   tempppp:array[0..131071] of byte;
   i:integer;
   min,max: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 (min=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;

end.

⌨️ 快捷键说明

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