You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
3.6 KiB
C++
151 lines
3.6 KiB
C++
// Write C++ code here.
|
|
//
|
|
// Do not forget to dynamically load the C++ library into your application.
|
|
//
|
|
// For instance,
|
|
//
|
|
// In MainActivity.java:
|
|
// static {
|
|
// System.loadLibrary("mpmaster");
|
|
// }
|
|
//
|
|
// Or, in MainActivity.kt:
|
|
// companion object {
|
|
// init {
|
|
// System.loadLibrary("mpmaster")
|
|
// }
|
|
// }
|
|
#include <jni.h>
|
|
#include <fcntl.h>
|
|
#include <thread>
|
|
#include <chrono>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/system_properties.h>
|
|
|
|
#include <Client/Database.h>
|
|
|
|
#define IOT_PARAM_WRITE 0xAE
|
|
#define IOT_PARAM_READ 0xAF
|
|
#define MAX_STRING_LEN 32
|
|
|
|
#define PATH_MPAPP_STATS "/sdcard/com.xypower.mpapp/data/stats/"
|
|
|
|
typedef struct
|
|
{
|
|
int cmd;
|
|
int value;
|
|
int result;
|
|
long value2;
|
|
char str[MAX_STRING_LEN];
|
|
}IOT_PARAM;
|
|
|
|
extern "C" JNIEXPORT jint JNICALL
|
|
Java_com_xypower_mpmaster_MpMasterService_getInt(JNIEnv* env, jclass cls, jint cmd) {
|
|
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
|
|
// LOGE("get_int fd=%d,cmd=%d\r\n",fd, cmd);
|
|
if( fd > 0 )
|
|
{
|
|
IOT_PARAM param;
|
|
param.cmd = cmd;
|
|
ioctl(fd, IOT_PARAM_READ, ¶m);
|
|
#ifdef _DEBUG
|
|
ALOGI("getInt cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
|
|
#endif
|
|
close(fd);
|
|
return param.value;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int setGpioInt(int cmd, int val)
|
|
{
|
|
int fd = open("/dev/mtkgpioctrl", O_RDONLY);
|
|
// LOGE("set_int fd=%d,cmd=%d,value=%d\r\n",fd, cmd, value);
|
|
if( fd > 0 )
|
|
{
|
|
IOT_PARAM param;
|
|
param.cmd = cmd;
|
|
param.value = val;
|
|
int res = ioctl(fd, IOT_PARAM_WRITE, ¶m);
|
|
// LOGE("set_int22 cmd=%d,value=%d,result=%d\r\n",param.cmd, param.value, param.result);
|
|
close(fd);
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
extern "C" JNIEXPORT jint JNICALL
|
|
Java_com_xypower_mpmaster_MpMasterService_setInt(JNIEnv* env, jclass cls, jint cmd, jint val) {
|
|
|
|
return setGpioInt(cmd, val);
|
|
}
|
|
|
|
extern "C" JNIEXPORT void JNICALL
|
|
Java_com_xypower_mpmaster_MpMasterService_rebootDevice(JNIEnv* env, jclass cls) {
|
|
// setInt(CMD_SET_SYSTEM_RESET, 1);
|
|
std::thread t([]()
|
|
{
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
|
for (int idx = 0; idx < 3; idx++) {
|
|
if (setGpioInt(202, 1) == 0) {
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
t.detach();
|
|
}
|
|
|
|
extern "C" JNIEXPORT jintArray JNICALL
|
|
Java_com_xypower_mpmaster_MpMasterService_getStats(JNIEnv* env, jclass cls, jlong ts) {
|
|
std::string path = PATH_MPAPP_STATS;
|
|
path += std::to_string(ts);
|
|
|
|
FILE* file = NULL;
|
|
|
|
for (int idx = 0; idx < 3; idx++)
|
|
{
|
|
file = fopen(path.c_str(), "r");
|
|
if (file != NULL)
|
|
{
|
|
break;
|
|
}
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(16));
|
|
}
|
|
|
|
if (file == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
MP_STATS stats = { 0 };
|
|
size_t length = fread(&stats, 1, sizeof(stats), file);
|
|
fclose(file);
|
|
if (length < sizeof(stats))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
size_t intLength = sizeof(stats) / sizeof(jint);
|
|
jintArray result = env->NewIntArray(intLength);
|
|
env->SetIntArrayRegion(result, 0, intLength, (const jint*)&stats);
|
|
return result;
|
|
}
|
|
|
|
|
|
extern "C" JNIEXPORT jstring JNICALL
|
|
Java_com_xypower_mpmaster_MpMasterService_getSystemProperty(
|
|
JNIEnv* env,
|
|
jclass cls, jstring key) {
|
|
|
|
const char *keyStr = env->GetStringUTFChars(key, 0);
|
|
|
|
char value[PROP_VALUE_MAX] = { 0 };
|
|
__system_property_get(keyStr, value);
|
|
|
|
env->ReleaseStringUTFChars(key, keyStr);
|
|
|
|
return env->NewStringUTF(value);
|
|
}
|
|
|