static void event(int evt) { switch (evt) { case EVT_FRONT_BLOCKED: puts("front blocked"); break; case EVT_BACK_BLOCKED: puts("back blocked"); break; case EVT_FRONT_FREE: puts("front free"); break; case EVT_BACK_FREE: puts("back free"); break; default: puts("unkown"); } if ((behavior == 0) || (behavior == 1)) { /* start condition */ if ((state == 0) && (evt == EVT_FRONT_FREE)) { puts("evt: start"); speed = CONF_BRAIN_SPEED; motor_set(&mot, speed); } /* going forward, hitting obstacle -> steer full and go backwards */ else if ((state == 0) && (evt == EVT_FRONT_BLOCKED)) { motor_stop(&mot); puts("evt: hit forward obstacle"); dir = (behavior == 0) ? -1000 : 1000; speed = -CONF_BRAIN_SPEED; brain_steer(dir); motor_set(&mot, speed); state = 1; } /* going backwards, hitting obstacle */ else if ((state == 1) && (evt == EVT_BACK_BLOCKED)) { motor_stop(&mot); puts("evt: hit backwards obstacle"); dir = 0; speed = CONF_BRAIN_SPEED; brain_steer(dir); motor_set(&mot, speed); state = 0; } } }
void brain_ctrl(int16_t speed, int16_t dir) { if ((speed > 0) && front_blocked) { motor_stop(&mot); return; } if ((speed < 0) && back_blocked) { motor_stop(&mot); return; } brain_set_speed(speed); brain_steer(dir); }
void brain_ctrl(int16_t speed, int16_t dir) { printf("[brain] CTRL set speed %i and dir %i\n", speed, dir); if ((speed > 0) && front_blocked) { motor_stop(&mot); printf("[brain] CTRL FRONT BLOCKED\n"); return; } if ((speed < 0) && back_blocked) { motor_stop(&mot); printf("[brain] CTRL BACK BLOCKED\n"); return; } brain_set_speed(speed); brain_steer(dir); }
static int _steer(int argc, char **argv) { int16_t dir; if (argc < 2) { printf("usage: %s DIR [-1024 to 1023]\n", argv[0]); return 1; } dir = (int16_t)atoi(argv[1]); printf("read steering value: %i\n", dir); if (dir < -0x03ff || dir > 0x03ff) { puts("dir value out of range\n"); return 1; } brain_steer(dir); return 0; }