コード例 #1
0
ファイル: dispenser.c プロジェクト: npahucki/peesco-8
int main(void)
{
    uint8_t  id, rec, i, cs;
    color_t  c;
    packet_t p;

    setup();
    stop_motor();
    sei();
    for(i = 0; i < 5; i++)
    {
        set_led_rgb(255, 0, 255);
        _delay_ms(50);
        set_led_rgb(255, 255, 0);
        _delay_ms(50);
    }

    // get the current liquid level 
    update_liquid_level();

    for(;;)
    {
        cli();
        g_reset = 0;
        g_current_sense_detected = 0;
        g_current_sense_num_cycles = 0;
        setup();
        serial_init();
        stop_motor();
        set_led_rgb(0, 0, 255);

        sei();
        id = address_exchange();

        for(; !check_reset();)
        {
            rec = receive_packet(&p);
            if (rec == COMM_CRC_FAIL)
                continue;

            if (rec == COMM_RESET)
                break;

            if (rec == COMM_OK && (p.dest == DEST_BROADCAST || p.dest == id))
            {
                // If we've detected a over current sitatuion, ignore all comamnds until reset
                cli();
                cs = g_current_sense_detected;
                sei();

                switch(p.type)
                {
                    case PACKET_PING:
                        break;

                    case PACKET_SET_MOTOR_SPEED:
                        if (!cs)
                            set_motor_speed(p.p.uint8[0], p.p.uint8[1]);

                        if (p.p.uint8[0] == 0)
                            flush_saved_tick_count(0);
                        break;

                    case PACKET_TICK_DISPENSE:
                        if (!cs)
                        {
                            dispense_ticks((uint16_t)p.p.uint32, 255);
                            flush_saved_tick_count(0);
                        }
                        break;

                    case PACKET_TIME_DISPENSE:
                        if (!cs)
                        {
                            run_motor_timed(p.p.uint32);
                            flush_saved_tick_count(0);
                        }
                        break;

                    case PACKET_IS_DISPENSING:
                        is_dispensing();
                        break;

                    case PACKET_LIQUID_LEVEL:
                        get_liquid_level();
                        break;

                    case PACKET_UPDATE_LIQUID_LEVEL:
                        update_liquid_level();
                        break;

                    case PACKET_LED_OFF:
                        set_led_pattern(LED_PATTERN_OFF);
                        break;

                    case PACKET_LED_IDLE:
                        if (!cs)
                            set_led_pattern(LED_PATTERN_IDLE);
                        break;

                    case PACKET_LED_DISPENSE:
                        if (!cs)
                            set_led_pattern(LED_PATTERN_DISPENSE);
                        break;

                    case PACKET_LED_DRINK_DONE:
                        if (!cs)
                            set_led_pattern(LED_PATTERN_DRINK_DONE);
                        break;

                    case PACKET_LED_CLEAN:
                        if (!cs)
                            set_led_pattern(LED_PATTERN_CLEAN);
                        break;

                    case PACKET_COMM_TEST:
                        comm_test();
                        break;

                    case PACKET_ID_CONFLICT:
                        id_conflict();
                        break;

                    case PACKET_SET_CS_THRESHOLD:
                        g_current_sense_threshold = p.p.uint16[0];
                        break;

                    case PACKET_SAVED_TICK_COUNT:
                        get_saved_tick_count();
                        break;

                    case PACKET_RESET_SAVED_TICK_COUNT:
                        reset_saved_tick_count();
                        break;

                    case PACKET_FLUSH_SAVED_TICK_COUNT:
                        flush_saved_tick_count(1);
                        break;

                    case PACKET_GET_LIQUID_THRESHOLDS:
                        get_liquid_thresholds();
                        break;

                    case PACKET_SET_LIQUID_THRESHOLDS:
                        set_liquid_thresholds(p.p.uint16[0], p.p.uint16[1]);
                        break;

                    case PACKET_TICK_SPEED_DISPENSE:
                        if (!cs)
                        {
                            dispense_ticks(p.p.uint16[0], (uint8_t)p.p.uint16[1]);
                            flush_saved_tick_count(0);
                        }
                        break;
                    case PACKET_PATTERN_DEFINE:
                        pattern_define(p.p.uint8[0]);
                        break;

                    case PACKET_PATTERN_ADD_SEGMENT:
                        c.red = p.p.uint8[0];
                        c.green = p.p.uint8[1];
                        c.blue = p.p.uint8[2];
                        pattern_add_segment(&c, p.p.uint8[3]);
                        break;

                    case PACKET_PATTERN_FINISH:
                        pattern_finish();
                        break;
                }
            }
        }
    }
    return 0;
}
コード例 #2
0
ファイル: dispenser.c プロジェクト: 5monkeys/bartendro
void text_interface(void)
{
    char cmd[MAX_CMD_LEN];
    uint8_t  speed, current_sense;
    uint16_t ticks;
    uint16_t t;
    uint8_t  i, cs;

    for(i = 0; i < 5; i++)
    {
        set_led_rgb(0, 0, 255);
        _delay_ms(150);
        set_led_rgb(0, 0, 0);
        _delay_ms(150);
    }
    set_led_pattern(LED_PATTERN_IDLE);
    for(;;)
    {
        cli();
        g_reset = 0;
        g_current_sense_detected = 0;
        setup();
        stop_motor();
        serial_init();
        cs = 0;
        sei();

        _delay_ms(10);
        dprintf("\nParty Robotics Dispenser at your service!\n\n");

        for(;;)
        {
            cli();
            cs = g_current_sense_detected;
            sei();
            if (!receive_cmd(cmd))
                break;

            if (sscanf(cmd, "speed %hhu %hhu", &speed, &current_sense) == 2)
            {
                if (!cs)
                    set_motor_speed(speed, current_sense);

                if (current_sense == 0)
                    flush_saved_tick_count(0);
                continue;
            }
            if (sscanf(cmd, "tickdisp %hu %hhu", (short unsigned int *)&ticks, &speed) == 2)
            {
                if (!cs)
                {
                    dispense_ticks(ticks, speed);
                    flush_saved_tick_count(0);
                }
                continue;
            }
            if (sscanf(cmd, "timedisp %hu", (short unsigned int *)&t) == 1)
            {
                if (!cs)
                {
                    run_motor_timed(t);
                    flush_saved_tick_count(0);
                }
                continue;
            }
            if (strncmp(cmd, "forward", 7) == 0)
            {
                set_motor_direction(MOTOR_DIRECTION_FORWARD);
                continue;
            }
            if (strncmp(cmd, "backward", 8) == 0)
            {
                set_motor_direction(MOTOR_DIRECTION_BACKWARD);
                continue;
            }
            if (strncmp(cmd, "led_idle", 8) == 0)
            {
                set_led_pattern(LED_PATTERN_IDLE);
                continue;
            }
            if (strncmp(cmd, "led_dispense", 12) == 0)
            {
                set_led_pattern(LED_PATTERN_DISPENSE);
                continue;
            }
            if (strncmp(cmd, "led_done", 8) == 0)
            {
                set_led_pattern(LED_PATTERN_DRINK_DONE);
                continue;
            }
            if (strncmp(cmd, "led_clean", 8) == 0)
            {
                set_led_pattern(LED_PATTERN_CLEAN);
                continue;
            }
            if (strncmp(cmd, "help", 4) == 0)
            {
                dprintf("You can use these commands:\n");
                dprintf("  speed <speed> <cs>\n");
                dprintf("  tickdisp <ticks> <speed>\n");
                dprintf("  timedisp <ms>\n");
                dprintf("  forward\n");
                dprintf("  backward\n");
                dprintf("  reset\n");
                dprintf("  led_idle\n");
                dprintf("  led_dispense\n");
                dprintf("  led_done\n");
                dprintf("  led_clean\n\n");
                dprintf("speed is from 0 - 255. cs = current sense and is 0 or 1.\n");
                dprintf("ticks == number of quarter turns. ms == milliseconds\n");
                continue;
            }
            if (strncmp(cmd, "reset", 5) == 0)
                break;

            dprintf("Unknown command. Use help to get, eh help. Duh.\n");
        }
    }
}