4 * Native method handling for nxt.
9 #include "specialsignatures.h"
10 #include "specialclasses.h"
16 #include "configure.h"
17 #include "interpreter.h"
18 #include "exceptions.h"
19 #include "platform_config.h"
24 #include "nxt_motors.h"
29 #include "flashprog.h"
31 // Declared below to avoid needing STACKWORD everywhere we use display
32 extern STACKWORD display_get_array(void);
34 * NOTE: The technique is not the same as that used in TinyVM.
37 dispatch_native(TWOBYTES signature, STACKWORD * paramBase)
41 monitor_wait((Object *) word2ptr(paramBase[0]), 0);
44 monitor_wait((Object *) word2ptr(paramBase[0]), paramBase[2]);
47 monitor_notify((Object *) word2ptr(paramBase[0]), false);
50 monitor_notify((Object *) word2ptr(paramBase[0]), true);
53 init_thread((Thread *) word2ptr(paramBase[0]));
56 schedule_request(REQUEST_SWITCH_THREAD);
59 sleep_thread(paramBase[1]);
60 schedule_request(REQUEST_SWITCH_THREAD);
62 case getPriority_4_5I:
63 push_word(get_thread_priority((Thread *) word2ptr(paramBase[0])));
65 case setPriority_4I_5V:
67 STACKWORD p = (STACKWORD) paramBase[1];
69 if (p > MAX_PRIORITY || p < MIN_PRIORITY)
70 throw_exception(illegalArgumentException);
72 set_thread_priority((Thread *) word2ptr(paramBase[0]), p);
75 case currentThread_4_5Ljava_3lang_3Thread_2:
76 push_ref(ptr2ref(currentThread));
79 interrupt_thread((Thread *) word2ptr(paramBase[0]));
81 case interrupted_4_5Z:
83 JBYTE i = currentThread->interruptState != INTERRUPT_CLEARED;
85 currentThread->interruptState = INTERRUPT_CLEARED;
89 case isInterrupted_4_5Z:
90 push_word(((Thread *) word2ptr(paramBase[0]))->interruptState
91 != INTERRUPT_CLEARED);
94 ((Thread *) word2ptr(paramBase[0]))->daemon = (JBYTE) paramBase[1];
97 push_word(((Thread *) word2ptr(paramBase[0]))->daemon);
100 join_thread((Thread *) word2ptr(paramBase[0]));
103 join_thread((Thread *) word2obj(paramBase[0]));
106 schedule_request(REQUEST_EXIT);
108 case currentTimeMillis_4_5J:
110 push_word(get_sys_time());
113 set_poller(word2ptr(paramBase[0]));
115 case readSensorValue_4I_5I:
116 push_word(sensor_adc(paramBase[0]));
118 case setADTypeById_4II_5V:
119 if (paramBase[1] & 1)
120 set_digi0(paramBase[0]);
122 unset_digi0(paramBase[0]);
123 if (paramBase[1] & 2)
124 set_digi1(paramBase[0]);
126 unset_digi1(paramBase[0]);
128 case setPowerTypeById_4II_5V:
129 nxt_avr_set_input_power(paramBase[0], paramBase[1]);
131 case freeMemory_4_5J:
133 push_word(getHeapFree());
135 case totalMemory_4_5J:
137 push_word(getHeapSize());
139 case test_4Ljava_3lang_3String_2Z_5V:
141 throw_exception(error);
144 case testEQ_4Ljava_3lang_3String_2II_5V:
145 if (paramBase[1] != paramBase[2]) {
146 throw_exception(error);
149 case floatToIntBits_4F_5I: // Fall through
150 case intBitsToFloat_4I_5F:
151 push_word(paramBase[0]);
153 case drawString_4Ljava_3lang_3String_2II_5V:
155 byte *p = word2ptr(paramBase[0]);
157 Object *charArray = (Object *) word2ptr(get_word(p + HEADER_SIZE, 4));
159 len = charArray->flags.arrays.length;
162 char *chars = ((char *) charArray) + HEADER_SIZE;
164 for (i = 0; i < len; i++)
165 buff[i] = chars[i + i];
167 display_goto_xy(paramBase[1], paramBase[2]);
168 display_string(buff);
172 case drawInt_4III_5V:
173 display_goto_xy(paramBase[1], paramBase[2]);
174 display_int(paramBase[0], 0);
176 case drawInt_4IIII_5V:
177 display_goto_xy(paramBase[2], paramBase[3]);
178 display_int(paramBase[0], paramBase[1]);
186 case setDisplay_4_1I_5V:
188 Object *p = word2ptr(paramBase[0]);
191 len = p->flags.arrays.length;
192 unsigned *intArray = (unsigned *) (((byte *) p) + HEADER_SIZE);
193 unsigned *display_buffer = (unsigned *) display_get_buffer();
195 for (i = 0; i < 200; i++)
196 display_buffer[i] = intArray[i];
199 case getDisplay_4_5_1I:
200 push_word(display_get_array());
202 case setAutoRefresh_4I_5V:
203 display_set_auto_update(paramBase[0]);
205 case getVoltageMilliVolt_4_5I:
206 push_word(battery_voltage());
208 case readButtons_4_5I:
209 push_word(buttons_get());
211 case getTachoCountById_4I_5I:
212 push_word(nxt_motor_get_count(paramBase[0]));
214 case controlMotorById_4III_5V:
215 nxt_motor_set_speed(paramBase[0], paramBase[1], paramBase[2]);
217 case resetTachoCountById_4I_5V:
218 nxt_motor_set_count(paramBase[0], 0);
220 case i2cEnableById_4I_5V:
221 i2c_enable(paramBase[0]);
223 case i2cDisableById_4I_5V:
224 i2c_disable(paramBase[0]);
226 case i2cBusyById_4I_5I:
227 push_word(i2c_busy(paramBase[0]));
229 case i2cStartById_4IIII_1BII_5I:
231 Object *p = word2ptr(paramBase[4]);
232 byte *byteArray = (((byte *) p) + HEADER_SIZE);
233 push_word(i2c_start_transaction(paramBase[0],
242 case playTone_4II_5V:
243 sound_freq(paramBase[0],paramBase[1]);
245 case btSend_4_1BI_5V:
247 Object *p = word2ptr(paramBase[0]);
248 byte *byteArray = (((byte *) p) + HEADER_SIZE);
249 bt_send(byteArray,paramBase[1]);
252 case btReceive_4_1B_5V:
254 Object *p = word2ptr(paramBase[0]);
255 byte *byteArray = (((byte *) p) + HEADER_SIZE);
256 bt_receive(byteArray);
259 case btGetBC4CmdMode_4_5I:
260 push_word(bt_get_mode());
262 case btSetArmCmdMode_4I_5V:
263 if (paramBase[0] == 0) bt_set_arm7_cmd();
264 else bt_clear_arm7_cmd();
266 case btStartADConverter_4_5V:
267 bt_start_ad_converter();
269 case btSetResetLow_4_5V:
272 case btSetResetHigh_4_5V:
275 case btWrite_4_1BII_5I:
277 Object *p = word2ptr(paramBase[0]);
278 byte *byteArray = (((byte *) p) + HEADER_SIZE);
279 push_word(bt_write(byteArray, paramBase[1], paramBase[2]));
282 case btRead_4_1BII_5I:
284 Object *p = word2ptr(paramBase[0]);
285 byte *byteArray = (((byte *) p) + HEADER_SIZE);
286 push_word(bt_read(byteArray, paramBase[1], paramBase[2]));
291 push_word(bt_pending());
294 case usbRead_4_1BI_5I:
296 Object *p = word2ptr(paramBase[0]);
297 byte *byteArray = (((byte *) p) + HEADER_SIZE);
298 push_word(udp_read(byteArray,paramBase[1]));
301 case usbWrite_4_1BI_5V:
303 Object *p = word2ptr(paramBase[0]);
304 byte *byteArray = (((byte *) p) + HEADER_SIZE);
305 udp_write(byteArray,paramBase[1]);
308 case writePage_4_1BI_5V:
310 Object *p = word2ptr(paramBase[0]);
311 unsigned long *intArray = (unsigned long *) (((byte *) p) + HEADER_SIZE);
312 flash_write_page(intArray,paramBase[1]);
315 case readPage_4_1BI_5V:
318 Object *p = word2ptr(paramBase[0]);
319 unsigned long *intArray = (unsigned long *) (((byte *) p) + HEADER_SIZE);
320 for(i=0;i<64;i++) intArray[i] = FLASH_BASE[(paramBase[1]*64)+i];
324 gNextProgram = (unsigned int) &FLASH_BASE[(paramBase[0]*64)];
325 gNextProgramSize = paramBase[1];
326 schedule_request(REQUEST_EXIT);
331 case playSample_4IIII_5V:
332 sound_play_sample((unsigned char *) &FLASH_BASE[(paramBase[0]*64)],paramBase[1],paramBase[2],paramBase[3]);
334 case getDataAddress_4Ljava_3lang_3Object_2_5I:
335 push_word (ptr2word (((byte *) word2ptr (paramBase[0])) + HEADER_SIZE));
341 while (1) nxt_avr_power_down(); // does not return
342 case arraycopy_4Ljava_3lang_3Object_2ILjava_3lang_3Object_2II_5V:
344 Object *p1 = word2ptr(paramBase[0]);
345 Object *p2 = word2ptr(paramBase[2]);
346 arraycopy(p1, paramBase[1], p2, paramBase[3], paramBase[4]);
350 throw_exception(noSuchMethodError);