feat(tms2812): добавь общий протокол терминала и привязки Python и Android
This commit is contained in:
@@ -10,6 +10,79 @@
|
||||
#include "periph28335.h"
|
||||
#include "tms2812.h"
|
||||
|
||||
static jbyteArray tms_result(JNIEnv *env, const uint8_t *data, size_t size)
|
||||
{
|
||||
if (size == 0U || size > INT32_MAX) return NULL;
|
||||
jbyteArray result = (*env)->NewByteArray(env, (jsize)size);
|
||||
if (result != NULL) (*env)->SetByteArrayRegion(env, result, 0, (jsize)size, (const jbyte *)data);
|
||||
return result;
|
||||
}
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL
|
||||
Java_ru_setcorp_setprotocol_NativeSetProtocol_nativeTms2812BuildFixed(
|
||||
JNIEnv *env, jobject self, jint controller, jint command, jbyteArray input)
|
||||
{
|
||||
(void)self;
|
||||
if (input == NULL || controller < 0 || controller > 255 || command < 0 || command > 255) return NULL;
|
||||
jsize size = (*env)->GetArrayLength(env, input);
|
||||
if (size > INT32_MAX - 4) return NULL;
|
||||
jbyte *data = (*env)->GetByteArrayElements(env, input, NULL);
|
||||
if (data == NULL) return NULL;
|
||||
uint8_t *output = (uint8_t *)malloc((size_t)size + 4U);
|
||||
if (output == NULL) { (*env)->ReleaseByteArrayElements(env, input, data, JNI_ABORT); return NULL; }
|
||||
size_t written = tms2812_build_fixed_request((uint8_t)controller, (uint8_t)command,
|
||||
(const uint8_t *)data, (size_t)size, output, (size_t)size + 4U);
|
||||
(*env)->ReleaseByteArrayElements(env, input, data, JNI_ABORT);
|
||||
jbyteArray result = tms_result(env, output, written);
|
||||
free(output);
|
||||
return result;
|
||||
}
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL
|
||||
Java_ru_setcorp_setprotocol_NativeSetProtocol_nativeTms2812BuildMemory(
|
||||
JNIEnv *env, jobject self, jint controller, jint command, jlong address, jint value)
|
||||
{
|
||||
(void)self;
|
||||
uint8_t output[12];
|
||||
if (controller < 0 || controller > 255 || command < 0 || command > 255 ||
|
||||
address < 0 || (uint64_t)address > UINT32_MAX || value < 0 || value > 65535) return NULL;
|
||||
size_t written = tms2812_build_memory_request((uint8_t)controller, (uint8_t)command,
|
||||
(uint32_t)address, (uint16_t)value, output, sizeof output);
|
||||
return tms_result(env, output, written);
|
||||
}
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL
|
||||
Java_ru_setcorp_setprotocol_NativeSetProtocol_nativeTms2812BuildTest(
|
||||
JNIEnv *env, jobject self, jint controller, jint duration, jint pause, jbyteArray input)
|
||||
{
|
||||
(void)self;
|
||||
uint8_t output[20];
|
||||
if (input == NULL || controller < 0 || controller > 255 || duration < 0 ||
|
||||
duration > 65535 || pause < 0 || pause > 65535 || (*env)->GetArrayLength(env, input) != 12) return NULL;
|
||||
jbyte *data = (*env)->GetByteArrayElements(env, input, NULL);
|
||||
if (data == NULL) return NULL;
|
||||
size_t written = tms2812_build_test_request((uint8_t)controller, (uint16_t)duration,
|
||||
(uint16_t)pause, (const uint8_t *)data, 12U, output, sizeof output);
|
||||
(*env)->ReleaseByteArrayElements(env, input, data, JNI_ABORT);
|
||||
return tms_result(env, output, written);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL
|
||||
Java_ru_setcorp_setprotocol_NativeSetProtocol_nativeTms2812ValidateResponse(
|
||||
JNIEnv *env, jobject self, jbyteArray input, jint controller, jint command,
|
||||
jint full_size, jboolean allow_short_tail)
|
||||
{
|
||||
(void)self;
|
||||
if (input == NULL || controller < 0 || controller > 255 || command < 0 || command > 255 || full_size < 6) return JNI_FALSE;
|
||||
jsize size = (*env)->GetArrayLength(env, input);
|
||||
jbyte *data = (*env)->GetByteArrayElements(env, input, NULL);
|
||||
if (data == NULL) return JNI_FALSE;
|
||||
int status = tms2812_validate_response((const uint8_t *)data, (size_t)size,
|
||||
(uint8_t)controller, (uint8_t)command, (size_t)full_size, allow_short_tail != JNI_FALSE);
|
||||
(*env)->ReleaseByteArrayElements(env, input, data, JNI_ABORT);
|
||||
return status == TMS2812_OK ? JNI_TRUE : JNI_FALSE;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_ru_setcorp_setprotocol_NativeSetProtocol_nativeTms2812Crc16(
|
||||
JNIEnv *env, jobject self, jbyteArray input)
|
||||
|
||||
Reference in New Issue
Block a user