capacitor-motioncal 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +316 -70
- package/android/CMakeLists.txt +29 -0
- package/android/build.gradle +4 -4
- package/android/src/main/java/com/denizak/motioncalibration/{MotionCalibrationPlugin.java → MotionCalibration.java} +16 -45
- package/android/src/main/jni/jni_bridge.c +197 -0
- package/common/imuread.h +1 -15
- package/common/rawdata.c +8 -11
- package/common/serialdata.c +0 -59
- package/dist/docs.json +7 -68
- package/dist/esm/definitions.d.ts +11 -29
- package/dist/esm/web.d.ts +2 -13
- package/dist/esm/web.js +1 -10
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +1 -10
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +1 -10
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/MotionCalibrationPlugin/MotionCalibrationPlugin.swift +7 -43
- package/package.json +3 -2
- package/android/src/main/jniLibs/arm64-v8a/libmotioncalibration.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libmotioncalibration.so +0 -0
- package/android/src/main/jniLibs/x86/libmotioncalibration.so +0 -0
- package/android/src/main/jniLibs/x86_64/libmotioncalibration.so +0 -0
- package/common/motioncalibration.c +0 -7
- package/common/motioncalibration.h +0 -12
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jni_bridge.c
|
|
3
|
+
*
|
|
4
|
+
* JNI wrappers exposing the MotionCal C algorithm to the Java plugin.
|
|
5
|
+
* Each function maps 1-to-1 to a `private native` declaration in MotionCalibration.java.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include <jni.h>
|
|
9
|
+
#include <stdint.h>
|
|
10
|
+
#include <string.h>
|
|
11
|
+
#include "imuread.h"
|
|
12
|
+
|
|
13
|
+
/* Expand JNI symbol names without repeating the full package path each time. */
|
|
14
|
+
#define JNIFUNC(name) \
|
|
15
|
+
Java_com_denizak_motioncalibration_MotionCalibration_##name
|
|
16
|
+
|
|
17
|
+
/* Size of the calibration output packet (see send_calibration() in rawdata.c). */
|
|
18
|
+
#define CAL_DATA_SIZE 68
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/* ── isSendCalAvailableNative ─────────────────────────────────────────────── */
|
|
22
|
+
|
|
23
|
+
JNIEXPORT jshort JNICALL
|
|
24
|
+
JNIFUNC(isSendCalAvailableNative)(JNIEnv *env, jobject thiz)
|
|
25
|
+
{
|
|
26
|
+
return (jshort) is_send_cal_available();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
/* ── rawDataNative ─────────────────────────────────────────────────────────
|
|
31
|
+
* Receives the 9-element int16 array from Java and feeds it to the algorithm.
|
|
32
|
+
* Array layout: [ax, ay, az, gx, gy, gz, mx, my, mz]
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
JNIEXPORT void JNICALL
|
|
36
|
+
JNIFUNC(rawDataNative)(JNIEnv *env, jobject thiz, jshortArray data)
|
|
37
|
+
{
|
|
38
|
+
jshort *elems = (*env)->GetShortArrayElements(env, data, NULL);
|
|
39
|
+
raw_data((const int16_t *) elems);
|
|
40
|
+
(*env)->ReleaseShortArrayElements(env, data, elems, JNI_ABORT);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
/* ── sendCalibrationNative ─────────────────────────────────────────────────── */
|
|
45
|
+
|
|
46
|
+
JNIEXPORT jint JNICALL
|
|
47
|
+
JNIFUNC(sendCalibrationNative)(JNIEnv *env, jobject thiz)
|
|
48
|
+
{
|
|
49
|
+
return (jint) send_calibration();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
/* ── Quality metrics ──────────────────────────────────────────────────────── */
|
|
54
|
+
|
|
55
|
+
JNIEXPORT jfloat JNICALL
|
|
56
|
+
JNIFUNC(getQualitySurfaceGapErrorNative)(JNIEnv *env, jobject thiz)
|
|
57
|
+
{
|
|
58
|
+
return (jfloat) quality_surface_gap_error();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
JNIEXPORT jfloat JNICALL
|
|
62
|
+
JNIFUNC(getQualityMagnitudeVarianceErrorNative)(JNIEnv *env, jobject thiz)
|
|
63
|
+
{
|
|
64
|
+
return (jfloat) quality_magnitude_variance_error();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
JNIEXPORT jfloat JNICALL
|
|
68
|
+
JNIFUNC(getQualityWobbleErrorNative)(JNIEnv *env, jobject thiz)
|
|
69
|
+
{
|
|
70
|
+
return (jfloat) quality_wobble_error();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
JNIEXPORT jfloat JNICALL
|
|
74
|
+
JNIFUNC(getQualitySphericalFitErrorNative)(JNIEnv *env, jobject thiz)
|
|
75
|
+
{
|
|
76
|
+
return (jfloat) quality_spherical_fit_error();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
/* ── displayCallbackNative ─────────────────────────────────────────────────── */
|
|
81
|
+
|
|
82
|
+
JNIEXPORT void JNICALL
|
|
83
|
+
JNIFUNC(displayCallbackNative)(JNIEnv *env, jobject thiz)
|
|
84
|
+
{
|
|
85
|
+
display_callback();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/* ── getCalibrationDataNative ──────────────────────────────────────────────── */
|
|
90
|
+
|
|
91
|
+
JNIEXPORT jbyteArray JNICALL
|
|
92
|
+
JNIFUNC(getCalibrationDataNative)(JNIEnv *env, jobject thiz)
|
|
93
|
+
{
|
|
94
|
+
const uint8_t *data = get_calibration_data();
|
|
95
|
+
if (data == NULL) return NULL;
|
|
96
|
+
|
|
97
|
+
jbyteArray result = (*env)->NewByteArray(env, CAL_DATA_SIZE);
|
|
98
|
+
if (result == NULL) return NULL;
|
|
99
|
+
|
|
100
|
+
(*env)->SetByteArrayRegion(env, result, 0, CAL_DATA_SIZE, (const jbyte *) data);
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/* ── convertDrawPoints ─────────────────────────────────────────────────────
|
|
106
|
+
* Returns float[][] where each inner array is [x, y, z] for one sphere point.
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
JNIEXPORT jobjectArray JNICALL
|
|
110
|
+
JNIFUNC(convertDrawPoints)(JNIEnv *env, jobject thiz)
|
|
111
|
+
{
|
|
112
|
+
int count = get_draw_points_count();
|
|
113
|
+
float *points = get_draw_points();
|
|
114
|
+
|
|
115
|
+
jclass floatArrayCls = (*env)->FindClass(env, "[F");
|
|
116
|
+
jobjectArray result = (*env)->NewObjectArray(env, count, floatArrayCls, NULL);
|
|
117
|
+
|
|
118
|
+
for (int i = 0; i < count; i++) {
|
|
119
|
+
jfloatArray pt = (*env)->NewFloatArray(env, 3);
|
|
120
|
+
jfloat coords[3] = {
|
|
121
|
+
(jfloat) points[i * 3],
|
|
122
|
+
(jfloat) points[i * 3 + 1],
|
|
123
|
+
(jfloat) points[i * 3 + 2]
|
|
124
|
+
};
|
|
125
|
+
(*env)->SetFloatArrayRegion(env, pt, 0, 3, coords);
|
|
126
|
+
(*env)->SetObjectArrayElement(env, result, i, pt);
|
|
127
|
+
(*env)->DeleteLocalRef(env, pt);
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
/* ── resetRawDataNative ────────────────────────────────────────────────────── */
|
|
134
|
+
|
|
135
|
+
JNIEXPORT void JNICALL
|
|
136
|
+
JNIFUNC(resetRawDataNative)(JNIEnv *env, jobject thiz)
|
|
137
|
+
{
|
|
138
|
+
raw_data_reset();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
/* ── getHardIronOffsetNative ───────────────────────────────────────────────── */
|
|
143
|
+
|
|
144
|
+
JNIEXPORT jfloatArray JNICALL
|
|
145
|
+
JNIFUNC(getHardIronOffsetNative)(JNIEnv *env, jobject thiz)
|
|
146
|
+
{
|
|
147
|
+
float V[3];
|
|
148
|
+
get_hard_iron_offset(V);
|
|
149
|
+
|
|
150
|
+
jfloatArray result = (*env)->NewFloatArray(env, 3);
|
|
151
|
+
(*env)->SetFloatArrayRegion(env, result, 0, 3, (const jfloat *) V);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
/* ── getSoftIronMatrixNative ───────────────────────────────────────────────── */
|
|
157
|
+
|
|
158
|
+
JNIEXPORT jobjectArray JNICALL
|
|
159
|
+
JNIFUNC(getSoftIronMatrixNative)(JNIEnv *env, jobject thiz)
|
|
160
|
+
{
|
|
161
|
+
float invW[3][3];
|
|
162
|
+
get_soft_iron_matrix(invW);
|
|
163
|
+
|
|
164
|
+
jclass floatArrayCls = (*env)->FindClass(env, "[F");
|
|
165
|
+
jobjectArray result = (*env)->NewObjectArray(env, 3, floatArrayCls, NULL);
|
|
166
|
+
|
|
167
|
+
for (int i = 0; i < 3; i++) {
|
|
168
|
+
jfloatArray row = (*env)->NewFloatArray(env, 3);
|
|
169
|
+
jfloat vals[3] = {
|
|
170
|
+
(jfloat) invW[i][0],
|
|
171
|
+
(jfloat) invW[i][1],
|
|
172
|
+
(jfloat) invW[i][2]
|
|
173
|
+
};
|
|
174
|
+
(*env)->SetFloatArrayRegion(env, row, 0, 3, vals);
|
|
175
|
+
(*env)->SetObjectArrayElement(env, result, i, row);
|
|
176
|
+
(*env)->DeleteLocalRef(env, row);
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
/* ── getGeomagneticFieldMagnitudeNative ────────────────────────────────────── */
|
|
183
|
+
|
|
184
|
+
JNIEXPORT jfloat JNICALL
|
|
185
|
+
JNIFUNC(getGeomagneticFieldMagnitudeNative)(JNIEnv *env, jobject thiz)
|
|
186
|
+
{
|
|
187
|
+
return (jfloat) get_geomagnetic_field_magnitude();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
/* ── clearDrawPointsNative ─────────────────────────────────────────────────── */
|
|
192
|
+
|
|
193
|
+
JNIEXPORT void JNICALL
|
|
194
|
+
JNIFUNC(clearDrawPointsNative)(JNIEnv *env, jobject thiz)
|
|
195
|
+
{
|
|
196
|
+
clear_draw_points();
|
|
197
|
+
}
|
package/common/imuread.h
CHANGED
|
@@ -38,21 +38,14 @@ typedef struct {
|
|
|
38
38
|
} Quaternion_t;
|
|
39
39
|
extern Quaternion_t current_orientation;
|
|
40
40
|
|
|
41
|
-
extern int port_is_open(void);
|
|
42
|
-
extern int open_port(const char *name);
|
|
43
|
-
extern int read_serial_data(void);
|
|
44
|
-
extern int write_serial_data(const void *ptr, int len);
|
|
45
|
-
extern void close_port(void);
|
|
46
41
|
void raw_data_reset(void);
|
|
47
42
|
void cal1_data(const float *data);
|
|
48
43
|
void cal2_data(const float *data);
|
|
49
44
|
void calibration_confirmed(void);
|
|
50
45
|
void raw_data(const int16_t *data);
|
|
51
46
|
extern int send_calibration(void);
|
|
52
|
-
void visualize_init(void);
|
|
53
47
|
void apply_calibration(int16_t rawx, int16_t rawy, int16_t rawz, Point_t *out);
|
|
54
48
|
extern void display_callback(void);
|
|
55
|
-
void resize_callback(int width, int height);
|
|
56
49
|
int MagCal_Run(void);
|
|
57
50
|
void quality_reset(void);
|
|
58
51
|
void quality_update(const Point_t *point);
|
|
@@ -61,17 +54,10 @@ extern float quality_magnitude_variance_error(void);
|
|
|
61
54
|
extern float quality_wobble_error(void);
|
|
62
55
|
extern float quality_spherical_fit_error(void);
|
|
63
56
|
extern short is_send_cal_available(void);
|
|
64
|
-
extern void set_result_filename(const char *filename);
|
|
65
|
-
|
|
66
|
-
// PhiEs start ==
|
|
67
|
-
extern void clear_file(const char *filename);
|
|
68
|
-
extern int read_ipc_file_data(const char *filename);
|
|
69
|
-
extern int write_ipc_file_data(const void *ptr, int len);
|
|
70
57
|
extern const uint8_t* get_calibration_data(void);
|
|
71
58
|
extern float* get_draw_points(void);
|
|
72
59
|
extern int get_draw_points_count(void);
|
|
73
|
-
extern void clear_draw_points(void);
|
|
74
|
-
// PhiEs end ======
|
|
60
|
+
extern void clear_draw_points(void);
|
|
75
61
|
|
|
76
62
|
// Expose MagCalibration_t properties
|
|
77
63
|
extern void get_hard_iron_offset(float V[3]);
|
package/common/rawdata.c
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
#include "imuread.h"
|
|
2
2
|
|
|
3
|
-
extern float draw_points[MAGBUFFSIZE * 3];
|
|
4
|
-
|
|
5
3
|
static int rawcount=OVERSAMPLE_RATIO;
|
|
6
4
|
static AccelSensor_t accel;
|
|
7
5
|
static MagSensor_t mag;
|
|
@@ -149,8 +147,7 @@ void cal1_data(const float *data)
|
|
|
149
147
|
if (ok) {
|
|
150
148
|
cal_confirm_needed &= ~1; // got cal1 confirm
|
|
151
149
|
if (cal_confirm_needed == 0) {
|
|
152
|
-
|
|
153
|
-
// calibration_confirmed();
|
|
150
|
+
calibration_confirmed();
|
|
154
151
|
}
|
|
155
152
|
}
|
|
156
153
|
}
|
|
@@ -168,8 +165,7 @@ void cal2_data(const float *data)
|
|
|
168
165
|
if (ok) {
|
|
169
166
|
cal_confirm_needed &= ~2; // got cal2 confirm
|
|
170
167
|
if (cal_confirm_needed == 0) {
|
|
171
|
-
|
|
172
|
-
// calibration_confirmed();
|
|
168
|
+
calibration_confirmed();
|
|
173
169
|
}
|
|
174
170
|
}
|
|
175
171
|
}
|
|
@@ -326,11 +322,7 @@ int send_calibration(void)
|
|
|
326
322
|
cal_data_sent[16] = magcal.invW[2][0];
|
|
327
323
|
cal_data_sent[17] = magcal.invW[2][1];
|
|
328
324
|
cal_data_sent[18] = magcal.invW[2][2];
|
|
329
|
-
// PhiEs: update on 17/02/2025 at
|
|
330
|
-
// Change cal_confirm_needed = 2 to adjust data resend from
|
|
331
|
-
// cal_confirm_needed = 3;
|
|
332
325
|
cal_confirm_needed = 3;
|
|
333
|
-
// PhiEs: end
|
|
334
326
|
crc = 0xFFFF;
|
|
335
327
|
for (i=0; i < 66; i++) {
|
|
336
328
|
crc = crc16(crc, buf[i]);
|
|
@@ -340,10 +332,15 @@ int send_calibration(void)
|
|
|
340
332
|
|
|
341
333
|
memcpy(data_result, buf, 68);
|
|
342
334
|
|
|
343
|
-
return
|
|
335
|
+
return 1;
|
|
344
336
|
}
|
|
345
337
|
|
|
346
338
|
const uint8_t* get_calibration_data(void)
|
|
347
339
|
{
|
|
348
340
|
return data_result;
|
|
349
341
|
}
|
|
342
|
+
|
|
343
|
+
void calibration_confirmed(void)
|
|
344
|
+
{
|
|
345
|
+
// No-op on mobile: the plugin layer polls calibration state directly.
|
|
346
|
+
}
|
package/common/serialdata.c
CHANGED
|
@@ -439,63 +439,4 @@ static void newdata(const unsigned char *data, int len)
|
|
|
439
439
|
{
|
|
440
440
|
packet_parse(data, len);
|
|
441
441
|
ascii_parse(data, len);
|
|
442
|
-
// TODO: learn which one and skip the other
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
// PhiEs start =======
|
|
446
|
-
void clear_file(const char *filename) {
|
|
447
|
-
FILE *file = fopen(filename, "w");
|
|
448
|
-
if (file != NULL)
|
|
449
|
-
{
|
|
450
|
-
fclose(file);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
int read_ipc_file_data(const char *filename)
|
|
455
|
-
{
|
|
456
|
-
char buf[256];
|
|
457
|
-
FILE *inFile = fopen(filename, "rb");
|
|
458
|
-
if(inFile) {
|
|
459
|
-
if (fgets(buf,sizeof(buf),inFile) != NULL)
|
|
460
|
-
{
|
|
461
|
-
clear_file(filename);
|
|
462
|
-
// Conver to uchar
|
|
463
|
-
unsigned char uchar_data[256];
|
|
464
|
-
for (size_t i = 0; i < strlen(buf); i++) {
|
|
465
|
-
uchar_data[i] = (unsigned char)buf[i];
|
|
466
|
-
}
|
|
467
|
-
uchar_data[strlen(buf)] = '\0';
|
|
468
|
-
newdata(uchar_data, sizeof(uchar_data));
|
|
469
|
-
}
|
|
470
|
-
fclose(inFile);
|
|
471
|
-
return sizeof(buf);
|
|
472
|
-
}
|
|
473
|
-
return 0;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
static char result_filename[512];
|
|
477
|
-
int write_ipc_file_data(const void *ptr, int len)
|
|
478
|
-
{
|
|
479
|
-
FILE *file = fopen(result_filename, "wb");
|
|
480
|
-
if (!file) {
|
|
481
|
-
perror("Error opening file");
|
|
482
|
-
return -1;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
int written = fwrite(ptr, 1, len, file);
|
|
486
|
-
if (written < len) {
|
|
487
|
-
perror("Error writing to file");
|
|
488
|
-
fclose(file);
|
|
489
|
-
return -1;
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
fclose(file);
|
|
493
|
-
return written;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
// PhiEs end =======
|
|
497
|
-
|
|
498
|
-
void set_result_filename(const char *filename) {
|
|
499
|
-
strncpy(result_filename, filename, sizeof(result_filename) - 1);
|
|
500
|
-
result_filename[sizeof(result_filename) - 1] = '\0';
|
|
501
442
|
}
|
package/dist/docs.json
CHANGED
|
@@ -5,42 +5,6 @@
|
|
|
5
5
|
"docs": "",
|
|
6
6
|
"tags": [],
|
|
7
7
|
"methods": [
|
|
8
|
-
{
|
|
9
|
-
"name": "updateBValue",
|
|
10
|
-
"signature": "(options: { value: number; }) => Promise<void>",
|
|
11
|
-
"parameters": [
|
|
12
|
-
{
|
|
13
|
-
"name": "options",
|
|
14
|
-
"docs": "- Object containing the value to set",
|
|
15
|
-
"type": "{ value: number; }"
|
|
16
|
-
}
|
|
17
|
-
],
|
|
18
|
-
"returns": "Promise<void>",
|
|
19
|
-
"tags": [
|
|
20
|
-
{
|
|
21
|
-
"name": "param",
|
|
22
|
-
"text": "options - Object containing the value to set"
|
|
23
|
-
}
|
|
24
|
-
],
|
|
25
|
-
"docs": "Update the B (magnetic field magnitude) value",
|
|
26
|
-
"complexTypes": [],
|
|
27
|
-
"slug": "updatebvalue"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"name": "getBValue",
|
|
31
|
-
"signature": "() => Promise<{ value: number; }>",
|
|
32
|
-
"parameters": [],
|
|
33
|
-
"returns": "Promise<{ value: number; }>",
|
|
34
|
-
"tags": [
|
|
35
|
-
{
|
|
36
|
-
"name": "returns",
|
|
37
|
-
"text": "Object containing the B value"
|
|
38
|
-
}
|
|
39
|
-
],
|
|
40
|
-
"docs": "Get the current B value",
|
|
41
|
-
"complexTypes": [],
|
|
42
|
-
"slug": "getbvalue"
|
|
43
|
-
},
|
|
44
8
|
{
|
|
45
9
|
"name": "isSendCalAvailable",
|
|
46
10
|
"signature": "() => Promise<{ available: number; }>",
|
|
@@ -57,50 +21,25 @@
|
|
|
57
21
|
"slug": "issendcalavailable"
|
|
58
22
|
},
|
|
59
23
|
{
|
|
60
|
-
"name": "
|
|
61
|
-
"signature": "(options: {
|
|
62
|
-
"parameters": [
|
|
63
|
-
{
|
|
64
|
-
"name": "options",
|
|
65
|
-
"docs": "- Object containing the filename",
|
|
66
|
-
"type": "{ filename: string; }"
|
|
67
|
-
}
|
|
68
|
-
],
|
|
69
|
-
"returns": "Promise<{ result: number; }>",
|
|
70
|
-
"tags": [
|
|
71
|
-
{
|
|
72
|
-
"name": "param",
|
|
73
|
-
"text": "options - Object containing the filename"
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"name": "returns",
|
|
77
|
-
"text": "Object containing the result code"
|
|
78
|
-
}
|
|
79
|
-
],
|
|
80
|
-
"docs": "Read calibration data from a file",
|
|
81
|
-
"complexTypes": [],
|
|
82
|
-
"slug": "readdatafromfile"
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"name": "setResultFilename",
|
|
86
|
-
"signature": "(options: { filename: string; }) => Promise<void>",
|
|
24
|
+
"name": "rawData",
|
|
25
|
+
"signature": "(options: { data: number[]; }) => Promise<void>",
|
|
87
26
|
"parameters": [
|
|
88
27
|
{
|
|
89
28
|
"name": "options",
|
|
90
|
-
"docs": "- Object containing
|
|
91
|
-
"type": "{
|
|
29
|
+
"docs": "- Object containing an array of 9 int16 values:\n[accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z, mag_x, mag_y, mag_z]\nConversion factors (from imuread.h):\n- Accel: multiply g values by 8192 (G_PER_COUNT = 1/8192)\n- Gyro: multiply deg/s values by 16 (DEG_PER_SEC_PER_COUNT = 1/16)\n- Mag: multiply µT values by 10 (UT_PER_COUNT = 0.1)",
|
|
30
|
+
"type": "{ data: number[]; }"
|
|
92
31
|
}
|
|
93
32
|
],
|
|
94
33
|
"returns": "Promise<void>",
|
|
95
34
|
"tags": [
|
|
96
35
|
{
|
|
97
36
|
"name": "param",
|
|
98
|
-
"text": "options - Object containing
|
|
37
|
+
"text": "options - Object containing an array of 9 int16 values:\n[accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z, mag_x, mag_y, mag_z]\nConversion factors (from imuread.h):\n- Accel: multiply g values by 8192 (G_PER_COUNT = 1/8192)\n- Gyro: multiply deg/s values by 16 (DEG_PER_SEC_PER_COUNT = 1/16)\n- Mag: multiply µT values by 10 (UT_PER_COUNT = 0.1)"
|
|
99
38
|
}
|
|
100
39
|
],
|
|
101
|
-
"docs": "
|
|
40
|
+
"docs": "Pass raw sensor data directly to the calibration engine.\nReplaces the serial port data feed from the upstream MotionCal desktop app.",
|
|
102
41
|
"complexTypes": [],
|
|
103
|
-
"slug": "
|
|
42
|
+
"slug": "rawdata"
|
|
104
43
|
},
|
|
105
44
|
{
|
|
106
45
|
"name": "sendCalibration",
|
|
@@ -1,18 +1,4 @@
|
|
|
1
1
|
export interface MotionCalibrationPlugin {
|
|
2
|
-
/**
|
|
3
|
-
* Update the B (magnetic field magnitude) value
|
|
4
|
-
* @param options - Object containing the value to set
|
|
5
|
-
*/
|
|
6
|
-
updateBValue(options: {
|
|
7
|
-
value: number;
|
|
8
|
-
}): Promise<void>;
|
|
9
|
-
/**
|
|
10
|
-
* Get the current B value
|
|
11
|
-
* @returns Object containing the B value
|
|
12
|
-
*/
|
|
13
|
-
getBValue(): Promise<{
|
|
14
|
-
value: number;
|
|
15
|
-
}>;
|
|
16
2
|
/**
|
|
17
3
|
* Check if send calibration is available
|
|
18
4
|
* @returns Object containing availability status (0 or 1)
|
|
@@ -21,21 +7,17 @@ export interface MotionCalibrationPlugin {
|
|
|
21
7
|
available: number;
|
|
22
8
|
}>;
|
|
23
9
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* @
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* @param options - Object containing the filename
|
|
36
|
-
*/
|
|
37
|
-
setResultFilename(options: {
|
|
38
|
-
filename: string;
|
|
10
|
+
* Pass raw sensor data directly to the calibration engine.
|
|
11
|
+
* Replaces the serial port data feed from the upstream MotionCal desktop app.
|
|
12
|
+
* @param options - Object containing an array of 9 int16 values:
|
|
13
|
+
* [accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z, mag_x, mag_y, mag_z]
|
|
14
|
+
* Conversion factors (from imuread.h):
|
|
15
|
+
* - Accel: multiply g values by 8192 (G_PER_COUNT = 1/8192)
|
|
16
|
+
* - Gyro: multiply deg/s values by 16 (DEG_PER_SEC_PER_COUNT = 1/16)
|
|
17
|
+
* - Mag: multiply µT values by 10 (UT_PER_COUNT = 0.1)
|
|
18
|
+
*/
|
|
19
|
+
rawData(options: {
|
|
20
|
+
data: number[];
|
|
39
21
|
}): Promise<void>;
|
|
40
22
|
/**
|
|
41
23
|
* Send the calibration data
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
2
|
import type { MotionCalibrationPlugin } from './definitions';
|
|
3
3
|
export declare class MotionCalibrationWeb extends WebPlugin implements MotionCalibrationPlugin {
|
|
4
|
-
updateBValue(_options: {
|
|
5
|
-
value: number;
|
|
6
|
-
}): Promise<void>;
|
|
7
|
-
getBValue(): Promise<{
|
|
8
|
-
value: number;
|
|
9
|
-
}>;
|
|
10
4
|
isSendCalAvailable(): Promise<{
|
|
11
5
|
available: number;
|
|
12
6
|
}>;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}): Promise<{
|
|
16
|
-
result: number;
|
|
17
|
-
}>;
|
|
18
|
-
setResultFilename(_options: {
|
|
19
|
-
filename: string;
|
|
7
|
+
rawData(_options: {
|
|
8
|
+
data: number[];
|
|
20
9
|
}): Promise<void>;
|
|
21
10
|
sendCalibration(): Promise<{
|
|
22
11
|
result: number;
|
package/dist/esm/web.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
2
|
export class MotionCalibrationWeb extends WebPlugin {
|
|
3
|
-
async updateBValue(_options) {
|
|
4
|
-
throw this.unimplemented('Not implemented on web.');
|
|
5
|
-
}
|
|
6
|
-
async getBValue() {
|
|
7
|
-
throw this.unimplemented('Not implemented on web.');
|
|
8
|
-
}
|
|
9
3
|
async isSendCalAvailable() {
|
|
10
4
|
throw this.unimplemented('Not implemented on web.');
|
|
11
5
|
}
|
|
12
|
-
async
|
|
13
|
-
throw this.unimplemented('Not implemented on web.');
|
|
14
|
-
}
|
|
15
|
-
async setResultFilename(_options) {
|
|
6
|
+
async rawData(_options) {
|
|
16
7
|
throw this.unimplemented('Not implemented on web.');
|
|
17
8
|
}
|
|
18
9
|
async sendCalibration() {
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjD,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjD,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAA4B;QACxC,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,gCAAgC;QACpC,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,2BAA2B;QAC/B,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,4BAA4B;QAChC,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IACtD,CAAC;CACF"}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -7,19 +7,10 @@ const MotionCalibration = core.registerPlugin('MotionCalibration', {
|
|
|
7
7
|
});
|
|
8
8
|
|
|
9
9
|
class MotionCalibrationWeb extends core.WebPlugin {
|
|
10
|
-
async updateBValue(_options) {
|
|
11
|
-
throw this.unimplemented('Not implemented on web.');
|
|
12
|
-
}
|
|
13
|
-
async getBValue() {
|
|
14
|
-
throw this.unimplemented('Not implemented on web.');
|
|
15
|
-
}
|
|
16
10
|
async isSendCalAvailable() {
|
|
17
11
|
throw this.unimplemented('Not implemented on web.');
|
|
18
12
|
}
|
|
19
|
-
async
|
|
20
|
-
throw this.unimplemented('Not implemented on web.');
|
|
21
|
-
}
|
|
22
|
-
async setResultFilename(_options) {
|
|
13
|
+
async rawData(_options) {
|
|
23
14
|
throw this.unimplemented('Not implemented on web.');
|
|
24
15
|
}
|
|
25
16
|
async sendCalibration() {
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst MotionCalibration = registerPlugin('MotionCalibration', {\n web: () => import('./web').then((m) => new m.MotionCalibrationWeb()),\n});\nexport * from './definitions';\nexport { MotionCalibration };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class MotionCalibrationWeb extends WebPlugin {\n async
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst MotionCalibration = registerPlugin('MotionCalibration', {\n web: () => import('./web').then((m) => new m.MotionCalibrationWeb()),\n});\nexport * from './definitions';\nexport { MotionCalibration };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class MotionCalibrationWeb extends WebPlugin {\n async isSendCalAvailable() {\n throw this.unimplemented('Not implemented on web.');\n }\n async rawData(_options) {\n throw this.unimplemented('Not implemented on web.');\n }\n async sendCalibration() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySurfaceGapError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityMagnitudeVarianceError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityWobbleError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySphericalFitError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async displayCallback() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getCalibrationData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n async resetRawData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getHardIronOffset() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getSoftIronMatrix() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeomagneticFieldMagnitude() {\n throw this.unimplemented('Not implemented on web.');\n }\n async clearDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,iBAAiB,GAAGA,mBAAc,CAAC,mBAAmB,EAAE;AAC9D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;AACxE,CAAC;;ACFM,MAAM,oBAAoB,SAASC,cAAS,CAAC;AACpD,IAAI,MAAM,kBAAkB,GAAG;AAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,OAAO,CAAC,QAAQ,EAAE;AAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,yBAAyB,GAAG;AACtC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,gCAAgC,GAAG;AAC7C,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,qBAAqB,GAAG;AAClC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,2BAA2B,GAAG;AACxC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,kBAAkB,GAAG;AAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,aAAa,GAAG;AAC1B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,YAAY,GAAG;AACzB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,iBAAiB,GAAG;AAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,iBAAiB,GAAG;AAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,4BAA4B,GAAG;AACzC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;AAC3D,IAAI;AACJ;;;;;;;;;"}
|
package/dist/plugin.js
CHANGED
|
@@ -6,19 +6,10 @@ var capacitorMotionCalibration = (function (exports, core) {
|
|
|
6
6
|
});
|
|
7
7
|
|
|
8
8
|
class MotionCalibrationWeb extends core.WebPlugin {
|
|
9
|
-
async updateBValue(_options) {
|
|
10
|
-
throw this.unimplemented('Not implemented on web.');
|
|
11
|
-
}
|
|
12
|
-
async getBValue() {
|
|
13
|
-
throw this.unimplemented('Not implemented on web.');
|
|
14
|
-
}
|
|
15
9
|
async isSendCalAvailable() {
|
|
16
10
|
throw this.unimplemented('Not implemented on web.');
|
|
17
11
|
}
|
|
18
|
-
async
|
|
19
|
-
throw this.unimplemented('Not implemented on web.');
|
|
20
|
-
}
|
|
21
|
-
async setResultFilename(_options) {
|
|
12
|
+
async rawData(_options) {
|
|
22
13
|
throw this.unimplemented('Not implemented on web.');
|
|
23
14
|
}
|
|
24
15
|
async sendCalibration() {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst MotionCalibration = registerPlugin('MotionCalibration', {\n web: () => import('./web').then((m) => new m.MotionCalibrationWeb()),\n});\nexport * from './definitions';\nexport { MotionCalibration };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class MotionCalibrationWeb extends WebPlugin {\n async
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst MotionCalibration = registerPlugin('MotionCalibration', {\n web: () => import('./web').then((m) => new m.MotionCalibrationWeb()),\n});\nexport * from './definitions';\nexport { MotionCalibration };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class MotionCalibrationWeb extends WebPlugin {\n async isSendCalAvailable() {\n throw this.unimplemented('Not implemented on web.');\n }\n async rawData(_options) {\n throw this.unimplemented('Not implemented on web.');\n }\n async sendCalibration() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySurfaceGapError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityMagnitudeVarianceError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualityWobbleError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getQualitySphericalFitError() {\n throw this.unimplemented('Not implemented on web.');\n }\n async displayCallback() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getCalibrationData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n async resetRawData() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getHardIronOffset() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getSoftIronMatrix() {\n throw this.unimplemented('Not implemented on web.');\n }\n async getGeomagneticFieldMagnitude() {\n throw this.unimplemented('Not implemented on web.');\n }\n async clearDrawPoints() {\n throw this.unimplemented('Not implemented on web.');\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,iBAAiB,GAAGA,mBAAc,CAAC,mBAAmB,EAAE;IAC9D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACxE,CAAC;;ICFM,MAAM,oBAAoB,SAASC,cAAS,CAAC;IACpD,IAAI,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,OAAO,CAAC,QAAQ,EAAE;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,yBAAyB,GAAG;IACtC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,gCAAgC,GAAG;IAC7C,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,qBAAqB,GAAG;IAClC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,2BAA2B,GAAG;IACxC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,aAAa,GAAG;IAC1B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,YAAY,GAAG;IACzB,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,4BAA4B,GAAG;IACzC,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC;IAC3D,IAAI;IACJ;;;;;;;;;;;;;;;"}
|