From fc37baed2370a6dd7f8c1fccf747585dff301e76 Mon Sep 17 00:00:00 2001 From: NeoZeng Date: Tue, 29 Nov 2022 23:11:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E8=A7=86=E8=A7=89?= =?UTF-8?q?=E4=B8=8A=E4=BD=8D=E6=9C=BA=E5=92=8CCAN=E5=A4=9A=E6=9C=BA?= =?UTF-8?q?=E9=80=9A=E4=BF=A1=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/CANcomm.png | Bin 0 -> 61072 bytes modules/can_comm/can_comm.md | 78 +++++++++++-- modules/master_machine/master_process.c | 7 +- modules/master_machine/master_process.h | 72 ++++++++++++ modules/master_machine/master_process.md | 135 ++++++++++++++++++++++- modules/master_machine/seasky_protocol.c | 4 +- modules/master_machine/seasky_protocol.h | 73 ------------ 7 files changed, 276 insertions(+), 93 deletions(-) create mode 100644 assets/CANcomm.png diff --git a/assets/CANcomm.png b/assets/CANcomm.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a0a768bab633fe66c3c16c681d993e26a68d27 GIT binary patch literal 61072 zcmd?RXH-;87B)&~1O%i3$so`ONNf=$X9<#%HJ-m;IwUeuZOAty z@8`~DAE|-F!w?)UoS)vd2-MNHGsi*Bg3ILjg2MWi6Jg;WO|~g34$4jwXN_xKQS=7% zXc+(T`b>`jk+7E5kU#^8|NZ4l4||IHAD^Ish^5gW%xdj{U4CddzJGg(cf5J<_n(3H zk3-R<6f=VGBCycGXn%Y8!dq$n{xk6Y)kAc6yc7XB72bbZhDPKs@ZZKh!2olIP;osc z`%h!hAom>pZanawUJXPKBYt7%c;D~oTwyYh}`43ak(BTyQ ze>45g>`ziezHqs*kLl(AF^Fh@S@D?v^-%}}jVL;AQPT9kh87rD?ElvXR+SW^xVX4G zOFe%|lNCSk@7_}tMIeTThq*F_$`rtADs!7 z72{xEHycp!F!b+V!o|%R-I$Vuo6^JRVTm6vWoOLc@$cL+dH*%cpSpksOdsjH!urGC zm`I>Ox-f_p|J}+DKQyUuN@A(-1R@R&z(qRZez^a3rViK_&i&F4&duW&hy}O`@6}WE ze|rlLu=(vP;F2jTqX!y6$7TMvd*0kNg^vsA>c=4?1Hy!Zz7_QEfVyicoO zD`b@eatVb{!O$u@oaVm#&o457Xu79fNnzsq+Bg}W>4}5>?J{r~BjBjjzeX<%jIrT( zDZ$VoMuuL=94ntPG(Ue!Oz$UdfD=y1vpVD{>f^gr&$BebT!{%1Pdf$fDjt5J*o&fH37wWm{`PF5d=IXtgbp|#rXrNE-Bord<$7}j}daihXq#&1& z8d>=ZJLI)>-`k3ctvQ)7LJWFUFAUSJaLS3fIj?VEKLkp|!*cy`M)mIQ?gkzihim3# zRfZHeFByoE1ctxjG!*=iW(^ZE&GaKn2!TWuWo9l@-L(b&Y4&WU;vF!M*BD2d<3XP= zu}4I&wqJ&kagHQaNy$%j`3M64HiwPIaDirN?@YeRRc9sRytas8bLxN-Rocu6UhcOO zo`j~7O76pGpl^>arJeNr)y30Ta3pVzqu@^Z@FH9jvjQ=?cESb4sDgTC|A54IK1UBZZ@!m3AGHBrS+`X?@3KL zk6{6}Jo==_+#dGcLXP#KPE0TMnd7?ZUV_+S0Li=K_2Ky_)L~r9!_*s2{pxj6(Kh7G z&o7KKIVy;GLnDQc(S>B>H4fqyAK_d1m+eXS)-n#wM*xd70;#4CgTPOtNP>lkX;SrJkpd^B7Ec5x1jZ zoZKaaoCkl+R7~`4J6HC>=EnLt2W$EaYJ-U;(tYtXEfBwWi$$qW%MVY9afjcZu-&0g zyJ=l$cItAcF>Dt?#cnoK0?Daav+KX0TIUls>I`;Gu14P6xz8FSaydDVQ*WQre7@69 zTIA~H>I|Ac9VL31SN6I5O)JLDyh|WBHBCa&_v`1jTFE>A`Tpgv8|i$_aKYm4~^=XJEWimzxG*=emS`laVidH18hxVV=O1hUvPON?9QkNSmgjz^D| z!k}cmQj)#}zoi-IRf#`+M)R@_i=Sq$@8gnKOkmPnrffO+r9bb0G@`n#ab{o;-{7~C zO}I-;zyFb#=$|@oPkJ>pG#E2wc#Guhlx#&}@q_d3eS)E1Zd)%l?aI>FNxdkz&uQ8j zN;;26&@xHSAg-jA`4RjCjDt6{;IiN)qQV|Ve(S;sJ?+iow0MQ1sxb0oMg>R~!Yuzx zen0GzIfw+LI_xkP91PDy!)AaqnGUkTJkFGX2cW5u$a)P(rNyA#%&?wn3;Nr6OVE1*7tLNvAvI7xUC_S z3AEm0|D3UHHH{4n7x|SzZY&3YTUG)TXS;WTc4UQUooP-M-1txE1d}iKuHEEMI614#GRrpgP`K8&t^(G# z?*y#%s$#U7&Y$+|78iK%{3ngVO?_kjl< zQ5lAWV$sfm+dAO;3`0$Jv|dm581zosUXE3@;teNEjEvZyUSAw}tn`C^OcTRD_tfZi@x8tcmMOYmY)I5g7;6%4vk8tVbm+u8JS3$ zDPFJ3V|VLzn{@`&R0=X~7KEq$%d;2CDSc+oz}$9JpWSOZ?ULz;hg%$koUfLosBXvE zx8|}s##%1g%_}Q+7T&do^1Z?-H;@+?cA9IUz5WuP`ZzaT4i9jLRe1o~wfbnOam&Wh z>cFz1Ppvq;9FRWnq|}%9kV(gv9;)` zPWI5M!Slji@MKJbkrD)tfAy3l^Xso)zce)R#~5d)k%)7p>6<-prq zVmE89h3UEl?<)bF3$|F8-IWaPP$?Iw!~0h_Z-9lIj;7D9@1)Lvvl$@NL)~^&b zF7l)pVAsXhf1*{^KVd&g3xhUKKH+jqZ-rP~pC6>I$3HW_uN42Zl|-Z-uKV2#*U-L) z>C+o!!Hp~lG7$HQ@)pxDDQ7-1XpfiFC0vz6XDsRA9?MFZJlu)cc*fi}U3uk652Mr-|V_waj;? z+f$BMX0+2^39n<$Llb& zwmv(WH9{%J>ED>$quy(?iTm?FU{Gr}%9YMLFno!5oZa{&uJ5M)wpd;Zulc+aYExt0 z_pRdaLKv~NuQ`4Rtp4sZ(&s9fSnIMPlK+TZi4gUC1+TLcDLk>OYg>aA z5}mR)5)AE>#27J1wK?4nMC~W%BG4Svl}9H;ik#_o0o$5I!|2=1=}eSO!wzr# zcgDHP!U4{^rcb=r;(_50{yY>0*ss7Zf3ckb%Zh3q9hjihm{)%_FdM*XF$ zhrtg#_eU6ycTH;?H0JFLT@d`0thm-dP8U0!G{u8Hm84%Zsp?i|0{#B+8_4q7P;XI$ zM613EurU-GFR4-MT`qD3)~n{%Y$rCnNjJ@>_7!0|?uV5;=KV5eC}4OsDd zs5ri0DP#t%cYkR73{Go20QM}hcnrHN8Kt!)S8Q=@P*o{ME4J8r{-gn$C#8Ran()vs zxvBJG!M^0rZm-wGwm7e12uD^r@h6=87pzRj2z@kS;EM={dkqF$XGPUNKR+SL?EW$7 z3OkM`7b8E75k_4fVIgrnv~B7)n4wRNtx>Q&g6_JHlIS9n3wt4IpKcoG!UG@9kQFxQ zjbcG^^d6JwDXXOYiQWzr*iMv{%hDsBj&|ksa9ZQg6TG=+GrLu?<;{>vNhn-aW*9C;VK*L!MvO6eq&-goaSv+Z+BRH2Xfr5m;h&0|jQ^H{<~7gt3rJgC z+n$o{5}m1imC13Yn04MM;-@kTP;CwT!@=-zy7x$o-k47vxIW( zpiwDfpPQ5PM|9P7z!oDP*uee{Ij~?6x?Il;W2VjfWr{|m!TA-Jv)eA2#dUn&q1#Zg zJyKLGy$SA8VSLkhQF(B~biL>%!JD+AIi1rqvT?lTK9XT?IR<3|Z>MV6ap4R_tsRR? zqBYoU9CXdLLFIvH14HUTMifg;hs*U14Fb&(h#L`7CDC>)^h;-lLL)6X6`ZujbScMR z@Dc;-N`&PHi?34QKG#Z9J(JC^Rl-wYQ!TWLQFdyn@n;J@3p38ndrfEVQ-jBdBZ-)* zS@~a#k|G@Z+uw~451fk5%Gw{y4I8T{-IxEiFgJ+V zZ628Y^jrld^uh^LZTw9_Nuslflqkv;wq>H z!K#8kfpj|j_D9eB@#q?pF!#W5#L`ybGXENQ7*i;cM)nG^*JQR_fc|NqPOc=TlA&S#s1XiQ#1>)Oj6~gC%(Z*~izxT=>*6^}lbc$kz zJ_em*Lf?kd2z=*!u$Hv}3A$>>k5kPf1Mave%$at5vdtDTVGSDZ|Sx9h* zPcF|`@TebbukDz5()sL-jZk9}nI3V@rSV2CU-Jqh2Tv!atEp+R(*rqzAcWi?|yk}PIW>Tingg2d3fcJGva}~4lO)~PB=k}%?;J!XvxxiexPH!ddyug zbv;bmL;4cO5J~&wFUHxBVSA1|4U6Yn@QgO{zA!J{+FYSuR}kZ<=+jUUS*cQUgXwgX z?MPtLN|iQmhN$ceK&t&Qm;z z0cv@7h>kG69ErO>uPKW17b6@OpzkCTczspC1UtU9m-J2Gv2fpTx!}=jm|wBZx!ck0 z?Cd~ed&`Nh((pftQ1+EXtCuKdt5-y?hvWyyWzOOejXq)2g^9UqL5wzPM%UJd_CBsk z8B{$kvw0smpS(ni_5$fN$7rdm{m^^@B5rJ~+laco!YijUxfvGWzRs>|e<0+VlU$Qp zV{u+%7Z8Hxy|LCO)3J}|C%7H9hda%d;bBI`sW-+RnB4-+uD!JG(ll-&*o5M7t!6Gc zkID5lW(R72oG3Bes?u(WdBt8$P^>eP$ju&oWB6H`<-9&_eqX83jC@wn{ml)i1# zikrPW5%=Z_VsGMT8@nlHzwhN_>TkU;3Y(|`eYZf@!Vu$*GVD++sus^p^u$XA%{qvT zMO$H?uuP+TABIW;6&r(iW=Om|=5gPRRNhG)>1_pztyOtt3V3Q3df^xd(BiaHA zJv7UNW%!sS)zPs_A!^1Tle3RSYA>Y1=ifdC<(+@Ye~-T06+zw0`o$mPc-&!OdRni7 zSIW*NP>eb{)##fLST5i7%LZ*QzYmQfcWn;x!Oi?rq!rO}cirXm#i%661xexzz;xn*Rizo!FbbhavdnXK}|$y(>7!lT+mXPQN;qXu~f z&SsQQrSpM8GUZBTWMrf)J15f7M=-@(G*(_IT76JGH#limtz`|(iveUyE}$S^*Km0; zS#H`?nU@V(pZT?M_W9iZ-3|012TZHPV52i_-Hv{9t+9#Y$;ta6au?M%EukTGr_&!o zj4}9QA7ei`bbfZL-?{wosAE6u9$r?h2h5Qu(*t%~&Tg(Bz7x+bq#@}GY=fJvcW3Li zhi-IaumU!aRR1BHr?qdp|6|5}}{oiwgER$96yHBo7hk z@m%81<+e~^5L>%N^K2rJ(67JtYemgI>`VJ;ZaZ5$9JYrikB#I|ny2U#>L)3Vl5LU- zw|r?pf)P&5w|iVtQsM*2Kuvx(SFl-Z3uIS1s-+<^4So51JRd3MV^22Y1}n&%-18Uq z$q~IkU?&Co!mNGa`DP#z&(dXnD0r9%+vre%s&*~?#YPA*Xe;jMjCoi&GcvbHrQw^p z7xu$V58GAf`=i9znd{`vpF&aB0jHunSE=i&6FG$QIhs&Wsdkl1=TiHzJtfH7lQs+C zQ3mW=TCYpz;JBeTTe)X%lw|G8R5=TbwcMZzj59ku99kc>kc6m)J`5=EmaG!bR9DkZ!TW0 zArX668}^Ojs=OI`wk$`sQMh3txFp;X8!vP#%gN;leM`({Z_aofBz-OIkK9Ul-D8Io*CKMD-%;zr(g82*W+eN^$_|*)rJw|Vt%Q*C&C|@d8*6Z(DB^gYfyGv zBR`9oLL4;k=&$QeM--r>qO$T+C1ll1CG!v&1UVZ6nl0Z6EjOtf08@EO%3q)nS(8bY z$--TfXJ^L8$A3*t)v>)3op{-?Pcsx)z2l-$hs^Xgj`tNi{K?o9D1D zkosSxK;AhYFq$VJW2Eax_3M@+6T~vm8+Mm(^vSs|ijzc2Lx|-}QdHZ_mV0Z2Rr*(> zzKsT*Eo7Ate0cv;LUx$TR3%#zdBaDL^id-1X#p7xnbjU@#f1abjObgjd<6f)|A5Y{ zKKhrpoK$1tz|v~7r|1H6fX;%0A1__og|vBJVF=rc%~otW15S{1-$BdJ7TwoQ45ip} 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 Ml7?csyy1iY1LU?qQ~&?~ literal 0 HcmV?d00001 diff --git a/modules/can_comm/can_comm.md b/modules/can_comm/can_comm.md index ee1d359..607ac98 100644 --- a/modules/can_comm/can_comm.md +++ b/modules/can_comm/can_comm.md @@ -5,35 +5,91 @@ > TODO: > > 1. 增加数据长度可变的协议支持 -> 2. 简化接收流程 +> 1. 对`CANCommGet()`进行修改,使得其可以返回数据是否更新的相关信息。 + + ## 总览和封装说明 - - - - - +CAN comm是用于CAN多机通信的模块。你不需要关心实现的协议,**只需要传入你想发送/接收的结构体的长度**(通过`sizeof()`获取)即可。单帧发送长度目前限制为60字节,如果需要加长可以在`can_comm.h`中修改`CAN_COMM_MAX_BUFFSIZE`的定义值。注意CAN的负载以及使用此模块的发送频率,否则可能造成堵塞。 ## 代码结构 - - - +.h中放置的是数据定义和外部接口,以及协议的定义和宏,.c中包含一些私有函数。 ## 外部接口 +```c +CANCommInstance *CANCommInit(CANComm_Init_Config_s* comm_config); +void CANCommSend(CANCommInstance *instance, uint8_t *data); +void *CANCommGet(CANCommInstance *instance); +``` +第一个函数将会初始化一个CANComm实例,返回其指针。使用CANComm进行通信的应用应该保存返回的指针。初始化需要传入一个初始化结构体。请在应用初始化的时候调用该函数。推荐的结构体配置方式如下: +```c +/* 初始化结构体的定义 */ +typedef struct +{ + can_instance_config_s can_config; + uint8_t send_data_len; //发送数据长度 + uint8_t recv_data_len; //接收数据长度,两者请用sizeof获取 +} CANComm_Init_Config_s; +CANComm_Init_Config_s cconfig = { + .can_config = { + .can_handle=&hcan1, + .tx_id=0x02, + .rx_id=0x03}, + .send_data_len = sizeof(your_data_structure), + .recv_data_len = sizeof(recv_data_structure) +}; +``` + +第二个函数将会通过CAN发送一帧数据。这里的“帧”不是CAN的一帧报文,而是你使用的数据。在CANComm初始化的时候,使用sizeof获得你要发送的数据的长度。调用此函数时,将你的数据结构或数据cast成`u8`类型的指针传入即可。==**特别注意,你的结构体需要使用预编译指令`#pragma pack(1)`以及`#pragma pack()`包裹**==,从而进行字节压缩而不进行字节对齐,如: + +```c +#pragma pack(1) +typedef struct +{ + uint8_t aa; + float bb; + double cc; + uint16_t dd; +} some_struct; +#pragma pack() +``` + +只有这样,这个结构体才不会进行padding扩充字节实现字节对齐。你可以尝试一下,如果不使用pack处理,上面的结构体将会占据18个字节以上的空间;开启pack后,会降低至15。更多关于字节对齐的内容,自行查询。 + +> 后期可能更新字节对齐和内存访问相关的教程。 + +`CANCommGet()`是获取来自CANComm接收到的数据的接口,返回值为一个void类型指针,你需要通过**强制类型转换**将其变为你设定的接收类型指针,然后就可以访问其数据了。 ## 私有函数和变量 +```c +static CANCommInstance *can_comm_instance[MX_CAN_COMM_COUNT] = {NULL}; +static uint8_t idx; +static void CANCommResetRx(CANCommInstance *ins); +static void CANCommRxCallback(can_instance *_instance); +``` +第一个指针数组保存所有的can comm实例,从而在callback中区分不同实例。idx是初始化使用的索引,用于确定每个can comm实例指针存放的位置。 +`CANCommResetRx()`在`CANCommRxCallback()`中多次被调用,用于清空接收缓冲区。 - - +`CANCommRxCallback()`是CAN comm初始化can实例时的回调函数,用于can接收中断,进行协议解析。 ## 接收解析流程 +CAN comm的通信协议如下: + +| 帧头 | 数据长度 | 数据 | crc8校验 | 帧尾 | +| ----------- | -------- | ---------------- | -------- | ----------- | +| 's'(0x73) | 0~255 | 最大60(可修改) | 校验码 | 'e'(0x65) | +| 1-byte | 1-byte | n-byte | 1-byte | 1-byte | + +接收的流程见代码注释。 + +流程图如下:![未命名文件](../../assets/CANcomm.png) diff --git a/modules/master_machine/master_process.c b/modules/master_machine/master_process.c index 57548e3..1c24908 100644 --- a/modules/master_machine/master_process.c +++ b/modules/master_machine/master_process.c @@ -14,7 +14,7 @@ #include "seasky_protocol.h" /* use usart1 as vision communication*/ -Vision_Recv_s recv_data; +static Vision_Recv_s recv_data; // @todo:由于后续需要进行IMU-Cam的硬件触发采集控制,因此可能需要将发送设置为定时任务,或由IMU采集完成产生的中断唤醒的任务, // 使得时间戳对齐. 因此,在send_data中设定其他的标志位数据,让ins_task填充姿态值. // static Vision_Send_s send_data; @@ -61,9 +61,4 @@ void VisionSend(Vision_Send_s *send) get_protocol_send_data(0x02, flag_register, &send->yaw, 3, send_buff, &tx_len); USARTSend(vision_usart_instance, send_buff, tx_len); -} - -Vision_Recv_s *VisionGetcmd() -{ - return &recv_data; } \ No newline at end of file diff --git a/modules/master_machine/master_process.h b/modules/master_machine/master_process.h index 180aac6..4bc5c03 100644 --- a/modules/master_machine/master_process.h +++ b/modules/master_machine/master_process.h @@ -7,6 +7,78 @@ #define VISION_RECV_SIZE 36u #define VISION_SEND_SIZE 36u +typedef enum +{ + NO_FIRE = 0, + AUTO_FIRE = 1, + AUTO_AIM = 2 +} Fire_Mode_e; + +typedef enum +{ + NO_TARGET = 0, + TARGET_CONVERGING = 1, + READY_TO_FIRE = 2 +} Target_State_e; + +typedef enum +{ + NO_TARGET_NUM = 0, + HERO1 = 1, + ENGINEER2 = 2, + INFANTRY3 = 3, + INFANTRY4 = 4, + INFANTRY5 = 5, + OUTPOST = 6, + SENTRY = 7, + BASE = 8 +} Target_Type_e; + +typedef struct +{ + Fire_Mode_e fire_mode; + Target_State_e target_state; + Target_Type_e target_type; + + float pitch; + float yaw; +} Vision_Recv_s; + +typedef enum +{ + BLUE = 0, + RED = 1 +} Enemy_Color_e; + +typedef enum +{ + MODE_AIM = 0, + MODE_SMALL_BUFF = 1, + MODE_BIG_BUFF = 2 +} Work_Mode_e; + +typedef enum +{ + BIG_AMU_10 = 10, + SMALL_AMU_15 = 15, + BIG_AMU_16 = 16, + SMALL_AMU_18 = 18, + SMALL_AMU_30 = 30, +} Bullet_Speed_e; + +typedef struct +{ + Enemy_Color_e enemy_color; + Work_Mode_e work_mode; + Bullet_Speed_e bullet_speed; + + float yaw; + float pitch; + float roll; + + // uint32_t time_stamp; // @todo 用于和相机的时间戳对齐 +} Vision_Send_s; + /** * @brief 调用此函数初始化和视觉的串口通信 * diff --git a/modules/master_machine/master_process.md b/modules/master_machine/master_process.md index 94ab049..055c332 100644 --- a/modules/master_machine/master_process.md +++ b/modules/master_machine/master_process.md @@ -1 +1,134 @@ -# master_process \ No newline at end of file +# master_process + + + +

neozng1@hnu.edu.cn

+ +> TODO: +> +> 1. 补全标志位解析和发送设置的代码 +> 2. 增加发送给视觉数据的时间戳用于数据对齐 + + + +## 总览和封装说明 + +模块包含了和视觉通信的初始化、向上位机发送信息的接口和模块的串口的回调处理。接口的定义统一,可以方便的替换成其他通信方式,如CAN。 + +## 代码结构 + +.h文件内包括了外部接口和与**视觉上位机通信的数据结构定义**,以及模块对应的宏。c文件内为私有函数和外部接口的定义。 + +本模块主要是对协议解析的处理和协议发送的封装,实际内容不多。协议相关内容都在`seasky_protocol.h`中。 + +## 类型定义 + +和视觉通信所必须的标志位和数据。包括开火模式,目标状态,目标类型,接收/发送数据结构体。 + +```c +typedef enum +{ + NO_FIRE = 0, + AUTO_FIRE = 1, + AUTO_AIM = 2 +} Fire_Mode_e; + +typedef enum +{ + NO_TARGET = 0, + TARGET_CONVERGING = 1, + READY_TO_FIRE = 2 +} Target_State_e; + +typedef enum +{ + NO_TARGET_NUM = 0, + HERO1 = 1, + ENGINEER2 = 2, + INFANTRY3 = 3, + INFANTRY4 = 4, + INFANTRY5 = 5, + OUTPOST = 6, + SENTRY = 7, + BASE = 8 +} Target_Type_e; + +typedef struct +{ + Fire_Mode_e fire_mode; + Target_State_e target_state; + Target_Type_e target_type; + + float pitch; + float yaw; +} Vision_Recv_s; + +typedef enum +{ + BLUE = 0, + RED = 1 +} Enemy_Color_e; + +typedef enum +{ + MODE_AIM = 0, + MODE_SMALL_BUFF = 1, + MODE_BIG_BUFF = 2 +} Work_Mode_e; + +typedef enum +{ + BIG_AMU_10 = 10, + SMALL_AMU_15 = 15, + BIG_AMU_16 = 16, + SMALL_AMU_18 = 18, + SMALL_AMU_30 = 30, +} Bullet_Speed_e; + +typedef struct +{ + Enemy_Color_e enemy_color; + Work_Mode_e work_mode; + Bullet_Speed_e bullet_speed; + + float yaw; + float pitch; + float roll; + // uint32_t time_stamp; // @todo 用于和相机的时间戳对齐 +} Vision_Send_s; +``` + +## 外部接口 + +```c +Vision_Recv_s *VisionInit(UART_HandleTypeDef *_handle); + +void VisionSend(Vision_Send_s *send); +``` + +给`VisionInit()`传入串口handle,将初始化一个视觉通信模块,返回值是接收数据的结构体指针。拥有视觉模块的应用应该在初始化中调用此函数,并保存返回值的指针。 + +调用`VisionSend`并传入填好发送数据的结构体,会通过底层的通信模块向视觉发送一帧报文。 + +## 私有函数和变量 + +```c +static Vision_Recv_s recv_data; + +static usart_instance *vision_usart_instance; + +static void DecodeVision() +{ + static uint16_t flag_register; + get_protocol_info(vision_usart_instance->recv_buff, &flag_register, (uint8_t*)&recv_data.pitch); + // TODO: code to resolve flag_register; +} +``` + +第一个是保存接收数据的结构体,其指针将会在初始化的时候返回给拥有者。目前最多只能配置一个视觉模块。 + +第二个是该模块拥有的串口实例指针,用于调度其底层的发送和接收。如果要换成CAN/SPI等,替换成对应实例,并修改初始化和发送的实现即可。 + +`DecodeVision()`是解析视觉接收数据的回调函数,会在串口接收回调中被调用。如果修改通信协议,只需要更改 + +`get_protocol_info()`。 \ No newline at end of file diff --git a/modules/master_machine/seasky_protocol.c b/modules/master_machine/seasky_protocol.c index 17af114..105a6b8 100644 --- a/modules/master_machine/seasky_protocol.c +++ b/modules/master_machine/seasky_protocol.c @@ -104,10 +104,10 @@ uint16_t get_protocol_info(uint8_t *rx_buf, // 接收到的原始数据 uint16_t *flags_register, // 接收数据的16位寄存器地址 uint8_t *rx_data) // 接收的float数据存储地址 { + // 放在静态区,避免反复申请栈上空间 static protocol_rm_struct pro; static uint16_t date_length; - volatile size_t s = sizeof(pro); - volatile size_t aa = sizeof(Vision_Recv_s); + if (protocol_heade_Check(&pro, rx_buf)) { date_length = OFFSET_BYTE + pro.header.data_length; diff --git a/modules/master_machine/seasky_protocol.h b/modules/master_machine/seasky_protocol.h index c769a92..7035007 100644 --- a/modules/master_machine/seasky_protocol.h +++ b/modules/master_machine/seasky_protocol.h @@ -5,81 +5,8 @@ #include #define PROTOCOL_CMD_ID 0XA5 - #define OFFSET_BYTE 8 // 出数据段外,其他部分所占字节数 -typedef enum -{ - NO_FIRE = 0, - AUTO_FIRE = 1, - AUTO_AIM = 2 -} Fire_Mode_e; - -typedef enum -{ - NO_TARGET = 0, - TARGET_CONVERGING = 1, - READY_TO_FIRE = 2 -} Target_State_e; - -typedef enum -{ - NO_TARGET_NUM = 0, - HERO1 = 1, - ENGINEER2 = 2, - INFANTRY3 = 3, - INFANTRY4 = 4, - INFANTRY5 = 5, - OUTPOST = 6, - SENTRY = 7, - BASE = 8 -} Target_Type_e; - -typedef struct -{ - Fire_Mode_e fire_mode; - Target_State_e target_state; - Target_Type_e target_type; - - float pitch; - float yaw; -} Vision_Recv_s; - -typedef enum -{ - BLUE = 0, - RED = 1 -} Enemy_Color_e; - -typedef enum -{ - MODE_AIM = 0, - MODE_SMALL_BUFF = 1, - MODE_BIG_BUFF = 2 -} Work_Mode_e; - -typedef enum -{ - BIG_AMU_10 = 10, - SMALL_AMU_15 = 15, - BIG_AMU_16 = 16, - SMALL_AMU_18 = 18, - SMALL_AMU_30 = 30, -} Bullet_Speed_e; - -typedef struct -{ - Enemy_Color_e enemy_color; - Work_Mode_e work_mode; - Bullet_Speed_e bullet_speed; - - float yaw; - float pitch; - float roll; - - // uint32_t time_stamp; // @todo 用于和相机的时间戳对齐 -} Vision_Send_s; - typedef struct { struct