📄 deamon.c
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <CsAgb.h>
#include <rbasic.h>
#define end_tp 8
extern int get_para(char *exp,double *nump,char *strp,char *tp);
struct deamon_mes
{
u8 isrun;//是否正在运行
u16 dcount;//剩余次数
u8 dfreq;//频率
u8 dwait;//剩余等待时间
u32 dpc;//入口地址
u32 dbas;//代码基址
};
struct deamon_mes rb_deamon;
void rb_set_deamon(u16 dcount,u8 dfreq,u32 dpc)
{
if (rb_deamon.isrun || dfreq==0 || dcount==0 || rb_deamon.dpc!=0)
{
rb_error=30;
return;
}
rb_deamon.isrun=1;
rb_deamon.dcount=dcount-1;
rb_deamon.dfreq=dfreq;
rb_deamon.dpc=dpc;
rb_deamon.dbas=rb_bas;
}
void rb_set_deamon_freq(u8 dfreq)
{
rb_deamon.dfreq=dfreq;
}
void rb_set_deamon_count(u16 dcount)
{
rb_deamon.dcount=dcount;
}
void rb_dends()
{
rb_deamon.isrun=0;
if (rb_deamon.dcount==0) return;
rb_deamon.dcount--;
rb_deamon.dwait=rb_deamon.dfreq;
}
void rb_deamon_run()
{
int sp;
u8 xp=rb_xp,yp=rb_yp;//save loc
u32 pc_sv=rb_pc;//保存当前
u32 bas_sv=rb_bas;//保存代码基址
char temp[str_max_len];
rb_deamon.dwait=rb_deamon.dfreq;
rb_deamon.isrun=1;//置DEAMON为运行态
rb_pc=rb_deamon.dpc;
rb_bas=rb_deamon.dbas;
rb_codes=(char *)rb_bas;
is_basic_run=1;
rb_codes=(char *)rb_bas;
while (rb_pc<rb_clen && rb_error==0 && is_basic_run!=basic_dend)
{
sp=0;
temp[sp]=rb_codes[rb_pc];
while (temp[sp]!=end_tp)
{
sp++;
rb_pc++;
temp[sp]=rb_codes[rb_pc];
}
temp[sp]='\0';
rb_pc++;
if (temp[0]!='@') rb_run(temp);
}
rb_pc=pc_sv;//恢复数据
rb_bas=bas_sv;
rb_xp=xp;
rb_yp=yp;
is_basic_run=basic_dend;
return;
}
void rb_deamon_clear()
{
rb_deamon.dpc=0;
rb_deamon.dcount==0;
rb_deamon.isrun=0;
}
void rb_deamons()
{
//rb_say_error("Hi.\n");
if (rb_deamon.dcount==0 || rb_deamon.dpc==0) return;//没有DEAMR语句
if (rb_deamon.isrun) return;//DEAMON正在运行
if (rb_deamon.dwait>1) rb_deamon.dwait--;//尚需等待
else rb_deamon_run();
}
void rb_deamon_com(char *exp)
{
double x[2];
if (get_para(exp,x,NULL,"2NN")) return;//取得参数
rb_set_deamon(x[0],x[1],rb_pc);
if (rb_error) return;
}
void rb_dend(char *exp)
{
rb_dends();
is_basic_run=basic_dend;
}
void rb_dcnt(char *exp)
{
rb_set_deamon_count(rb_cal(exp));
}
void rb_dfrq(char *exp)
{
rb_set_deamon_freq(rb_cal(exp));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -