OSDN Git Service

lejos_NXJ_win32_0_5_0beta.zip
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / nxtvm / platform / nxt / native.c
1
2 /**
3  * native.c
4  * Native method handling for nxt.
5  */
6 #include "types.h"
7 #include "trace.h"
8 #include "constants.h"
9 #include "specialsignatures.h"
10 #include "specialclasses.h"
11 #include "stack.h"
12 #include "memory.h"
13 #include "threads.h"
14 #include "classes.h"
15 #include "language.h"
16 #include "configure.h"
17 #include "interpreter.h"
18 #include "exceptions.h"
19 #include "platform_config.h"
20 #include "sensors.h"
21 #include "poll.h"
22 #include "display.h"
23 #include "nxt_avr.h"
24 #include "nxt_motors.h"
25 #include "i2c.h"
26 #include "sound.h"
27 #include "bt.h"
28 #include "udp.h"
29 #include "flashprog.h"
30 int pos = 0;
31 // Declared below to avoid needing STACKWORD everywhere we use display
32 extern STACKWORD display_get_array(void);
33 /**
34  * NOTE: The technique is not the same as that used in TinyVM.
35  */
36 void
37 dispatch_native(TWOBYTES signature, STACKWORD * paramBase)
38 {
39   switch (signature) {
40   case wait_4_5V:
41     monitor_wait((Object *) word2ptr(paramBase[0]), 0);
42     return;
43   case wait_4J_5V:
44     monitor_wait((Object *) word2ptr(paramBase[0]), paramBase[2]);
45     return;
46   case notify_4_5V:
47     monitor_notify((Object *) word2ptr(paramBase[0]), false);
48     return;
49   case notifyAll_4_5V:
50     monitor_notify((Object *) word2ptr(paramBase[0]), true);
51     return;
52   case start_4_5V:
53     init_thread((Thread *) word2ptr(paramBase[0]));
54     return;
55   case yield_4_5V:
56     schedule_request(REQUEST_SWITCH_THREAD);
57     return;
58   case sleep_4J_5V:
59     sleep_thread(paramBase[1]);
60     schedule_request(REQUEST_SWITCH_THREAD);
61     return;
62   case getPriority_4_5I:
63     push_word(get_thread_priority((Thread *) word2ptr(paramBase[0])));
64     return;
65   case setPriority_4I_5V:
66     {
67       STACKWORD p = (STACKWORD) paramBase[1];
68
69       if (p > MAX_PRIORITY || p < MIN_PRIORITY)
70         throw_exception(illegalArgumentException);
71       else
72         set_thread_priority((Thread *) word2ptr(paramBase[0]), p);
73     }
74     return;
75   case currentThread_4_5Ljava_3lang_3Thread_2:
76     push_ref(ptr2ref(currentThread));
77     return;
78   case interrupt_4_5V:
79     interrupt_thread((Thread *) word2ptr(paramBase[0]));
80     return;
81   case interrupted_4_5Z:
82     {
83       JBYTE i = currentThread->interruptState != INTERRUPT_CLEARED;
84
85       currentThread->interruptState = INTERRUPT_CLEARED;
86       push_word(i);
87     }
88     return;
89   case isInterrupted_4_5Z:
90     push_word(((Thread *) word2ptr(paramBase[0]))->interruptState
91               != INTERRUPT_CLEARED);
92     return;
93   case setDaemon_4Z_5V:
94     ((Thread *) word2ptr(paramBase[0]))->daemon = (JBYTE) paramBase[1];
95     return;
96   case isDaemon_4_5Z:
97     push_word(((Thread *) word2ptr(paramBase[0]))->daemon);
98     return;
99   case join_4_5V:
100     join_thread((Thread *) word2ptr(paramBase[0]));
101     return;
102   case join_4J_5V:
103     join_thread((Thread *) word2obj(paramBase[0]));
104     return;
105   case exit_4I_5V:
106     schedule_request(REQUEST_EXIT);
107     return;
108   case currentTimeMillis_4_5J:
109     push_word(0);
110     push_word(get_sys_time());
111     return;
112   case setPoller_4_5V:
113     set_poller(word2ptr(paramBase[0]));
114     return;
115   case readSensorValue_4I_5I:
116     push_word(sensor_adc(paramBase[0]));
117     return;
118   case setADTypeById_4II_5V:
119     if (paramBase[1] & 1)
120       set_digi0(paramBase[0]);
121     else
122       unset_digi0(paramBase[0]);
123     if (paramBase[1] & 2)
124       set_digi1(paramBase[0]);
125     else
126       unset_digi1(paramBase[0]);
127     return;
128   case setPowerTypeById_4II_5V:
129     nxt_avr_set_input_power(paramBase[0], paramBase[1]);
130     return;
131   case freeMemory_4_5J:
132     push_word(0);
133     push_word(getHeapFree());
134     return;
135   case totalMemory_4_5J:
136     push_word(0);
137     push_word(getHeapSize());
138     return;
139   case test_4Ljava_3lang_3String_2Z_5V:
140     if (!paramBase[1]) {
141       throw_exception(error);
142     }
143     return;
144   case testEQ_4Ljava_3lang_3String_2II_5V:
145     if (paramBase[1] != paramBase[2]) {
146       throw_exception(error);
147     }
148     return;
149   case floatToIntBits_4F_5I:    // Fall through
150   case intBitsToFloat_4I_5F:
151     push_word(paramBase[0]);
152     return;
153   case drawString_4Ljava_3lang_3String_2II_5V:
154     {
155       byte *p = word2ptr(paramBase[0]);
156       int len, i;
157       Object *charArray = (Object *) word2ptr(get_word(p + HEADER_SIZE, 4));
158
159       len = charArray->flags.arrays.length;
160       {
161         char buff[len + 1];
162         char *chars = ((char *) charArray) + HEADER_SIZE;
163
164         for (i = 0; i < len; i++)
165           buff[i] = chars[i + i];
166         buff[len] = 0;
167         display_goto_xy(paramBase[1], paramBase[2]);
168         display_string(buff);
169       }
170     }
171     return;
172   case drawInt_4III_5V:
173     display_goto_xy(paramBase[1], paramBase[2]);
174     display_int(paramBase[0], 0);
175     return;
176   case drawInt_4IIII_5V:
177      display_goto_xy(paramBase[2], paramBase[3]);
178      display_int(paramBase[0], paramBase[1]);
179     return;   
180   case refresh_4_5V:
181     display_update();
182     return;
183   case clear_4_5V:
184     display_clear(0);
185     return;
186   case setDisplay_4_1I_5V:
187     {
188       Object *p = word2ptr(paramBase[0]);
189       int len, i;
190
191       len = p->flags.arrays.length;
192       unsigned *intArray = (unsigned *) (((byte *) p) + HEADER_SIZE);
193       unsigned *display_buffer = (unsigned *) display_get_buffer();
194
195       for (i = 0; i < 200; i++)
196         display_buffer[i] = intArray[i];
197     }
198     return;
199   case getDisplay_4_5_1I:
200     push_word(display_get_array());
201     return;
202   case setAutoRefresh_4I_5V:
203     display_set_auto_update(paramBase[0]);
204     return;
205   case getVoltageMilliVolt_4_5I:
206     push_word(battery_voltage());
207     return;
208   case readButtons_4_5I:
209     push_word(buttons_get());
210     return;
211   case getTachoCountById_4I_5I:
212     push_word(nxt_motor_get_count(paramBase[0]));
213     return;
214   case controlMotorById_4III_5V:
215     nxt_motor_set_speed(paramBase[0], paramBase[1], paramBase[2]); 
216     return;
217   case resetTachoCountById_4I_5V:
218     nxt_motor_set_count(paramBase[0], 0);
219     return;
220   case i2cEnableById_4I_5V:
221     i2c_enable(paramBase[0]);
222     return;
223   case i2cDisableById_4I_5V:
224     i2c_disable(paramBase[0]);
225     return;
226   case i2cBusyById_4I_5I:
227     push_word(i2c_busy(paramBase[0]));
228     return;
229   case i2cStartById_4IIII_1BII_5I:
230     {
231         Object *p = word2ptr(paramBase[4]);
232         byte *byteArray = (((byte *) p) + HEADER_SIZE);
233         push_word(i2c_start_transaction(paramBase[0],
234                                         paramBase[1],
235                                         paramBase[2],
236                                         paramBase[3],
237                                         byteArray,
238                                         paramBase[5],
239                                         paramBase[6]));                      
240     }
241     return; 
242   case playTone_4II_5V:
243     sound_freq(paramBase[0],paramBase[1]);
244     return;
245   case btSend_4_1BI_5V:
246     {
247       Object *p = word2ptr(paramBase[0]);
248       byte *byteArray = (((byte *) p) + HEADER_SIZE);
249       bt_send(byteArray,paramBase[1]);                      
250     }
251     return;
252   case btReceive_4_1B_5V:
253     {
254       Object *p = word2ptr(paramBase[0]);
255       byte *byteArray = (((byte *) p) + HEADER_SIZE);
256       bt_receive(byteArray);                      
257     }
258     return;
259   case btGetBC4CmdMode_4_5I:
260     push_word(bt_get_mode());
261     return;
262   case btSetArmCmdMode_4I_5V:
263     if (paramBase[0] == 0) bt_set_arm7_cmd();
264     else bt_clear_arm7_cmd(); 
265     return;
266   case btStartADConverter_4_5V:
267     bt_start_ad_converter();
268     return;
269   case btSetResetLow_4_5V:
270     bt_set_reset_low();
271     return;
272   case btSetResetHigh_4_5V:
273     bt_set_reset_high();
274     return;
275   case btWrite_4_1BII_5I:
276     {
277       Object *p = word2ptr(paramBase[0]);
278       byte *byteArray = (((byte *) p) + HEADER_SIZE);
279       push_word(bt_write(byteArray, paramBase[1], paramBase[2]));                      
280     }
281     return;
282   case btRead_4_1BII_5I:
283     {
284       Object *p = word2ptr(paramBase[0]);
285       byte *byteArray = (((byte *) p) + HEADER_SIZE);
286       push_word(bt_read(byteArray, paramBase[1], paramBase[2]));                      
287     }
288     return;
289   case btPending_4_5I:
290     {
291       push_word(bt_pending());
292     }
293     return;
294   case usbRead_4_1BI_5I:
295      {
296       Object *p = word2ptr(paramBase[0]);
297       byte *byteArray = (((byte *) p) + HEADER_SIZE);
298       push_word(udp_read(byteArray,paramBase[1]));                      
299     } 
300     return;
301   case usbWrite_4_1BI_5V:
302      {
303       Object *p = word2ptr(paramBase[0]);
304       byte *byteArray = (((byte *) p) + HEADER_SIZE);
305       udp_write(byteArray,paramBase[1]);                      
306     }
307     return; 
308   case writePage_4_1BI_5V:
309     {
310       Object *p = word2ptr(paramBase[0]);
311       unsigned long *intArray = (unsigned long *) (((byte *) p) + HEADER_SIZE);
312       flash_write_page(intArray,paramBase[1]);                      
313     }
314     return;
315   case readPage_4_1BI_5V:
316     {
317       int i;
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];                       
321     }
322     return;
323   case exec_4II_5V:
324     gNextProgram = (unsigned int) &FLASH_BASE[(paramBase[0]*64)];
325     gNextProgramSize = paramBase[1];
326     schedule_request(REQUEST_EXIT);
327     return;
328   case usbReset_4_5V:
329     udp_reset();
330     return; 
331   case playSample_4IIII_5V:
332     sound_play_sample((unsigned char *) &FLASH_BASE[(paramBase[0]*64)],paramBase[1],paramBase[2],paramBase[3]);
333     return;
334   case getDataAddress_4Ljava_3lang_3Object_2_5I:
335     push_word (ptr2word (((byte *) word2ptr (paramBase[0])) + HEADER_SIZE));
336     return;
337   case gc_4_5V:
338     garbage_collect();
339     return;
340   case shutDown_4_5V:
341     while (1) nxt_avr_power_down(); // does not return
342   case arraycopy_4Ljava_3lang_3Object_2ILjava_3lang_3Object_2II_5V:
343     {
344       Object *p1 = word2ptr(paramBase[0]);
345       Object *p2 = word2ptr(paramBase[2]);
346       arraycopy(p1, paramBase[1], p2, paramBase[3], paramBase[4]);
347     }
348     return;
349   default:
350     throw_exception(noSuchMethodError);
351   }
352 }