Esempio n. 1
0
void main_loops_init(void) {
    system_init();
    debug_init();
    input_init();
    button_init();
    comm_init();
    draw_init(TGL_UPDATE_RATE);
    pacer_init(DISPLAY_TASK_RATE);

    tinygl_font_set (TGL_FONT);
    tinygl_text_speed_set (TGL_TEXT_SPEED);
    tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);
    tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL);
    
    TRACE("\n\n\n**UCFK initialised.**\n");
}
Esempio n. 2
0
int main (void)
{
    uint16_t things_move_tick = 0;
    uint16_t navswitch_tick = 0;
    uint16_t monster_flash_tick = 0;
    bool running = 0;
    bool game_over = 1;
    int duration = 0;

    system_init ();
    navswitch_init ();
    led_init ();
    led_set (LED1, 0);

    tinygl_init (LOOP_RATE);
    tinygl_font_set (&font3x5_1);
    tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL);
    tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);

    pacer_init (LOOP_RATE);

    tinygl_text ("GOBBLE6: PUSH TO START");

    while (1)
    {
        uint8_t col;

        /* Refresh things.  */
        for (col = 0; col < TINYGL_WIDTH; col++)
        {
            pacer_wait ();

            tinygl_update ();
        }

        /* Poll the navswitch and update monster position.  */
        navswitch_tick++;
        if (navswitch_tick >= LOOP_RATE / NAVSWITCH_RATE)
        {
            navswitch_tick = 0;

            navswitch_update ();

            if (navswitch_push_event_p (NAVSWITCH_NORTH))
                things_monster_move (0, -1);
            if (navswitch_push_event_p (NAVSWITCH_SOUTH))
                things_monster_move (0, 1);
            if (navswitch_push_event_p (NAVSWITCH_EAST))
                things_monster_move (1, 0);
            if (navswitch_push_event_p (NAVSWITCH_WEST))
                things_monster_move (-1, 0);
            
            /* Pause/resume things running around.  */
            if (navswitch_push_event_p (NAVSWITCH_PUSH))
            {
                if (! running && game_over)
                {
                    srand (timer_get ());
                    tinygl_clear ();
                    things_create ();

                    duration = 0;
                    game_over = 0;
                }

                running = !running;
                led_set (LED1, running);
            }

            if (running && things_killed_p ())
            {
                char buffer[6];
                
                running = 0;
                game_over = 1;
                led_set (LED1, 0);
                sprintf (buffer, "%d", duration);
                tinygl_text (buffer);
            }
        }

        /* Move the things.  */
        things_move_tick++;
        if (things_move_tick >= LOOP_RATE / MOVE_RATE)
        {
            things_move_tick = 0;
            
            if (running)
            {
                duration++;
                things_move ();
            }
        }

        /* Flash the monster.  */
        monster_flash_tick++;
        if (monster_flash_tick >= LOOP_RATE / MONSTER_FLASH_RATE / 2)
        {
            monster_flash_tick = 0;
            if (running)
                things_monster_toggle ();
        }
    }
    return 0;
}
Esempio n. 3
0
int
main (void)
{
    uint8_t game_ticks;
    uint8_t game_over_ticks;
    state_t state = STATE_INIT;
    flasher_t flashers[SPACEY_PIX_TYPE_NUM];
    uint8_t flasher_state[SPACEY_PIX_TYPE_NUM];
    flasher_obj_t flashers_info[SPACEY_PIX_TYPE_NUM];
    uint8_t display[TINYGL_WIDTH * TINYGL_HEIGHT];
    uint8_t i;
    uint8_t j;
    game_data_t data;
    char message[44];
    ir_serial_ret_t ret;
    uint8_t ir_data;

    system_init ();

    /* The first time EEPROM is read all the bytes are 0xFF so set to
       sensible defaults.  */
    eeprom_read (0, &data, sizeof (data));
    if (data.level == 0xff)
    {
        data.level = 0;
        data.games = 0;
    }

    for (i = 0; i < ARRAY_SIZE (flashers); i++)
    {
        flashers[i] = flasher_init (&flashers_info[i]);
        flasher_state[i] = 0;
    }

    for (i = 0; i < ARRAY_SIZE (display); i++)
        display[i] = 0;

    /* Set up flash patterns for different pixel types.  */
    flasher_pattern_set (flashers[SPACEY_PIX_GUN],
                         &flasher_patterns[FLASH_MODE_GUN]);
    flasher_pattern_set (flashers[SPACEY_PIX_SHELL],
                         &flasher_patterns[FLASH_MODE_SHELL]);
    flasher_pattern_set (flashers[SPACEY_PIX_ALIEN],
                         &flasher_patterns[FLASH_MODE_ALIEN]);
    
    tinygl_init (LOOP_RATE);
    tinygl_font_set (&font3x5_1);
    tinygl_text_mode_set (TINYGL_TEXT_MODE_SCROLL);
    tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);
    tinygl_text_speed_set (10);

    spacey_init (GAME_UPDATE_RATE, TINYGL_WIDTH, TINYGL_HEIGHT, 
                 display_handler, display);

    spacey_event_handler_set (game_event, 0);

    game_ticks = 0;
    game_over_ticks = 0;

    pacer_init (LOOP_RATE);

    while (1)
    {
        pacer_wait ();

        if (state == STATE_PLAYING)
        {
            uint8_t *src;

            /* Update flasher states.  NB, the first flasher is always off.  */
            for (i = 1; i < ARRAY_SIZE (flashers); i++)
                flasher_state[i] = flasher_update (flashers[i]);
            
            /* Update display.  */
            src = display;
            for (j = 0; j < TINYGL_HEIGHT; j++)
                for (i = 0; i < TINYGL_WIDTH; i++)
                {
                    tinygl_point_t point = {i, j};

                    tinygl_draw_point (point, flasher_state[*src++]);
                }
        }

        /* Advance messages and refresh display.  */
        tinygl_update ();
        
        game_ticks++;
        if (game_ticks >= LOOP_RATE / GAME_UPDATE_RATE)
        {
            game_ticks = 0;
                
            switch (state)
            {
            case STATE_PLAYING:
                if (! spacey_update ())
                {
                    game_over_display (message);
                    game_over_ticks = 0;
                    state = STATE_OVER;
                }
                break;
                
            case STATE_INIT:
                tinygl_text ("SPACEY READY V" VERSION " BY MPH ");
                state = STATE_READY;
                break;
                
            case STATE_OVER:
                game_over_ticks ++;
                if (game_over_ticks >= GAME_UPDATE_RATE * GAME_OVER_PERIOD)
                    state = STATE_READY;
                /* Fall through.  */
                
            case STATE_READY:
            case STATE_MENU_LEVEL:
            default:
                break;
                
            case STATE_START:
                /* Turn that bloody blimey space invader off...  */
                game_start (&data);
                state = STATE_PLAYING;
                break;
            }
        }

        ret = ir_serial_receive (&ir_data);
        if (ret == IR_SERIAL_OK)
        {
            if (ir_data == 1)
            {
                switch (state)
                {
                case STATE_READY:
                    state = STATE_MENU_LEVEL;
                    game_level_display (data.level, message);
                    break;

                case STATE_MENU_LEVEL:
                    state = STATE_INIT;
                    break;

                case STATE_PLAYING:
                    spacey_gun_move_right ();
                    break;

                default:
                    break;
                }
            }

            if (ir_data == 2)
            {
                switch (state)
                {
                case STATE_READY:
                    state = STATE_START;
                    break;

                case STATE_PLAYING:
                    spacey_gun_fire ();
                    break;

                case STATE_MENU_LEVEL:
                    data.level++;
                    if (data.level > GAME_LEVEL_MAX)
                        data.level = 0;
                    game_level_display (data.level, message);
                    break;

                default:
                    break;
                }
            }
        }
    }
}
Esempio n. 4
0
int main (void)
{
    int count;
    uint8_t data = 'M';

    system_init ();
    tinygl_init (LOOP_RATE);
    tinygl_font_set (&font3x5_1);
    tinygl_text_speed_set (MESSAGE_RATE);
    tinygl_text_mode_set (TINYGL_TEXT_MODE_STEP);
    tinygl_text_dir_set (TINYGL_TEXT_DIR_ROTATE);

    navswitch_init ();
    ir_uart_init ();

    pacer_init (LOOP_RATE);

    show_byte ('M');

    count = 0;

    /* Paced loop.  */
    while (1)
    {
        /* Wait for next tick.  */
        pacer_wait ();

        tinygl_update ();

        if (ir_uart_read_ready_p ())
        {
            uint8_t data;

            data = ir_uart_getc ();

            /* Note, if messages come in too fast, say due to IR
               inteference from fluorescent lights, then the display
               will not keep up and will appear to freeze.  */
            show_byte (data);
        }

        count++;
        if (count > LOOP_RATE / SWITCH_POLL_RATE)
        {
            count = 0;

            navswitch_update ();

            if (navswitch_push_event_p (NAVSWITCH_WEST))
            {
                ir_uart_putc (--data);
                /* Gobble echoed character.  */
                ir_uart_getc ();
            }

            if (navswitch_push_event_p (NAVSWITCH_EAST))
            {
                ir_uart_putc (++data);
                /* Gobble echoed character.  */
                ir_uart_getc ();
            }
        }
    }

    return 0;
}