enum HPMUD_RESULT hpmud_open_device(const char *uri, enum HPMUD_IO_MODE iomode, HPMUD_DEVICE *dd) { HPMUD_DEVICE index=0; enum HPMUD_RESULT stat = HPMUD_R_INVALID_URI; int result; DBG("[%d,%d,%d,%d,%d,%d] hpmud_device_open() uri=%s iomode=%d\n", getpid(), getppid(), getuid(), geteuid(), getgid(), getegid(), uri, iomode); if ((index = new_device(uri, iomode, &result)) == 0) { stat = result; goto bugout; } else { if ((stat = (msp->device[index].vf.open)(&msp->device[index])) != HPMUD_R_OK) { (msp->device[index].vf.close)(&msp->device[index]); /* Open failed perform device cleanup. */ del_device(index); goto bugout; } } *dd = index; stat = HPMUD_R_OK; bugout: return stat; }
enum HPMUD_RESULT hpmud_close_device(HPMUD_DEVICE dd) { enum HPMUD_RESULT stat; DBG("[%d] hpmud_device_close() dd=%d\n", getpid(), dd); if (dd <= 0 || dd > HPMUD_DEVICE_MAX || msp->device[dd].index != dd) { BUG("invalid device_close state\n"); stat = HPMUD_R_INVALID_STATE; } else { stat = (msp->device[dd].vf.close)(&msp->device[dd]); del_device(dd); } return stat; }
void menu_setup_devices() { if(redraw) { clearDisplay(); clear_buttons(); redraw=0; draw_filledRect(0,0,LCD_WIDTH,35,155,100,100); draw_filledCircle(17,17,15,40,80,40); draw_text_8x6(7,10,"Back",255,100,100); uint16_t text_width = get_text_width_16pt("Setup Devices"); draw_text_16pt((LCD_WIDTH-text_width)>>1,9, "Setup Devices", 200,200,255); init_lineitems(); char buf[30]; char buf2[30]; draw_lineitem("","<new>"); for(int i = 0; i < get_device_count();i++) { snprintf(buf,30,"%i",get_device(i)->base_address); char classname[30]; if(get_device(i)->device_class_uuid == 0) { strncpy(classname,"<empty>",30); } else if(get_device_class_by_uuid(get_device(i)->device_class_uuid) == NULL) { strncpy(classname,"<missing>",30); } else { strncpy(classname,get_device_class_by_uuid(get_device(i)->device_class_uuid)->name,30); } snprintf(buf2,30,"%s - %s",classname,get_device(i)->name); draw_lineitem(buf,buf2); } draw_scrollbar(); draw_button_h(257,45,52,42,"^",155,0,0,0,255,0); if((get_device_count()<10)&&(active_row==0)) { draw_button_h(257,92,52,42,"Add",155,0,0,0,255,0); } if(active_row>0) { draw_button_h(257,92,52,42,"Edit",155,0,0,0,255,0); draw_button_h(257,139,52,42,"Delete",155,0,0,0,255,0); } draw_button_h(257,186,52,42,"v",155,0,0,0,255,0); } uint8_t field=0; uint16_t x; uint16_t y; if(check_button_press(&x,&y)==1) { if(y > 41) { field=1; if(y > 184) { field=4; }else if(y > 136) { field=3; }else if(y > 89) { field=2; } } else { if(x < 40) { redraw=1; set_current_execution(menu_setup); } } if(field == 1) { if(active_row > 0) { if(active_row==scroll_offset) { scroll_offset--; } active_row--; } redraw=1; } if(field == 4) { if(active_row < (get_device_count())) { active_row++; int drawline = active_row-scroll_offset; if(drawline==10) { scroll_offset++; } } redraw=1; } if(field == 2) { redraw=1; if(active_row==0) { if(get_device_count()<50) { set_current_execution(menu_setup_devices_add); } } else { set_current_execution(menu_setup_devices_edit); set_device_to_edit(active_row-1); } } if(field == 3) { redraw=1; if(active_row > 0) { del_device(active_row-1); if(active_row==scroll_offset) { scroll_offset--; } active_row--; } } } }