From 9af3fcffb4feefa226dd30fdc4b2e6990b695de7 Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Tue, 21 Apr 2026 12:06:05 -0500 Subject: [PATCH 1/6] Create gradle_build.yml --- .github/workflows/gradle_build.yml | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/gradle_build.yml diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml new file mode 100644 index 0000000..6a141d2 --- /dev/null +++ b/.github/workflows/gradle_build.yml @@ -0,0 +1,43 @@ +name: Build APK + +on: + push: + branches: [ master, dev ] + pull_request: + branches: [ master, dev ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Java + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Build APK + run: | + chmod +x ./gradlew + ./gradlew assembleDebug + + - name: Upload APK artifact + uses: actions/upload-artifact@v4 + with: + name: osh-android-latest-APK + path: sensorhub-android-app/build/outputs/apk/debug/sensorhub-android-app-debug.apk + + - name: Create GitHub Release + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v2 + with: + files: app/build/outputs/apk/basic/release/*.apk + generate_release_notes: true \ No newline at end of file From f5fd083b133ce4f8c24fcfd1e38081cb98586c1c Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Thu, 23 Apr 2026 09:37:16 -0500 Subject: [PATCH 2/6] Update gradle_build.yml --- .github/workflows/gradle_build.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index 6a141d2..eccb93b 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -10,16 +10,22 @@ jobs: build: runs-on: ubuntu-latest steps: + - name: Configure SSH for private submodules + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} + - name: Checkout code uses: actions/checkout@v4 with: submodules: recursive + repository: Botts-Innovative-Research/osh-android - name: Setup Java uses: actions/setup-java@v4 with: java-version: '17' - distribution: 'temurin' + distribution: 'zulu' - name: Setup Android SDK uses: android-actions/setup-android@v3 @@ -27,12 +33,12 @@ jobs: - name: Build APK run: | chmod +x ./gradlew - ./gradlew assembleDebug + ./gradlew build -x test -x osgi -x lintDebug - name: Upload APK artifact uses: actions/upload-artifact@v4 with: - name: osh-android-latest-APK + name: osh-android-APK path: sensorhub-android-app/build/outputs/apk/debug/sensorhub-android-app-debug.apk - name: Create GitHub Release From 8708fb4631b4b94895afd96bb97715916b455acd Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Thu, 25 Jun 2026 13:49:59 -0500 Subject: [PATCH 3/6] updated cicd to not build javadoc --- .github/workflows/gradle_build.yml | 2 +- submodules/osh-addons | 2 +- submodules/osh-core | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index eccb93b..d300f3b 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -33,7 +33,7 @@ jobs: - name: Build APK run: | chmod +x ./gradlew - ./gradlew build -x test -x osgi -x lintDebug + ./gradlew build -x test -x osgi -x lintDebug -x javadoc - name: Upload APK artifact uses: actions/upload-artifact@v4 diff --git a/submodules/osh-addons b/submodules/osh-addons index a7bc58a..dfcd8e3 160000 --- a/submodules/osh-addons +++ b/submodules/osh-addons @@ -1 +1 @@ -Subproject commit a7bc58af4afce56385f117597e302ad37220f2ee +Subproject commit dfcd8e3fcf63acfa421ca292b0315a64bca60735 diff --git a/submodules/osh-core b/submodules/osh-core index 81bf0bf..a413b4d 160000 --- a/submodules/osh-core +++ b/submodules/osh-core @@ -1 +1 @@ -Subproject commit 81bf0bfc613a638f3331dace3c5fbb4e36ccef23 +Subproject commit a413b4d19c5ec00d6bdef84305d9dd9992bc1a15 From 8bab098ca15dbc998693be7537394e905d770ed7 Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Thu, 25 Jun 2026 13:58:01 -0500 Subject: [PATCH 4/6] update addons --- submodules/osh-addons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/osh-addons b/submodules/osh-addons index dfcd8e3..a7bc58a 160000 --- a/submodules/osh-addons +++ b/submodules/osh-addons @@ -1 +1 @@ -Subproject commit dfcd8e3fcf63acfa421ca292b0315a64bca60735 +Subproject commit a7bc58af4afce56385f117597e302ad37220f2ee From cf94c0b6ba8985d7577f6cbaac6f6a1ac7a5fda1 Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Thu, 25 Jun 2026 14:02:02 -0500 Subject: [PATCH 5/6] updated cicd --- .github/workflows/gradle_build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/gradle_build.yml b/.github/workflows/gradle_build.yml index d300f3b..9523766 100644 --- a/.github/workflows/gradle_build.yml +++ b/.github/workflows/gradle_build.yml @@ -2,7 +2,7 @@ name: Build APK on: push: - branches: [ master, dev ] + branches: [ master, dev, ci-cd ] pull_request: branches: [ master, dev ] @@ -29,6 +29,8 @@ jobs: - name: Setup Android SDK uses: android-actions/setup-android@v3 + with: + packages: '' - name: Build APK run: | From 007c5b82eef5430a850242be5593d90696c04447 Mon Sep 17 00:00:00 2001 From: kalynstricklin Date: Fri, 26 Jun 2026 11:22:53 -0500 Subject: [PATCH 6/6] Update AndroidOrientationEulerOutput.java --- .../AndroidOrientationEulerOutput.java | 76 +++++++------------ 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidOrientationEulerOutput.java b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidOrientationEulerOutput.java index 9fb868e..45ce2aa 100644 --- a/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidOrientationEulerOutput.java +++ b/sensorhub-driver-android/src/main/java/org/sensorhub/impl/sensor/android/AndroidOrientationEulerOutput.java @@ -43,9 +43,13 @@ public class AndroidOrientationEulerOutput extends AndroidSensorOutput implement // for euler computation Quat4d att = new Quat4d(); Vect3d look = new Vect3d(); + Vect3d up = new Vect3d(); Vect3d euler = new Vect3d(); - - + + private final float[] rotationMatrix = new float[9]; + private final float[] orientationAngles = new float[3]; + + protected AndroidOrientationEulerOutput(AndroidSensorsDriver parentModule, SensorManager aSensorManager, Sensor aSensor) { super(parentModule, aSensorManager, aSensor); @@ -96,50 +100,28 @@ public void onSensorChanged(SensorEvent e) { double sampleTime = getJulianTimeStamp(e.timestamp); - // convert to quaternion + normalize - AndroidOrientationQuatOutput.getQuaternionFromVector(att, e.values); - att.normalize(); - - // Y direction in phone ref frame ( the top of the screen ) - look.x = 0; - look.y = 1; - look.z = 0; - - // rotate to ENU - att.rotate(look, look); - - double heading = 90. - Math.toDegrees(Math.atan2(look.y, look.x)); - if (heading > 180.) - heading -= 360.; - double pitch = 0.0;//Math.toDegrees(Math.atan2(look.y, look.x)) - 90.; - double roll = 0.0; - - /*double sqw = q.w*q.w; - double sqx = q.x*q.x; - double sqy = q.y*q.y; - double sqz = q.z*q.z; - System.out.println(q0); - euler.z = Math.atan2(2.0 * (q.x*q.y + q.z*q.W), sqx - sqy - sqz + sqw); // heading - euler.y = Math.atan2(2.0 * (q.y*q.z + q.x*q.w), -sqx - sqy + sqz + sqw); // pitch - euler.x = Math.asin(-2.0 * (q.x*q.z - q.y*q.w)); // roll - euler.scale(180./Math.PI); - - double oldx = euler.x; // convert to ENU - euler.x = euler.y; - euler.y = oldx; - euler.z = -euler.z;*/ - - // build and populate datablock - DataBlock dataBlock = dataStruct.createDataBlock(); - dataBlock.setDoubleValue(0, sampleTime); - dataBlock.setFloatValue(1, (float)heading); - dataBlock.setFloatValue(2, (float)pitch); - dataBlock.setFloatValue(3, (float)roll); - - // TODO since this sensor is high rate, we could package several records in a single event - // update latest record and send event - latestRecord = dataBlock; - latestRecordTime = System.currentTimeMillis(); - eventHandler.publish(new DataEvent(latestRecordTime, this, dataBlock)); + if (e.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { + SensorManager.getRotationMatrixFromVector(rotationMatrix, e.values); + + SensorManager.getOrientation(rotationMatrix, orientationAngles); + + float azimuth = (float) Math.toDegrees(orientationAngles[0]); + float pitch = (float) Math.toDegrees(orientationAngles[1]); + float roll = (float) Math.toDegrees(orientationAngles[2]); + + + // build and populate datablock + DataBlock dataBlock = dataStruct.createDataBlock(); + dataBlock.setDoubleValue(0, sampleTime); + dataBlock.setFloatValue(1, (float) azimuth); + dataBlock.setFloatValue(2, (float) pitch); + dataBlock.setFloatValue(3, (float) roll); + + // TODO since this sensor is high rate, we could package several records in a single event + // update latest record and send event + latestRecord = dataBlock; + latestRecordTime = System.currentTimeMillis(); + eventHandler.publish(new DataEvent(latestRecordTime, this, dataBlock)); + } } }