aboutsummaryrefslogtreecommitdiff
path: root/flow/src/main/native/posix/flow_jni.c
blob: 3af2873827a2d9395d5729df613d928e70b07be7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "flow.h"
#include "com_github_jodersky_flow_internal_NativeSerial.h"

inline struct serial_config* j2s(jlong pointer) {
    return (struct serial_config*) pointer;
}

inline jlong s2j(struct serial_config* pointer) {
    return (jlong) pointer;
}

JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_open
(JNIEnv *env, jclass clazz, jstring port_name, jint baud, jint char_size, jboolean two_stop_bits, jint parity, jlongArray jserialp)
{ 
  const char *dev = (*env)->GetStringUTFChars(env, port_name, 0);
  struct serial_config* serial;
  int r = serial_open(dev, baud, char_size, two_stop_bits, parity, &serial);
  (*env)->ReleaseStringUTFChars(env, port_name, dev);
  
  long serialp = s2j(serial);
  (*env)->SetLongArrayRegion(env, jserialp, 0, 1, &serialp);
  
  return r;
}

JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_close
(JNIEnv * env, jclass clazz, jlong serial)
{
  serial_close(j2s(serial));
}

JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_read
(JNIEnv * env, jclass clazz, jlong serial, jbyteArray jbuffer)
{

  jsize size = (*env)->GetArrayLength(env, jbuffer);
  
  unsigned char buffer[size];
  int n = serial_read(j2s(serial), buffer, size);
  if (n < 0) {
    return n;
}

(*env)->SetByteArrayRegion(env, jbuffer, 0, n, (signed char *) buffer);
return n;
}

JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_write
(JNIEnv * env, jclass clazz, jlong serial, jbyteArray jbuffer)
{
  unsigned char * buffer = (*env)->GetByteArrayElements(env, jbuffer, NULL);
  int size = (*env)->GetArrayLength(env, jbuffer);
  int r = serial_write(j2s(serial), buffer, size);
  
  (*env)->ReleaseByteArrayElements(env, jbuffer, buffer, JNI_ABORT);
  
  return r;
}

JNIEXPORT jint JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_interrupt
(JNIEnv * env, jclass clazz, jlong serial)
{
  return serial_interrupt(j2s(serial));
}

JNIEXPORT void JNICALL Java_com_github_jodersky_flow_internal_NativeSerial_debug
(JNIEnv *env, jclass clazz, jboolean value)
{
  serial_debug((bool) value);
}