123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- /*
- * driver.c
- *
- * Created on: 2019��8��12��
- * Author: Eric
- */
- #include "env.h"
- #include "driver.h"
- #include "guide.h"
- #include "obs.h"
- #include "systick.h"
- #define DBG_SECTION_NAME "driver"
- #define DBG_LEVEL DBG_INFO
- #include <rtdbg.h>
- rt_inline uint8_t _GetRotateAct(uint8_t act);
- rt_inline void _SetDRSpeed(uint8_t act);
- rt_inline uint8_t _calcDirection(uint8_t act);
- void DRSetAction(uint8_t act) {
- uint8_t DRAct;
- S.Action = act;
- // if(Set.RotateAct <= 0){
- // Set.RotateAct = ACT_NULL;
- // }
- //LogDebugGuide("DR_SetAction %d", act);
- if(Set.RotateAct == ACT_NULL || ActIsManual(act)){
- DRAct = act;
- // return;
- }else{
- DRAct = _GetRotateAct(act);
- }
- S.Direction = _calcDirection(DRAct);
- if(S.NavStatus == NAV_STATUS_STATION_BRANCH || S.NavStatus == NAV_STATUS_STATION_IN){
- S.Direction = DIRECTION_NULL;
- }
- {
- {
- /* bug106 */
- if(S.ObsStatus != OBS_STATUS_NEAR)
- S.ObsStatus = ObsGetStatus();
- switch(S.ObsStatus){
- case OBS_STATUS_FAR:
- GDLowSpeed();
- break;
- case OBS_STATUS_NEAR:
- /* 为唐山修改 */
- if(S.Point == (Set.ChargeStation - 1) || (S.Point == Set.ChargeStation + 1) || (S.Point == Set.ChargeStation)){
- return;
- }
-
- GDPause();
- DRAct = ACT_STOP;
-
- break;
- default:
- break;
- // GDResume();
- }
- }
- }
- if(Set.DRAction != DRAct){
- _SetDRSpeed(DRAct);
- //LogDebugGuide("DR_SetAction: act:0x%x 0x%x-> 0x%x rpm:%d, %d", act, Set.DRAction, DRAct, Set.RpmNav, Set.RpmDft);
- Set.DRAction = DRAct;
- }
- }
- rt_inline uint8_t _StopAtCross(uint8_t act) {
- // LogNoRepeatVar
- // ;
- uint8_t pre = act >> 4;
- uint8_t next = act & 0x0F;
- if(pre == ACT_NULL){
- pre = next;
- }
- switch(pre){
- case ACT_LEFT:
- // DebugDriverNoRepeat("StopAC_Pre ACT_LEFT Speed %d", S.Speed)
- // ;
- return ACT_LEFT_STOP_CROSS;
- case ACT_RIGHT:
- // DebugDriverNoRepeat("StopAC_Pre ACT_RIGHT Speed %d", S.Speed)
- // ;
- return ACT_RIGHT_STOP_CROSS;
- case ACT_FORWARD:
- // DebugDriverNoRepeat("StopAC_Pre ACT_FORWARD Speed %d", S.Speed)
- // ;
- return ACT_FORWARD_STOP_CROSS;
- case ACT_BACKWARD:
- // DebugDriverNoRepeat("StopAC_Pre ACT_BACKWARD Speed %d ", S.Speed)
- // ;
- return ACT_BACKWARD_STOP_CROSS;
- }
- // DebugDriverNoRepeat("StopAC_Pre-other-Act other %x", act);
- return act;
- }
- rt_inline void changeRotate2NextAct(uint8_t next) {
- switch(Set.RotateAct){
- case ACT_ROTATE_LEFT:
- switch(next){
- case ACT_FORWARD:
- Set.RotateAct = ACT_RIGHT;
- return;
- case ACT_RIGHT:
- Set.RotateAct = ACT_BACKWARD;
- return;
- case ACT_BACKWARD:
- Set.RotateAct = ACT_LEFT;
- return;
- case ACT_LEFT:
- Set.RotateAct = ACT_FORWARD;
- return;
- }
- case ACT_ROTATE_RIGHT:
- switch(next){
- case ACT_FORWARD:
- //LogLocalPrintf("Rote:R F->R\r\n");
- Set.RotateAct = ACT_RIGHT;
- return;
- case ACT_RIGHT:
- //LogLocalPrintf("Rote:R R->B\r\n");
- Set.RotateAct = ACT_FORWARD;
- return;
- case ACT_BACKWARD:
- //LogLocalPrintf("Rote:R B->L\r\n");
- Set.RotateAct = ACT_RIGHT;
- return;
- case ACT_LEFT:
- //LogLocalPrintf("Rote:R L->B\r\n");
- Set.RotateAct = ACT_BACKWARD;
- return;
- }
- return;
- case ACT_ROUND_LEFT:
- case ACT_ROUND_RIGHT:
- switch(next){
- case ACT_FORWARD:
- Set.RotateAct = ACT_BACKWARD;
- return;
- case ACT_RIGHT:
- Set.RotateAct = ACT_LEFT;
- return;
- case ACT_BACKWARD:
- Set.RotateAct = ACT_FORWARD;
- return;
- case ACT_LEFT:
- Set.RotateAct = ACT_RIGHT;
- return;
- }
- return;
- }
- }
- rt_inline uint8_t _GetRotateAct(uint8_t act) {
- // LogNoRepeatVar
- //;
- static volatile uint32_t roteTime = 0;
- int8_t next = act & 0x0F;
- static volatile uint8_t preCross = CROSS_OFF, Rotating = False;
- switch(S.CrossType){
- case CROSS_XY:
- roteTime = rt_tick_timeout_reset(60000);
- preCross = CROSS_XY;
- if(Set.RotateCnt > 0){
- if(S.StopAtCross){
- //DebugDriverNoRepeat("Rote:X CNT>0", Set.RotateCnt);
- Rotating = True;
- return Set.RotateAct;
- }else{
- //LogDebugDriver("Rote:X CNT > 0 Stop");
- return _StopAtCross(act);
- }
- }else{
- if(S.StopAtCross){
- Rotating = False;
- changeRotate2NextAct(next);
- //LogDebugDriver("Rote:X-Next %x->%x", next, Set.RotateAct);
- return Set.RotateAct;
- }else{
- //LogDebugDriver("Rote: X %x", Set.RotateAct);
- return Set.RotateAct;
- }
- }
- case CROSS_LR:
- case CROSS_FB:
- roteTime = rt_tick_timeout_reset(60000);
- preCross = S.CrossType;
- if(Rotating){
- //DebugDriverNoRepeat("Rote:S CRX=%d, CNT=%d, RACT=%x", S.CrossType, Set.RotateCnt, Set.RotateAct);
- return Set.RotateAct;
- }
- if(Set.RotateCnt > 0){
- //DebugDriverNoRepeat("Rote:S-CNT>0");
- return _StopAtCross(act);
- }else{
- changeRotate2NextAct(next);
- //DebugDriverNoRepeat("Rote:S-Next%x", Set.RotateAct);
- return Set.RotateAct;
- }
- default:
- if(rt_tick_timeout(roteTime))
- {
- S.Status = STATUS_ERROR_ROTE_OFFLINE;
- return ACT_STOP;
- }
- if(preCross != CROSS_OFF){
- if(Set.RotateCnt > 0){
- Set.RotateCnt--;
- }
- //DebugDriverNoRepeat("Rote:O-CNT-%d", Set.RotateCnt);
- preCross = CROSS_OFF;
- }
- if(Rotating == True){
- //DebugDriverNoRepeat("Rote:O-R");
- return Set.RotateAct;
- }else{
- //DebugDriverNoRepeat("Rote:O-R-N");
- //Set.RotateAct = ACT_NULL;
- return act;
- }
- }
- }
- rt_inline void _SetDRSpeed(uint8_t act) {
- //LogNoRepeatVar
- //;
- if(Set.RotateAct != ACT_NULL){
- Set.DRRpmDft = Set.RpmNear;
- Set.DRRpmNav = Set.RpmNear;
- //DebugDriverNoRepeat("DRSpeed RotateAct speed", act)
- return;
- }
- if(Set.SpeedAct == ACT_SPEED_LOW){
- Set.DRRpmDft = Set.RpmNear;
- Set.DRRpmNav = Set.RpmNear;
- //DebugDriverNoRepeat("DRSpeed ACT_SPEED_LOW %x", act)
- return;
- }
- switch(act){
- case ACT_FORWARD_LEFT:
- case ACT_FORWARD_RIGHT:
- case ACT_BACKWARD_LEFT:
- case ACT_BACKWARD_RIGHT:
- //DebugDriverNoRepeat("DRSpeed FB-LR %x", act)
- //;
- Set.DRRpmNav = Set.RpmNear;
- Set.DRRpmDft = Set.RpmDft;
- break;
- case ACT_LEFT_FORWARD:
- case ACT_LEFT_BACKWARD:
- case ACT_RIGHT_FORWARD:
- case ACT_RIGHT_BACKWARD:
- //DebugDriverNoRepeat("DRSpeed LR-FB", act)
- //;
- Set.DRRpmNav = Set.RpmNav;
- Set.DRRpmDft = Set.RpmNear;
- break;
- default:
- if(S.Status == STATUS_RUN_OBS_LOW_SPEED){
- Set.DRRpmNav = Set.RpmNear;
- Set.DRRpmDft = Set.RpmNear;
- }else{
- Set.DRRpmNav = Set.RpmNav;
- Set.DRRpmDft = Set.RpmDft;
- }
- }
- }
- rt_inline uint8_t _calcDirection(uint8_t act) {
- // LogNoRepeatVar
- // ;
- uint8_t pre = act >> 4, next = act & 0x0F;
- if(act == ACT_ROTATE_LEFT){
- return DIRECTION_ROTATE;
- }
- if(act == ACT_ROTATE_RIGHT){
- return DIRECTION_ROTATE;
- }
- if(pre == ACT_NULL){
- switch(next){
- case ACT_LEFT:
- // DebugGuideNoRepeat("calcDirection: no pre next %d DIRECTION_LEFT", next)
- // ;
- return DIRECTION_LEFT;
- case ACT_RIGHT:
- // DebugGuideNoRepeat("calcDirection: no pre next %d DIRECTION_RIGHT", next)
- // ;
- return DIRECTION_RIGHT;
- case ACT_FORWARD:
- // DebugGuideNoRepeat("calcDirection: no pre next %d DIRECTION_FORWARD", next)
- // ;
- return DIRECTION_FORWARD;
- case ACT_BACKWARD:
- // DebugGuideNoRepeat("calcDirection: no pre next %d DIRECTION_BACKWARD", next)
- // ;
- return DIRECTION_BACKWARD;
- }
- }
- switch(S.CrossType){
- case CROSS_LR:
- if((pre == ACT_LEFT) || (next == ACT_LEFT)){
- //DebugGuideNoRepeat("calcDirection: CROSS_LR pre %d next %d DIRECTION_LEFT", pre, next);
- return DIRECTION_LEFT;
- }
- if((pre == ACT_RIGHT) || (next == ACT_RIGHT)){
- //DebugGuideNoRepeat("calcDirection: CROSS_LR pre %d next %d DIRECTION_RIGHT", pre, next);
- return DIRECTION_RIGHT;
- }
- // DebugGuideNoRepeat("calcDirection: CROSS_LR other act %x", act)
- // ;
- break;
- case CROSS_FB:
- if((pre == ACT_FORWARD) || (next == ACT_FORWARD)){
- //DebugGuideNoRepeat("calcDirection: CROSS_LR pre %d next %d DIRECTION_FORWARD", pre, next);
- return DIRECTION_FORWARD;
- }
- if((pre == ACT_BACKWARD) || (next == ACT_BACKWARD)){
- //DebugGuideNoRepeat("calcDirection: CROSS_LR pre %d next %d DIRECTION_BACKWARD", pre, next);
- return DIRECTION_BACKWARD;
- }
- // DebugGuideNoRepeat("calcDirection: CROSS_FB other act %x", act)
- // ;
- break;
- case CROSS_XY:
- switch(next){
- case ACT_LEFT:
- // DebugGuideNoRepeat("calcDirection: CROSS_XY next %d DIRECTION_LEFT", next)
- // ;
- return DIRECTION_LEFT;
- case ACT_RIGHT:
- // DebugGuideNoRepeat("calcDirection: CROSS_XY next %d DIRECTION_RIGHT", next)
- // ;
- return DIRECTION_RIGHT;
- case ACT_FORWARD:
- // DebugGuideNoRepeat("calcDirection: CROSS_XY next %d DIRECTION_FORWARD", next)
- // ;
- return DIRECTION_FORWARD;
- case ACT_BACKWARD:
- // DebugGuideNoRepeat("calcDirection: CROSS_XY next %d DIRECTION_BACKWARD", next)
- // ;
- return DIRECTION_BACKWARD;
- }
- // DebugGuideNoRepeat("calcDirection: CROSS_XY other act %x", act)
- // ;
- break;
- }
- return DIRECTION_NULL;
- }
|