Ejemplo n.º 1
0
jstring Java_com_hid_usbjni_UsbJni_UsbBulkWriteRead(JNIEnv *env, jobject obj, jstring content)
{
	int r;
	char scmd[1024] = {0}, rmsg[1024] = {0};
	unsigned char sbuf[1024], rbuf[1024];
	unsigned int slen, rlen = 0;
	INIT_RETURN_VALUE();

	strncpy(scmd, str, sizeof(scmd) - 1);
	r = str_to_hex(scmd, sbuf, sizeof(sbuf));
	if (r <= 0) {
		pdebug("str_to_hex error: r = %d\n", r);
		snprintf(rmsg, sizeof(rmsg), "str_to_hex error: ret = %d", r);
		r = -1;
		goto out;
	}
	slen = r;

	r = HID_write_read(NULL, sbuf, slen, rbuf, &rlen);
	if (r != 0) {
		snprintf(rmsg, sizeof(rmsg), "HID_write_read error: ret = %d", r);
		goto out;
	}

	if (NULL == hex_to_str(rbuf, rlen, rmsg, sizeof(rmsg))) {
		snprintf(rmsg, sizeof(rmsg), "hex_to_str error");
	}

	r = 0;
out:
	/* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */
	(*env)->ReleaseStringUTFChars(env, content, (const char *)str);
	RETURN_VAL(r, rmsg);
}
Ejemplo n.º 2
0
jstring Java_com_hid_usbjni_UsbJni_UsbJniVersion(JNIEnv *env, jobject obj, jstring content)
{
	int r = 0;
	char rmsg[100] = {0};
	INIT_RETURN_VALUE();

	snprintf(rmsg, sizeof(rmsg), "v20150918B");

	/* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */
	(*env)->ReleaseStringUTFChars(env, content, (const char *)str);
	RETURN_VAL(r, rmsg);
}
Ejemplo n.º 3
0
// Transfer execution to [fiber] coming from the current fiber whose stack has
// [args].
//
// [isCall] is true if [fiber] is being called and not transferred.
//
// [hasValue] is true if a value in [args] is being passed to the new fiber.
// Otherwise, `null` is implicitly being passed.
static PrimitiveResult runFiber(WrenVM* vm, ObjFiber* fiber, Value* args,
                                bool isCall, bool hasValue)
{
  if (isCall)
  {
    if (fiber->caller != NULL) RETURN_ERROR("Fiber has already been called.");
    
    // Remember who ran it.
    fiber->caller = vm->fiber;
  }
  else
  {
    // Edge case: If we are transferring to ourself, immediately return the
    // value. We can't treat this like an actual transfer since when we set the
    // return below, it would overwrite the fiber being transferred to.
    if (fiber == vm->fiber) RETURN_VAL(hasValue ? args[1] : NULL_VAL);
  }
  
  if (fiber->numFrames == 0)
  {
    args[0] = wrenStringFormat(vm, "Cannot $ a finished fiber.",
                               isCall ? "call" : "transfer to");
    return PRIM_ERROR;
  }
  
  if (fiber->error != NULL)
  {
    args[0] = wrenStringFormat(vm, "Cannot $ an aborted fiber.",
                               isCall ? "call" : "transfer to");
    return PRIM_ERROR;
  }
  
  // When the calling fiber resumes, we'll store the result of the call in its
  // stack. If the call has two arguments (the fiber and the value), we only
  // need one slot for the result, so discard the other slot now.
  if (hasValue) vm->fiber->stackTop--;

  // If the fiber was paused, make yield() or transfer() return the result.
  if (fiber->stackTop > fiber->stack)
  {
    *(fiber->stackTop - 1) = hasValue ? args[1] : NULL_VAL;
  }
  
  return PRIM_RUN_FIBER;
}
Ejemplo n.º 4
0
jstring Java_com_hid_usbjni_UsbJni_UsbOpen(JNIEnv *env, jobject obj, jstring content)
{
	int r = 0;
	char rmsg[1024] = {0};
	INIT_RETURN_VALUE();

	if (NULL == (HANDLE)HID_OpenReader(0)) {
		r = -1;
		snprintf(rmsg, sizeof(rmsg), "HID_OpenReader FAIL");
		goto out;
	}

	r = 0;
	snprintf(rmsg, sizeof(rmsg), "HID_OpenReader OK");
out:
	/* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */
	(*env)->ReleaseStringUTFChars(env, content, (const char *)str);
	RETURN_VAL(r, rmsg);
}
Ejemplo n.º 5
0
jstring Java_com_hid_usbjni_UsbJni_UsbClose(JNIEnv *env, jobject obj, jstring content)
{
	int r;
	char rmsg[1024] = {0};
	INIT_RETURN_VALUE();

//	r = TF_CloseReader(NULL);
	r = HID_CloseReader(NULL);
	if (r != 0) {
		if (r == -1)
			snprintf(rmsg, sizeof(rmsg), "dev not opened");
		else
			snprintf(rmsg, sizeof(rmsg), "close fail");
		goto out;
	}

	r = 0;
	snprintf(rmsg, sizeof(rmsg), "close OK");
out:
	/* 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。 */
	(*env)->ReleaseStringUTFChars(env, content, (const char *)str);
	RETURN_VAL(r, rmsg);
}