/* * call-seq: * LCD.new(font, x, y, width, height, color) # => LCD * * Creates LCD object. * * Parameters: * +font+ font size. * :small small font (6x8, default) * :medium medium font (8x16) * +x+ Window origin (left) X coordinate. (default: 0) * +y+ Window origin (top) Y coordinate. (default: 0) * +width+ Width of window. (default: LCD::WIDTH) * +height+ Height of window. (default: LCD::HEIGHT) * +color+ LCD foreground color. * :black black (default) * :white while * * Returns LCD object. */ static mrb_value mrb_lcd_init(mrb_state *mrb, mrb_value self) { struct RClass *lcd = mrb_obj_class(mrb, self); mrb_value fmap = mrb_const_get(mrb, mrb_obj_value(lcd), mrb_intern_lit(mrb, "FONT")); mrb_value cmap = mrb_const_get(mrb, mrb_obj_value(lcd), mrb_intern_lit(mrb, "COLOR")); mrb_sym font = mrb_intern_lit(mrb, "small"); mrb_sym col = mrb_intern_lit(mrb, "black"); mrb_value fontv; mrb_value colv; mrb_lcd_t *plcd; DATA_TYPE(self) = &mrb_lcd_type; plcd = (mrb_lcd_t*)mrb_malloc(mrb, sizeof(mrb_lcd_t)); DATA_PTR(self) = plcd; memset(plcd, 0, sizeof(mrb_lcd_t)); plcd->width = EV3_LCD_WIDTH; plcd->height = EV3_LCD_HEIGHT; mrb_get_args(mrb, "|niiiin", &font, &plcd->left, &plcd->top, &plcd->width, &plcd->height, &col); fontv = mrb_hash_get(mrb, fmap, mrb_symbol_value(font)); if (mrb_nil_p(fontv)) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid font size :%S", mrb_sym2str(mrb, font)); } plcd->font = mrb_fixnum(fontv); if (_font_size[plcd->font].w == 0) { /* initialize font size at 1st time */ ev3_font_get_size(plcd->font, &_font_size[plcd->font].w, &_font_size[plcd->font].h); } colv = mrb_hash_get(mrb, cmap, mrb_symbol_value(col)); if (mrb_nil_p(colv)) { mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid foreground color :%S", mrb_sym2str(mrb, col)); } plcd->color = mrb_fixnum(colv); return self; }
void main_task(intptr_t unused) { ev3_lcd_set_font(EV3_FONT_MEDIUM); ev3_font_get_size(EV3_FONT_MEDIUM, &fontw, &fonth); memfile_t memfile; ev3_memfile_load("/test.bmp", &memfile); image_t image; ev3_image_load(&memfile, &image); ev3_lcd_draw_image(&image, 0, fonth * 2); //ev3_sta_cyc(TEST_EV3_CYC1); // Enable TEST_EV3_CYC2 for 5 seconds ev3_sta_cyc(TEST_EV3_CYC2); tslp_tsk(5000); ev3_stp_cyc(TEST_EV3_CYC2); #if 0 // Register button handlers ev3_button_set_on_clicked(BACK_BUTTON, button_clicked_handler, BACK_BUTTON); ev3_button_set_on_clicked(ENTER_BUTTON, button_clicked_handler, ENTER_BUTTON); ev3_button_set_on_clicked(LEFT_BUTTON, button_clicked_handler, LEFT_BUTTON); // Configure sensors ev3_sensor_config(gyro_sensor, GYRO_SENSOR); // Configure motors ev3_motor_config(left_motor, LARGE_MOTOR); ev3_motor_config(right_motor, LARGE_MOTOR); // Start task for self-balancing act_tsk(BALANCE_TASK); // Open Bluetooth file bt = ev3_serial_open_file(EV3_SERIAL_BT); assert(bt != NULL); // Start task for printing message while idle act_tsk(IDLE_TASK); while(1) { uint8_t c = fgetc(bt); sus_tsk(IDLE_TASK); switch(c) { case 'w': if(motor_control_drive < 0) motor_control_drive = 0; else motor_control_drive += 10; fprintf(bt, "motor_control_drive: %d\n", motor_control_drive); break; case 's': if(motor_control_drive > 0) motor_control_drive = 0; else motor_control_drive -= 10; fprintf(bt, "motor_control_drive: %d\n", motor_control_drive); break; case 'a': if(motor_control_steer < 0) motor_control_steer = 0; else motor_control_steer += 10; fprintf(bt, "motor_control_steer: %d\n", motor_control_steer); break; case 'd': if(motor_control_steer > 0) motor_control_steer = 0; else motor_control_steer -= 10; fprintf(bt, "motor_control_steer: %d\n", motor_control_steer); break; case 'h': fprintf(bt, "==========================\n"); fprintf(bt, "Usage:\n"); fprintf(bt, "Press 'w' to speed up\n"); fprintf(bt, "Press 's' to speed down\n"); fprintf(bt, "Press 'a' to turn left\n"); fprintf(bt, "Press 'd' to turn right\n"); fprintf(bt, "Press 'i' for idle task\n"); fprintf(bt, "Press 'h' for this message\n"); fprintf(bt, "==========================\n"); break; case 'i': fprintf(bt, "Idle task started.\n"); rsm_tsk(IDLE_TASK); break; default: fprintf(bt, "Unknown key '%c' pressed.\n", c); } } #endif }
static void mrb_lcd_get_font_size(mrb_state *mrb, mrb_value lcd, mrb_int *fw, mrb_int *fh) { mrb_value font = mrb_cv_get(mrb, lcd, mrb_intern_lit(mrb, "@@font")); ev3_font_get_size(mrb_fixnum(font), fw, fh); }
void set_font(lcdfont_t font) { ev3_lcd_set_font(font); ev3_font_get_size(font, &FONT_WIDTH, &FONT_HEIGHT); }