void stop_state_fn(){
    if (just_entered_state){
        Serial.println("stop_state_fn");
    }

    if (respond_to_key(NULL_STATE)) return;

}
void rotating_left_fn(){
    if (just_entered_state){
        debug_red->led_on();
        debug_blue->led_on();
        Serial.println("rotating_left_fn");
        start_timer(MAIN_STATE_TIMER, 2000);
        rotate_left(10);
    }
    if (respond_to_key(MOVING_FORWARD)) return;
    if (respond_to_timer(MAIN_STATE_TIMER, ROTATING_RIGHT)) return;
}
void moving_backward_fn(){
    if (just_entered_state){
        debug_green->led_on();
        Serial.println("moving_backward_fn");
        start_timer(MAIN_STATE_TIMER, 2000);
        move_backwards(2);
        // move_forwards(5);

    }
    if (respond_to_key(ROTATING_LEFT)) return;
    if (respond_to_timer(MAIN_STATE_TIMER, NULL_STATE));
}
void retracting_button_presser_fn(){
    if (just_entered_state){
        Serial.println("retracting_button_presser_fn");
        //move servo back a bit
        debug_blue->led_on();
        retract_button_presser();
        start_timer(SERVO_TIMER, BUTTON_PRESSER_DELAY);
    }
    // if (respond_to_enough_presses(3,STRAIGHT_BACK_TO_DEPO)) return;
    unsigned char coins_to_get = coins_for_exchanges[coin_collection_round];
    if (respond_to_enough_presses(coins_to_get,WAIT_FOR_LAST_COIN)) return;
    if (respond_to_key(RETRACTING_BUTTON_PRESSER)) return;
    if (respond_to_timer(SERVO_TIMER, EXTENDING_BUTTON_PRESSER)) return;
    // if (respond_to_timer(SERVO_TIMER, NULL_STATE)) return;
    // if (respond_to_timer(SERVO_TIMER, RETRACTING_BUTTON_PRESSER)) return;
    // if (respond_to_button_presser_finished(EXTENDING_BUTTON_PRESSER)) return;
}
void extending_button_presser_fn(){
    if (just_entered_state){
        Serial.println("extending_button_presser_fn");
        extend_button_presser();
        debug_green->led_on();
        start_timer(SERVO_TIMER, BUTTON_PRESSER_DELAY);

        pulse_forward();
        // set servo timer
    }
    check_pulse();

    // reenter the state and reincrement the servo
    if (respond_to_key(EXTENDING_BUTTON_PRESSER)) return;
    if (respond_to_timer(SERVO_TIMER, RETRACTING_BUTTON_PRESSER)) return; // uhh...
    // if (respond_to_timer(SERVO_TIMER, EXTENDING_BUTTON_PRESSER)) return; 
    // if (respond_to_button_presser_finished(RETRACTING_BUTTON_PRESSER)) return;
}
Exemple #6
0
bool
RoxorCore::respond_to(VALUE obj, VALUE klass, SEL sel, bool priv,
	bool check_override)
{
    if (klass == Qnil) {
	klass = CLASS_OF(obj);
    }
    else {
	assert(!check_override);
    }

    IMP imp = NULL;
    const bool overriden = check_override
	? ((imp = class_getMethodImplementation((Class)klass, selRespondTo))
		!= basic_respond_to_imp)
	: false;

    if (!overriden) {
	lock();
	const long key = respond_to_key((Class)klass, sel);
	std::map<long, int>::iterator iter = respond_to_cache.find(key);
	int iter_cached = (iter != respond_to_cache.end());
	unlock();
	int status;
	if (iter_cached) {
	    status = iter->second;
	}
	else {
	    Method m = class_getInstanceMethod((Class)klass, sel);
	    if (m == NULL) {
		const char *selname = sel_getName(sel);
		sel = helper_sel(selname, strlen(selname));
		if (sel != NULL) {
		    m = class_getInstanceMethod((Class)klass, sel);
		}
	    }

	    IMP imp = method_getImplementation(m);
	    if (UNAVAILABLE_IMP(imp) || imp == (IMP)rb_f_notimplement) {
		status = RESPOND_TO_NOT_EXIST;
	    }
	    else {
		rb_vm_method_node_t *node = method_node_get(m);
		if (node != NULL && (node->flags & VM_METHOD_PRIVATE)) {
		    status = RESPOND_TO_PRIVATE;
		}
		else {
		    status = RESPOND_TO_PUBLIC;
		}
	    }
	    lock();
	    respond_to_cache[key] = status;
	    unlock();
	}
	return status == RESPOND_TO_PUBLIC
	    || (priv && status == RESPOND_TO_PRIVATE);
    }
    else {
	if (imp == NULL || imp == _objc_msgForward) {
	    // The class does not respond to respond_to?:, it's probably
	    // NSProxy-based.
	    return false;
	}
	VALUE args[2];
	int n = 0;
	args[n++] = ID2SYM(rb_intern(sel_getName(sel)));
	if (priv) {
	    rb_vm_method_node_t *node = method_node_get(imp);
	    if (node != NULL
		    && (2 < node->arity.min
			|| (node->arity.max != -1 && 2 > node->arity.max))) {
		// Do nothing, custom respond_to? method incompatible arity.
	    }
	    else {
		args[n++] = Qtrue;
	    }
	}
	return rb_vm_call(obj, selRespondTo, n, args) == Qtrue;
    }
}