From 65a094bd57829118503802220b7125053c643c41 Mon Sep 17 00:00:00 2001
From: qvyuanxin <qvyuanxin@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期二, 04 七月 2017 18:58:25 +0800
Subject: [PATCH] 

---
 VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c                                    |  240 ++++++++++++++++++++++++++++++
 VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java |    3 
 VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp                      |   92 +++++++++++
 VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h                                    |  139 +++++++++++++++++
 4 files changed, 472 insertions(+), 2 deletions(-)

diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp
index 6aa67c6..902077f 100644
--- a/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp
+++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/RtspNativeCodecJNI.cpp
@@ -17,7 +17,7 @@
 #include <stdlib.h>
 
 #include "DebugNetwork.h"
-
+#include "serial.h"
 //#include <mediastreamer2/include/mediastreamer2/msjava.h>
 
 std::stringstream logss;
@@ -691,3 +691,93 @@
 }
 
 }
+
+
+void Delay(unsigned int nDelay)
+{
+    unsigned int i,j,k;
+    for ( i=0;i<nDelay;i++ )
+        for ( j=0;j<6144;j++ )
+            k++;
+}
+
+void callNum(int fd,char phone)
+{
+    switch ( phone)
+    {
+        case '1':
+            serialWriteString(fd,"DA");//1
+            break;
+        case '2':
+            serialWriteString(fd,"DB");//2
+            break;
+        case '3':
+            serialWriteString(fd,"DC");//3
+            break;
+        case '4':
+            serialWriteString(fd,"DD");//4
+            break;
+        case '5':
+            serialWriteString(fd,"DE");//5
+            break;
+        case '6':
+            serialWriteString(fd,"DF");//6
+            break;
+        case '7':
+            serialWriteString(fd,"DG");//7
+            break;
+        case '8':
+            serialWriteString(fd,"DH");//8
+            break;
+        case '9':
+            serialWriteString(fd,"DI");//9
+            break;
+        case '0':
+            serialWriteString(fd,"DJ");//0
+            break;
+    }
+}
+
+void call(const char * phone)
+{
+    int  fd = serialOpen("/dev/ttyS1",2400);
+    serialWriteString(fd,"AA");
+    Delay(10000);
+   while (*phone)
+   {
+       Delay(10000);
+       callNum(fd,*(phone++));
+   }
+}
+
+
+char* jstringTostring(JNIEnv* env, jstring jstr)
+{
+char* rtn = NULL;
+jclass clsstring = env->FindClass("java/lang/String");
+jstring strencode = env->NewStringUTF("utf-8");
+jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
+jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
+jsize alen = env->GetArrayLength(barr);
+jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
+if (alen > 0)
+{
+rtn = (char*)malloc(alen + 1);
+
+memcpy(rtn, ba, alen);
+rtn[alen] = 0;
+}
+env->ReleaseByteArrayElements(barr, ba, 0);
+return rtn;
+}
+
+void Java_cn_com_basic_face_util_RtspFaceNative_telCall(JNIEnv* env, jclass clazz,jstring phone)
+ {
+     call(jstringTostring(phone));
+ }
+
+ void Java_cn_com_basic_face_util_RtspFaceNative_Hang(JNIEnv* env, jclass clazz)
+ {
+       int  fd = serialOpen("/dev/ttyS1",2400);
+           serialWriteString(fd,"BA");
+ }
\ No newline at end of file
diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c
new file mode 100644
index 0000000..d8d3c25
--- /dev/null
+++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.c
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2012 - 2014 Thomas Buck <xythobuz@xythobuz.de>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <dirent.h>
+#include <errno.h>
+#include <time.h>
+#include <poll.h>
+
+#include "serial.h"
+
+#ifndef XON
+#define XON 0x11
+#endif
+
+#ifndef XOFF
+#define XOFF 0x13
+#endif
+
+#ifndef TIMEOUT
+#define TIMEOUT 2
+#endif
+
+int serialOpen(const char *port, unsigned int baud) {
+    struct termios options;
+
+    int fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
+    if (fd == -1) {
+        fprintf(stderr, "Couldn't open port \"%s\": %s\n", port, strerror(errno));
+        return -1;
+    }
+
+    tcgetattr(fd, &options);
+
+    options.c_lflag = 0;
+    options.c_oflag = 0;
+    options.c_iflag = 0;
+
+    // Set Baudrate
+    switch (baud) {
+        case 9600:
+            cfsetispeed(&options, B9600);
+            cfsetospeed(&options, B9600);
+            break;
+        case 19200:
+            cfsetispeed(&options, B19200);
+            cfsetospeed(&options, B19200);
+            break;
+        case 38400:
+            cfsetispeed(&options, B38400);
+            cfsetospeed(&options, B38400);
+            break;
+        //case 76800:
+        //    cfsetispeed(&options, B76800);
+        //    cfsetospeed(&options, B76800);
+        //    break;
+        case 115200:
+            cfsetispeed(&options, B115200);
+            cfsetospeed(&options, B115200);
+            break;
+        default:
+            fprintf(stderr, "Warning: Baudrate not supported!\n");
+            serialClose(fd);
+            return -1;
+    }
+
+    // Input Modes
+    options.c_iflag |= IGNCR; // Ignore CR
+#ifdef XONXOFF
+    options.c_iflag |= IXON; // XON-XOFF Flow Control
+#endif
+
+    // Output Modes
+    options.c_oflag |= OPOST; // Post-process output
+
+    // Control Modes
+    options.c_cflag |= CS8; // 8 data bits
+    options.c_cflag |= CREAD; // Enable Receiver
+    options.c_cflag |= CLOCAL; // Ignore modem status lines
+
+    // Local Modes
+    options.c_lflag |= IEXTEN; // Extended input character processing
+
+    // Special characters
+    options.c_cc[VMIN] = 0; // Always return...
+    options.c_cc[VTIME] = 0; // ..immediately from read()
+#ifdef XONXOFF
+    options.c_cc[VSTOP] = XOFF;
+    options.c_cc[VSTART] = XON;
+#endif
+
+    tcsetattr(fd, TCSANOW, &options);
+
+    tcflush(fd, TCIOFLUSH);
+
+    return fd;
+}
+
+void serialClose(int fd) {
+    tcflush(fd, TCIOFLUSH);
+    close(fd);
+}
+
+int serialHasChar(int fd) {
+    struct pollfd fds;
+    fds.fd = fd;
+    fds.events = (POLLIN | POLLPRI); // Data may be read
+    if (poll(&fds, 1, 0) > 0) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+void serialWaitUntilSent(int fd) {
+    while (tcdrain(fd) == -1) {
+        fprintf(stderr, "Could not drain data: %s\n", strerror(errno));
+    }
+}
+
+unsigned int serialWriteRaw(int fd, const char *d, int len) {
+    unsigned int processed = 0;
+    time_t start = time(NULL);
+
+    while ((processed < len) && (difftime(time(NULL), start) < TIMEOUT)) {
+        int t = write(fd, (d + processed), (len - processed));
+        if (t == -1) {
+            fprintf(stderr, "Error while writing: %s\n", strerror(errno));
+            return processed;
+        } else {
+            processed += t;
+        }
+    }
+
+    return processed;
+}
+
+unsigned int serialReadRaw(int fd, char *d, int len) {
+    unsigned int processed = 0;
+    time_t start = time(NULL);
+
+    while ((processed < len) && (difftime(time(NULL), start) < TIMEOUT)) {
+        int t = read(fd, (d + processed), (len - processed));
+        if (t == -1) {
+            fprintf(stderr, "Error while reading: %s\n", strerror(errno));
+            return processed;
+        } else {
+            processed += t;
+        }
+    }
+
+    return processed;
+}
+
+void serialWriteChar(int fd, char c) {
+    while (serialWriteRaw(fd, &c, 1) != 1);
+}
+
+void serialReadChar(int fd, char *c) {
+    while (serialReadRaw(fd, c, 1) != 1);
+#ifdef XONXOFF
+    if (*c == XON) {
+        if (tcflow(fd, TCOON) == -1) {
+            fprintf(stderr, "Could not restart flow: %s\n", strerror(errno));
+        }
+        serialReadChar(fd, c);
+    } else if (*c == XOFF) {
+        if (tcflow(fd, TCOOFF) == -1) {
+            fprintf(stderr, "Could not stop flow: %s\n", strerror(errno));
+        }
+        serialReadChar(fd, c);
+    }
+#endif
+}
+
+void serialWriteString(int fd, const char *s) {
+    while (*s)
+        serialWriteChar(fd, *(s++));
+}
+
+char** getSerialPorts(void) {
+    DIR *dir;
+    struct dirent *ent;
+
+    int size = 0;
+    dir = opendir("/dev/");
+    while ((ent = readdir(dir)) != NULL) {
+#ifdef SEARCH
+        if (strstr(ent->d_name, SEARCH) != NULL)
+#endif
+        size++;
+    }
+    closedir(dir);
+
+    char **files = (char **)malloc((size + 1) * sizeof(char *));
+
+    int i = 0;
+    dir = opendir("/dev/");
+    while (((ent = readdir(dir)) != NULL) && (i < size)) {
+
+#ifdef SEARCH
+        if (strstr(ent->d_name, SEARCH) != NULL) {
+#endif
+
+            int tmp = strlen(ent->d_name) + 6;
+            files[i] = (char *)malloc(tmp * sizeof(char));
+            strcpy(files[i], "/dev/");
+            strcpy(files[i] + 5, ent->d_name);
+            files[i][tmp - 1] = '\0';
+
+#ifdef TRY_TO_OPEN_PORTS
+            int fdtmp = serialOpen(files[i], 9600);
+            if (fdtmp != -1) {
+                serialClose(fdtmp);
+#endif
+
+                i++;
+
+#ifdef TRY_TO_OPEN_PORTS
+            } else {
+                free(files[i]);
+            }
+#endif
+
+#ifdef SEARCH
+        }
+#endif
+
+    }
+    closedir(dir);
+    files[i] = NULL;
+    return files;
+}
+
diff --git a/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h
new file mode 100644
index 0000000..2df81b3
--- /dev/null
+++ b/VisitFace/RtspNativeCodec/app/src/main/cpp/serial.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2012 - 2014 Thomas Buck <xythobuz@xythobuz.de>
+ */
+
+#ifndef _SERIAL_H_
+#define _SERIAL_H_
+
+/*
+ * Configuration
+ */
+
+/*!
+ * \brief Enable XON/XOFF flow control.
+ *
+ * If you uncomment this definition, the serial port code will
+ * stop sending when a XOFF was received, and start again upon
+ * receiving XON. However, you need to use the blocking
+ * read/write functions!
+ */
+//#define XONXOFF
+#define XON 0x11  //!< XON flow control character
+#define XOFF 0x13 //!< XOFF flow control character
+
+/*!
+ * \brief Search term to filter the list of available ports.
+ *
+ * If you define SEARCH, instead of simply returning a list of
+ * files in /dev/, getSerialPorts() will only return items that
+ * contain the string defined to SEARCH.
+ */
+#define SEARCH "tty"
+
+/*!
+ * \brief Only list real serial ports.
+ *
+ * If you uncomment this definition, getSerialPorts() will try to
+ * open every port, only returning the name if it is a real serial
+ * port. This could cause a big delay, if eg. your system tries to
+ * open non-existing bluetooth devices, waiting for their timeout.
+ * Also, if your console tty is probed, it might change it's settings.
+ */
+//#define TRY_TO_OPEN_PORTS
+
+/*!
+ * \brief The timeout in seconds for raw reading/writing.
+ *
+ * If this amount of time passes without being able to write/read
+ * a character, the raw I/O functions will return 0.
+ */
+#define TIMEOUT 2
+
+/*
+ * Setup
+ */
+
+/*!
+ * \brief open a serial port
+ * \param port name of port
+ * \param baud baudrate
+ * \returns file handle or -1 on error
+ */
+int serialOpen(const char *port, unsigned int baud);
+
+/*!
+ * \brief close an open serial port
+ * \param fd file handle of port to close
+ */
+void serialClose(int fd);
+
+/*!
+ * \brief query available serial ports
+ * \returns string array with serial port names.
+ * Last element is NULL. Don't forget to free()
+ * after using it!
+ */
+char **getSerialPorts(void);
+
+/*
+ * Raw, non-blocking I/O
+ */
+
+/*!
+ * \brief read from an open serial port
+ * \param fd file handle of port to read from
+ * \param data buffer big enough to fit all read data
+ * \param length maximum number of bytes to read
+ * \returns number of bytes really read
+ */
+unsigned int serialReadRaw(int fd, char *data, int length);
+
+/*!
+ * \brief write to an open serial port
+ * \param fd file handle of port to write to
+ * \param data buffer containing data to write
+ * \param length number of bytes to write
+ * \returns number of bytes really written
+ */
+unsigned int serialWriteRaw(int fd, const char *data, int length);
+
+/*!
+ * \brief wait until data is sent
+ * \param fd file handle of port to wait for
+ */
+void serialWaitUntilSent(int fd);
+
+/*
+ * Blocking I/O
+ */
+
+/*!
+ * \brief check if a character has arrived and can be read
+ * \param fd file handle of port to check
+ * \returns 1 if a character is available, 0 if not
+ */
+int serialHasChar(int fd);
+
+/*!
+ * \brief read a single character
+ * \param fd file handle of port to read from
+ * \param c where read character will be stored
+ */
+void serialReadChar(int fd, char *c);
+
+/*!
+ * \brief write a single character
+ * \param fd file handle to write to
+ * \param c character to write
+ */
+void serialWriteChar(int fd, char c);
+
+/*!
+ * \brief write a string
+ * \param fd file handle to write to
+ * \param s C string to be written
+ */
+void serialWriteString(int fd, const char *s);
+
+#endif
+
diff --git a/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java b/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java
index e2e6899..768bb27 100644
--- a/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java
+++ b/VisitFace/RtspNativeCodec/app/src/main/java/cn/com/basic/face/util/RtspFaceNative.java
@@ -61,7 +61,8 @@
     public static native void startCapturePlayer(String uri);
     public static native void stopCapturePlayer();
     public static native ArrayList<NativeImg> getCaptureImages();
-
+    public  static native  call(String phone);
+    public  static native hang();
     public static int COMPANY_ID = 1001;
 
     public static void faceCallBack(int cameraIdx, int count)

--
Gitblit v1.8.0