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