Объединить протокол терминала TMS2812 для Python и Android

This commit is contained in:
2026-10-01 15:41:43 +03:00
parent e3e30fdad7
commit 3457657979
14 changed files with 729 additions and 9 deletions

View File

@@ -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)