📄 run3.~pas
字号:
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 + -