Index: gles2/jni-helper.fs ================================================================== --- gles2/jni-helper.fs +++ gles2/jni-helper.fs @@ -14,10 +14,11 @@ \ jni-sfield: INPUT_METHOD_SERVICE INPUT_METHOD_SERVICE Ljava/lang/String; \ jni-sfield: POWER_SERVICE POWER_SERVICE Ljava/lang/String; : INPUT_METHOD_SERVICE js" input_method" ; : POWER_SERVICE js" power" ; : LOCATION_SERVICE js" location" ; +: SENSOR_SERVICE js" sensor" ; jni-method: getSystemService getSystemService (Ljava/lang/String;)Ljava/lang/Object; jni-method: getWindow getWindow ()Landroid/view/Window; jni-class: android/app/Activity Index: gles2/jni-location.fs ================================================================== --- gles2/jni-location.fs +++ gles2/jni-location.fs @@ -20,11 +20,51 @@ jni-method: getAllProviders getAllProviders ()Ljava/util/List; jni-method: getProviders getProviders (Z)Ljava/util/List; jni-method: lm-getProvider getProvider (Ljava/lang/String;)Landroid/location/LocationProvider; jni-method: getLastKnownLocation getLastKnownLocation (Ljava/lang/String;)Landroid/location/Location; +jni-class: android/hardware/Sensor + +-1 Constant TYPE_ALL +$01 Constant TYPE_ACCELEROMETER +$02 Constant TYPE_MAGNETIC_FIELD +$03 Constant TYPE_ORIENTATION \ deprecated API-8 +$04 Constant TYPE_GYROSCOPE +$05 Constant TYPE_LIGHT +$06 Constant TYPE_PRESSURE +$07 Constant TYPE_TEMPERATURE \ deprecated API-14 +$08 Constant TYPE_PROXIMITY +$09 Constant TYPE_GRAVITY +$0A Constant TYPE_LINEAR_ACCELERATION +$0B Constant TYPE_ROTATION_VECTOR +$0C Constant TYPE_RELATIVE_HUMIDITY +$0D Constant TYPE_AMBIENT_TEMPERATURE +$0E Constant TYPE_MAGNETIC_FIELD_UNCALIBRATED +$0F Constant TYPE_GAME_ROTATION_VECTOR +$10 Constant TYPE_GYROSCOPE_UNCALIBRATED +$11 Constant TYPE_SIGNIFICANT_MOTION +$12 Constant TYPE_STEP_DETECTOR +$13 Constant TYPE_STEP_COUNTER +$14 Constant TYPE_GEOMAGNETIC_ROTATION_VECTOR + +jni-method: getName getName ()Ljava/lang/String; +jni-method: getResolution getResolution ()F +jni-method: getType getType ()I +jni-method: getPower getPower ()F +jni-method: toString toString ()Ljava/lang/String; + jni-class: android/hardware/SensorManager + +jni-method: getSensorList getSensorList (I)Ljava/util/List; +jni-method: getDefaultSensor getDefaultSensor (I)Landroid/hardware/Sensor; + +jni-class: android/hardware/SensorEvent + +jni-field: se-accuracy accuracy I +jni-field: se-sensor sensor Landroid/hardware/Sensor; +jni-field: se-timestamp timestamp J +jni-field: se-values values [F jni-class: android/os/Handler jni-method: post post (Ljava/lang/Runnable;)Z @@ -37,20 +77,27 @@ jni-field: stopsensor stopsensor Ljava/lang/Runnable; jni-field: args0 args0 Ljava/lang/String; jni-field: argf0 argf0 D jni-field: argj0 argj0 J jni-field: argsensor argsensor Landroid/hardware/Sensor; +jni-field: locationManager locationManager Landroid/location/LocationManager; +jni-field: sensorManager sensorManager Landroid/hardware/SensorManager; also android : start-gps ( -- ) - clazz >o gforth-handler o> >o - clazz >o startgps o> post o> drop ; + clazz >o startgps gforth-handler >o post o> drop o> ; : stop-gps ( -- ) - clazz >o gforth-handler o> >o - clazz >o stopgps o> post o> drop ; + clazz >o stopgps gforth-handler >o post o> drop o> ; + +: start-sensor ( type -- ) + clazz >o sensorManager >o getDefaultSensor o> to argsensor + startsensor gforth-handler >o post o> drop o> ; + +: stop-sensor ( -- ) + clazz >o stopsensor gforth-handler >o post o> drop o> ; : .deg ( degree -- ) fdup f0< IF ." -" fnegate THEN fdup floor fdup f>s 0 .r '°' xemit f- 60e f* fdup floor fdup f>s 0 .r ''' xemit f- 60e f* @@ -66,7 +113,13 @@ ." Dir: " getBearing f. cr ." Tme: " getTime d. cr ." Acc: " getAccuracy f. cr THEN o> ; + +: .sensor ( -- ) sensor >o + o 0= IF ." unknown" + ELSE se-values + [f@ bounds DO I sf@ f. 1 sfloats +LOOP + THEN cr o> ; previous previous Index: gles2/jni-tools.fs ================================================================== --- gles2/jni-tools.fs +++ gles2/jni-tools.fs @@ -110,10 +110,11 @@ : i@f ( jobject jfid -- n ) fieldenv JNIEnv-GetIntField() ; : j@f ( jobject jfid -- d ) fieldenv JNIEnv-GetLongField() ; : f@f ( jobject jfid -- r ) fieldenv JNIEnv-GetFloatField() ; : d@f ( jobject jfid -- r ) fieldenv JNIEnv-GetDoubleField() ; : l@f ( jobject jfid -- object ) fieldenv JNIEnv-GetObjectField() ; +' l@f alias [@f : z!f ( c jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetBooleanField() ; : b!f ( c jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetByteField() ; : c!f ( utf16 jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetCharField() ; : s!f ( n jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetShortField() ; @@ -120,10 +121,11 @@ : i!f ( n jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetIntField() ; : j!f ( d jobject jfid -- ) 2swap 2>r fieldenv 2r> rot JNIEnv-SetLongField() ; : f!f ( r jobject jfid -- ) fieldenv JNIEnv-SetFloatField() ; : d!f ( r jobject jfid -- ) fieldenv JNIEnv-SetDoubleField() ; : l!f ( object jobject jfid -- ) rot >r fieldenv r> swap JNIEnv-SetObjectField() ; +' l!f alias [!f Create 'field@ '[' 1+ 'A' [DO] "x@f" over [i] swap c! current @ search-wordlist 0= [IF] ' 2drop [THEN] , [LOOP] Create 'field! '[' 1+ 'A' @@ -224,7 +226,33 @@ : jni-sfield: ( "forth-name" "name" "signature" -- ) : ( o:jobject -- retval ) postpone o jni-sfid postpone Literal cstring@1 'sfield@ + @ compile, postpone ; ; + +\ array access: you can access one array at a time + +Variable jnibuffer + +: [len ( array -- n ) env tuck JNIEnv-GetArrayLength() ; + +: >buffer ( size -- buffer ) jnibuffer $!len jnibuffer $@ drop ; +: buffer@ ( -- addr u ) jnibuffer $@ ; + +: [z@ ( array -- addr n ) env swap 0 over [len dup >buffer + env JNIEnv-GetBooleanArrayRegion() buffer@ ; +: [b@ ( array -- addr n ) env swap 0 over [len dup >buffer + env JNIEnv-GetByteArrayRegion() buffer@ ; +: [c@ ( array -- addr n ) env swap 0 over [len dup 2* >buffer + env JNIEnv-GetCharArrayRegion() buffer@ ; +: [s@ ( array -- addr n ) env swap 0 over [len dup 2* >buffer + env JNIEnv-GetShortArrayRegion() buffer@ ; +: [i@ ( array -- addr n ) env swap 0 over [len dup sfloats >buffer + env JNIEnv-GetIntArrayRegion() buffer@ ; +: [j@ ( array -- addr n ) env swap 0 over [len dup dfloats >buffer + env JNIEnv-GetLongArrayRegion() buffer@ ; +: [f@ ( array -- addr n ) env swap 0 over [len dup sfloats >buffer + env JNIEnv-GetFloatArrayRegion() buffer@ ; +: [d@ ( array -- addr n ) env swap 0 over [len dup dfloats >buffer + env JNIEnv-GetDoubleArrayRegion() buffer@ ; previous previous set-current Index: jni-location.fs ================================================================== --- jni-location.fs +++ jni-location.fs @@ -20,11 +20,51 @@ jni-method: getAllProviders getAllProviders ()Ljava/util/List; jni-method: getProviders getProviders (Z)Ljava/util/List; jni-method: lm-getProvider getProvider (Ljava/lang/String;)Landroid/location/LocationProvider; jni-method: getLastKnownLocation getLastKnownLocation (Ljava/lang/String;)Landroid/location/Location; +jni-class: android/hardware/Sensor + +-1 Constant TYPE_ALL +$01 Constant TYPE_ACCELEROMETER +$02 Constant TYPE_MAGNETIC_FIELD +$03 Constant TYPE_ORIENTATION \ deprecated API-8 +$04 Constant TYPE_GYROSCOPE +$05 Constant TYPE_LIGHT +$06 Constant TYPE_PRESSURE +$07 Constant TYPE_TEMPERATURE \ deprecated API-14 +$08 Constant TYPE_PROXIMITY +$09 Constant TYPE_GRAVITY +$0A Constant TYPE_LINEAR_ACCELERATION +$0B Constant TYPE_ROTATION_VECTOR +$0C Constant TYPE_RELATIVE_HUMIDITY +$0D Constant TYPE_AMBIENT_TEMPERATURE +$0E Constant TYPE_MAGNETIC_FIELD_UNCALIBRATED +$0F Constant TYPE_GAME_ROTATION_VECTOR +$10 Constant TYPE_GYROSCOPE_UNCALIBRATED +$11 Constant TYPE_SIGNIFICANT_MOTION +$12 Constant TYPE_STEP_DETECTOR +$13 Constant TYPE_STEP_COUNTER +$14 Constant TYPE_GEOMAGNETIC_ROTATION_VECTOR + +jni-method: getName getName ()Ljava/lang/String; +jni-method: getResolution getResolution ()F +jni-method: getType getType ()I +jni-method: getPower getPower ()F +jni-method: toString toString ()Ljava/lang/String; + jni-class: android/hardware/SensorManager + +jni-method: getSensorList getSensorList (I)Ljava/util/List; +jni-method: getDefaultSensor getDefaultSensor (I)Landroid/hardware/Sensor; + +jni-class: android/hardware/SensorEvent + +jni-field: se-accuracy accuracy I +jni-field: se-sensor sensor Landroid/hardware/Sensor; +jni-field: se-timestamp timestamp J +jni-field: se-values values [F jni-class: android/os/Handler jni-method: post post (Ljava/lang/Runnable;)Z @@ -37,20 +77,27 @@ jni-field: stopsensor stopsensor Ljava/lang/Runnable; jni-field: args0 args0 Ljava/lang/String; jni-field: argf0 argf0 D jni-field: argj0 argj0 J jni-field: argsensor argsensor Landroid/hardware/Sensor; +jni-field: locationManager locationManager Landroid/location/LocationManager; +jni-field: sensorManager sensorManager Landroid/hardware/SensorManager; also android : start-gps ( -- ) - clazz >o gforth-handler o> >o - clazz >o startgps o> post o> drop ; + clazz >o startgps gforth-handler >o post o> drop o> ; : stop-gps ( -- ) - clazz >o gforth-handler o> >o - clazz >o stopgps o> post o> drop ; + clazz >o stopgps gforth-handler >o post o> drop o> ; + +: start-sensor ( type -- ) + clazz >o sensorManager >o getDefaultSensor o> to argsensor + startsensor gforth-handler >o post o> drop o> ; + +: stop-sensor ( -- ) + clazz >o stopsensor gforth-handler >o post o> drop o> ; : .deg ( degree -- ) fdup f0< IF ." -" fnegate THEN fdup floor fdup f>s 0 .r '°' xemit f- 60e f* fdup floor fdup f>s 0 .r ''' xemit f- 60e f* @@ -66,7 +113,13 @@ ." Dir: " getBearing f. cr ." Tme: " getTime d. cr ." Acc: " getAccuracy f. cr THEN o> ; + +: .sensor ( -- ) sensor >o + o 0= IF ." unknown" + ELSE se-values + [f@ bounds DO I sf@ f. 1 sfloats +LOOP + THEN cr o> ; previous previous