int mscbbus_init(HNDLE hkey, void **pinfo) { HNDLE hDB, hkeybd; INT size, status; MSCBBUS_INFO *info; /* allocate info structure */ info = calloc(1, sizeof(MSCBBUS_INFO)); *pinfo = info; cm_get_experiment_database(&hDB, NULL); /* create MSCBBUS settings record */ status = db_create_record(hDB, hkey, "BD", MSCBBUS_SETTINGS_STR); if (status != DB_SUCCESS) return FE_ERR_ODB; db_find_key(hDB, hkey, "BD", &hkeybd); size = sizeof(info->settings); db_get_record(hDB, hkeybd, &info->settings, &size, 0); /* open port */ // check if ethernet submaster info->fd = mscb_init(info->settings.mscb_device, sizeof(info->settings.mscb_device), info->settings.pwd, FALSE); if (info->fd < 0) return FE_ERR_HW; /* check if scs_210 is alive */ status = mscb_addr(info->fd, MCMD_PING16, info->settings.address, 1); if (status != MSCB_SUCCESS) { if (status == MSCB_SEMAPHORE) printf("MSCB used by other process\n"); else if (status == MSCB_SUBM_ERROR) printf("Error: MSCB Submaster not responding\n"); else printf("MSCB Node %d does not respond\n", info->settings.address); return FE_ERR_HW; } return SUCCESS; }
int server_execute(int index, void *prpc_param[]) { int status; switch (index) { default: abort(); break; case RPC_MSCB_INIT: status = mscb_init(CSTRING(0), CINT(1), CINT(2)); break; case RPC_MSCB_EXIT: status = mscb_exit(CINT(0)); break; case RPC_MSCB_REBOOT: status = mscb_reboot(CINT(0), CINT(1)); break; case RPC_MSCB_RESET: status = mscb_reset(CINT(0)); break; case RPC_MSCB_PING: status = mscb_ping(CINT(0), CINT(1)); break; case RPC_MSCB_INFO: status = mscb_info(CINT(0), CINT(1), CARRAY(2)); break; case RPC_MSCB_INFO_VARIABLE: status = mscb_info_variable(CINT(0), CINT(1), CINT(2), CARRAY(3)); break; case RPC_MSCB_SET_ADDR: status = mscb_set_addr(CINT(0), CINT(1), CINT(2), CINT(3)); break; case RPC_MSCB_SET_NAME: status = mscb_set_name(CINT(0), CINT(1), CSTRING(2)); break; case RPC_MSCB_WRITE_GROUP: status = mscb_write_group(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CINT(4)); break; case RPC_MSCB_WRITE: status = mscb_write(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CINT(4)); break; case RPC_MSCB_FLASH: status = mscb_flash(CINT(0), CINT(1)); break; case RPC_MSCB_UPLOAD: status = mscb_upload(CINT(0), CINT(1), CARRAY(2), CINT(3), CINT(4)); break; case RPC_MSCB_READ: status = mscb_read(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CPINT(4)); break; case RPC_MSCB_READ_RANGE: status = mscb_read_range(CINT(0), CINT(1), CBYTE(2), CBYTE(3), CARRAY(4), CPINT(5)); break; case RPC_MSCB_ECHO: status = mscb_echo(CINT(0), CINT(1), CBYTE(2), CPBYTE(3)); break; case RPC_MSCB_USER: status = mscb_user(CINT(0), CINT(1), CARRAY(2), CINT(3), CARRAY(4), CPINT(5)); break; case RPC_MSCB_ADDR: status = mscb_addr(CINT(0), CINT(1), CINT(2), CINT(3), CINT(4)); break; } return status; }