-
- private fun extern_input_sensor_accelerometer(event: ASensorAccelerometer) do input(event)
- private fun extern_input_sensor_magnetic_field(event: ASensorMagneticField) do input(event)
- private fun extern_input_sensor_gyroscope(event: ASensorGyroscope) do input(event)
- private fun extern_input_sensor_light(event: ASensorLight) do input(event)
- private fun extern_input_sensor_proximity(event: ASensorProximity) do input(event)
-
- # Sensors support
- # The user decides which sensors he wants to use by setting them enabled
- private fun enable_sensors
- do
- if sensors_support_enabled then enable_sensors_management else return
- if accelerometer.enabled then enable_accelerometer
- if magnetic_field.enabled then enable_magnetic_field
- if gyroscope.enabled then enable_gyroscope
- if light.enabled then enable_light
- if proximity.enabled then enable_proximity
- end
-
- private fun enable_sensors_management
- do
- sensormanager = new ASensorManager.get_instance
- #eventqueue = sensormanager.create_event_queue(new NdkAndroidApp)
- eventqueue = initialize_event_queue(sensormanager)
- end
-
- # HACK: need a nit method to get mnit_java_app, then we can use the appropriate sensormanager.create_event_queue method to initialize the event queue
- private fun initialize_event_queue(sensormanager: ASensorManager): ASensorEventQueue `{
- return ASensorManager_createEventQueue(sensormanager, mnit_java_app->looper, LOOPER_ID_USER, NULL, NULL);
- `}
-
- private fun enable_accelerometer
- do
- accelerometer.asensor = sensormanager.get_default_sensor(new ASensorType.accelerometer)
- if accelerometer.asensor.address_is_null then
- print "Accelerometer sensor unavailable"
- else
- if eventqueue.enable_sensor(accelerometer.asensor) < 0 then print "Accelerometer enabling failed"
- eventqueue.set_event_rate(accelerometer.asensor, accelerometer.event_rate)
- end
- end
-
- private fun enable_magnetic_field
- do
- magnetic_field.asensor = sensormanager.get_default_sensor(new ASensorType.magnetic_field)
- if magnetic_field.asensor.address_is_null then
- print "Magnetic Field unavailable"
- else
- if eventqueue.enable_sensor(magnetic_field.asensor) < 0 then print "Magnetic Field enabling failed"
- eventqueue.set_event_rate(magnetic_field.asensor, magnetic_field.event_rate)
- end
- end
-
- private fun enable_gyroscope
- do
- gyroscope.asensor = sensormanager.get_default_sensor(new ASensorType.gyroscope)
- if gyroscope.asensor.address_is_null then
- print "Gyroscope sensor unavailable"
- else
- if eventqueue.enable_sensor(gyroscope.asensor) < 0 then print "Gyroscope enabling failed"
- eventqueue.set_event_rate(gyroscope.asensor, gyroscope.event_rate)
- end
- end
-
- private fun enable_light
- do
- light.asensor = sensormanager.get_default_sensor(new ASensorType.light)
- if light.asensor.address_is_null then
- print "Light sensor unavailable"
- else
- if eventqueue.enable_sensor(light.asensor) < 0 then print "Light enabling failed"
- eventqueue.set_event_rate(light.asensor, light.event_rate)
- end
- end
-
- private fun enable_proximity
- do
- proximity.asensor = sensormanager.get_default_sensor(new ASensorType.proximity)
- if proximity.asensor.address_is_null then
- print "Proximity sensor unavailable"
- else
- if eventqueue.enable_sensor(proximity.asensor) < 0 then print "Proximity enabling failed"
- eventqueue.set_event_rate(light.asensor, light.event_rate)
- end
- end
-
- redef fun main_loop is extern import full_frame, generate_input, enable_sensors `{
- LOGI("nitni loop");
-
- nit_app = recv;
-
- mnit_java_app->userData = &nit_app;
- mnit_java_app->onAppCmd = mnit_handle_cmd;
- mnit_java_app->onInputEvent = mnit_handle_input;
-
- //Enbales sensors if needed
- App_enable_sensors(nit_app);
-
- while (1) {
- App_generate_input(recv);
-
- if (mnit_java_app->destroyRequested != 0) return;
-
- if (mnit_animating == 1) {
- mnit_frame();
- LOGI("frame at loop end 1");
- }
- }
- /* App_exit(); // this is unreachable anyway*/
- `}
-
- redef fun generate_input import save, pause, resume, gained_focus, lost_focus, init_window, term_window, extern_input_key, extern_input_motion, extern_input_sensor_accelerometer, extern_input_sensor_magnetic_field, extern_input_sensor_gyroscope, extern_input_sensor_light, extern_input_sensor_proximity, eventqueue `{
- int ident;
- int events;
- static int block = 0;
- struct android_poll_source* source;
-
- while ((ident=ALooper_pollAll(0, NULL, &events,
- (void**)&source)) >= 0) { /* first 0 is for non-blocking */
-
- // Process this event.
- if (source != NULL)
- source->process(mnit_java_app, source);
-
- //If a sensor has data, process it
- if(ident == LOOPER_ID_USER) {
- //maybe add a boolean to the app to know if we want to use Sensor API or ASensorEvent directly ...
- ASensorEvent* events = malloc(sizeof(ASensorEvent)*10);
- int nbevents;
- ASensorEventQueue* queue = App_eventqueue(nit_app);
- while((nbevents = ASensorEventQueue_getEvents(queue, events, 10)) > 0) {
- int i;
- for(i = 0; i < nbevents; i++){
- ASensorEvent event = events[i];
- switch (event.type) {
- case ASENSOR_TYPE_ACCELEROMETER:
- App_extern_input_sensor_accelerometer(nit_app, &event);
- break;
- case ASENSOR_TYPE_MAGNETIC_FIELD:
- App_extern_input_sensor_magnetic_field(nit_app, &event);
- break;
- case ASENSOR_TYPE_GYROSCOPE:
- App_extern_input_sensor_gyroscope(nit_app, &event);
- break;
- case ASENSOR_TYPE_LIGHT:
- App_extern_input_sensor_light(nit_app, &event);
- break;
- case ASENSOR_TYPE_PROXIMITY:
- App_extern_input_sensor_proximity(nit_app, &event);
- break;
- }
- }
- }
- }
-
- // Check if we are exiting.
- if (mnit_java_app->destroyRequested != 0) {
- mnit_term_display();
- return;
- }
- }
- `}
-end
-
-redef class Sys
- # Get the running JVM
- redef fun create_default_jvm
- do
- var jvm = ndk_jvm
- var jni_env = jvm.attach_current_thread
- if jni_env.address_is_null then jni_env = jvm.env
-
- self.jvm = jvm
- self.jni_env = jni_env
- end
-
- protected fun ndk_jvm: JavaVM `{ return mnit_java_app->activity->vm; `}