Skip to content

Commit ebf16c1

Browse files
committed
updates to sensors and session events
removed gyroscope sensor, replaced it with magnetic field sensor in order to calculate device orientation. now emitting azimuth, pitch and roll (in radians) events for device orientation. split up the 'x,y,z' from accelerometer event into 3 separate events split up the 'heart-rate;ibi' event into 2 separate events
1 parent 388b64f commit ebf16c1

4 files changed

Lines changed: 130 additions & 77 deletions

File tree

common/src/main/java/com/imsproject/common/gameserver/SessionEvent.kt

Lines changed: 68 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.imsproject.common.utils.toJson
66

77
data class SessionEvent internal constructor (
88
val type: Type,
9-
val subType: SubType,
9+
val subType: Subtype,
1010
val timestamp: Long,
1111
val actor: String,
1212
val data: String? = null
@@ -28,7 +28,7 @@ data class SessionEvent internal constructor (
2828
@SerializedName("meta_data") META_DATA,
2929
}
3030

31-
enum class SubType {
31+
enum class Subtype {
3232
// USER_INPUT
3333
@SerializedName("click") CLICK,
3434
@SerializedName("opponent_click") OPPONENT_CLICK,
@@ -41,10 +41,13 @@ data class SessionEvent internal constructor (
4141

4242
// SENSOR_DATA
4343
@SerializedName("heart_rate") HEART_RATE,
44-
@SerializedName("heart_rate_variability") HEART_RATE_VARIABILITY,
45-
@SerializedName("blood_oxygen") BLOOD_OXYGEN,
46-
@SerializedName("gyroscope") GYROSCOPE,
47-
@SerializedName("accelerometer") ACCELEROMETER,
44+
@SerializedName("inter_beat_interval") INTER_BEAT_INTERVAL,
45+
@SerializedName("orientation_azimuth") ORIENTATION_AZIMUTH,
46+
@SerializedName("orientation_pitch") ORIENTATION_PITCH,
47+
@SerializedName("orientation_roll") ORIENTATION_ROLL,
48+
@SerializedName("accelerometer_x") ACCELEROMETER_X,
49+
@SerializedName("accelerometer_y") ACCELEROMETER_Y,
50+
@SerializedName("accelerometer_z") ACCELEROMETER_Z,
4851

4952
// NETWORK_DATA
5053
@SerializedName("latency") LATENCY,
@@ -98,7 +101,7 @@ data class SessionEvent internal constructor (
98101
.let {
99102
SessionEvent(
100103
Type.entries[it.to],
101-
SubType.entries[it.sto],
104+
Subtype.entries[it.sto],
102105
it.ts,
103106
it.a,
104107
it.d
@@ -110,218 +113,236 @@ data class SessionEvent internal constructor (
110113
fun click(
111114
actor: String,
112115
timestamp: Long
113-
) = SessionEvent(Type.USER_INPUT, SubType.CLICK, timestamp, actor)
116+
) = SessionEvent(Type.USER_INPUT, Subtype.CLICK, timestamp, actor)
114117

115118
fun opponentClick(
116119
actor: String,
117120
timestamp: Long
118-
) = SessionEvent(Type.USER_INPUT, SubType.OPPONENT_CLICK, timestamp, actor)
121+
) = SessionEvent(Type.USER_INPUT, Subtype.OPPONENT_CLICK, timestamp, actor)
119122

120123
fun angle(
121124
actor: String,
122125
timestamp: Long,
123126
data: String
124-
) = SessionEvent(Type.USER_INPUT, SubType.ANGLE, timestamp, actor, data)
127+
) = SessionEvent(Type.USER_INPUT, Subtype.ANGLE, timestamp, actor, data)
125128

126129
fun opponentAngle(
127130
actor: String,
128131
timestamp: Long,
129132
data: String
130-
) = SessionEvent(Type.USER_INPUT, SubType.OPPONENT_ANGLE, timestamp, actor, data)
133+
) = SessionEvent(Type.USER_INPUT, Subtype.OPPONENT_ANGLE, timestamp, actor, data)
131134

132135
fun rotation(
133136
actor: String,
134137
timestamp: Long,
135138
data: String
136-
) = SessionEvent(Type.USER_INPUT, SubType.ROTATION, timestamp, actor, data)
139+
) = SessionEvent(Type.USER_INPUT, Subtype.ROTATION, timestamp, actor, data)
137140

138141
fun opponentRotation(
139142
actor: String,
140143
timestamp: Long,
141144
data: String
142-
) = SessionEvent(Type.USER_INPUT, SubType.OPPONENT_ROTATION, timestamp, actor, data)
145+
) = SessionEvent(Type.USER_INPUT, Subtype.OPPONENT_ROTATION, timestamp, actor, data)
143146

144147
fun frequency(
145148
actor: String,
146149
timestamp: Long,
147150
data: String
148-
) = SessionEvent(Type.USER_INPUT, SubType.FREQUENCY, timestamp, actor, data)
151+
) = SessionEvent(Type.USER_INPUT, Subtype.FREQUENCY, timestamp, actor, data)
149152

150153
fun opponentFrequency(
151154
actor: String,
152155
timestamp: Long,
153156
data: String
154-
) = SessionEvent(Type.USER_INPUT, SubType.OPPONENT_FREQUENCY, timestamp, actor, data)
157+
) = SessionEvent(Type.USER_INPUT, Subtype.OPPONENT_FREQUENCY, timestamp, actor, data)
155158

156159
// ==================== SENSOR_DATA ==================== |
157160

158161
fun heartRate(
159162
actor: String,
160163
timestamp: Long,
161164
data: String
162-
) = SessionEvent(Type.SENSOR_DATA, SubType.HEART_RATE, timestamp, actor, data)
165+
) = SessionEvent(Type.SENSOR_DATA, Subtype.HEART_RATE, timestamp, actor, data)
163166

164-
fun heartRateVariability(
167+
fun interBeatInterval(
165168
actor: String,
166169
timestamp: Long,
167170
data: String
168-
) = SessionEvent(Type.SENSOR_DATA, SubType.HEART_RATE_VARIABILITY, timestamp, actor, data)
171+
) = SessionEvent(Type.SENSOR_DATA, Subtype.INTER_BEAT_INTERVAL, timestamp, actor, data)
169172

170-
fun bloodOxygen(
173+
fun orientationAzimuth(
171174
actor: String,
172175
timestamp: Long,
173176
data: String
174-
) = SessionEvent(Type.SENSOR_DATA, SubType.BLOOD_OXYGEN, timestamp, actor, data)
177+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ORIENTATION_AZIMUTH, timestamp, actor, data)
175178

176-
fun gyroscope(
179+
fun orientationPitch(
177180
actor: String,
178181
timestamp: Long,
179182
data: String
180-
) = SessionEvent(Type.SENSOR_DATA, SubType.GYROSCOPE, timestamp, actor, data)
183+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ORIENTATION_PITCH, timestamp, actor, data)
181184

182-
fun accelerometer(
185+
fun orientationRoll(
183186
actor: String,
184187
timestamp: Long,
185188
data: String
186-
) = SessionEvent(Type.SENSOR_DATA, SubType.ACCELEROMETER, timestamp, actor, data)
189+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ORIENTATION_ROLL , timestamp, actor, data)
190+
191+
fun accelerometerX(
192+
actor: String,
193+
timestamp: Long,
194+
data: String
195+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ACCELEROMETER_X, timestamp, actor, data)
196+
197+
fun accelerometerY(
198+
actor: String,
199+
timestamp: Long,
200+
data: String
201+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ACCELEROMETER_Y, timestamp, actor, data)
202+
203+
fun accelerometerZ(
204+
actor: String,
205+
timestamp: Long,
206+
data: String
207+
) = SessionEvent(Type.SENSOR_DATA, Subtype.ACCELEROMETER_Z, timestamp, actor, data)
187208

188209
// ==================== NETWORK_DATA ==================== |
189210

190211
fun latency(
191212
actor: String,
192213
timestamp: Long,
193214
data: String
194-
) = SessionEvent(Type.NETWORK_DATA, SubType.LATENCY, timestamp, actor, data)
215+
) = SessionEvent(Type.NETWORK_DATA, Subtype.LATENCY, timestamp, actor, data)
195216

196217
fun timedOut(
197218
actor: String,
198219
timestamp: Long,
199220
data: String
200-
) = SessionEvent(Type.NETWORK_DATA, SubType.TIMED_OUT, timestamp, actor, data)
221+
) = SessionEvent(Type.NETWORK_DATA, Subtype.TIMED_OUT, timestamp, actor, data)
201222

202223
fun averageLatency(
203224
actor: String,
204225
timestamp: Long,
205226
data: String
206-
) = SessionEvent(Type.NETWORK_DATA, SubType.AVERAGE_LATENCY, timestamp, actor, data)
227+
) = SessionEvent(Type.NETWORK_DATA, Subtype.AVERAGE_LATENCY, timestamp, actor, data)
207228

208229
fun minLatency(
209230
actor: String,
210231
timestamp: Long,
211232
data: String
212-
) = SessionEvent(Type.NETWORK_DATA, SubType.MIN_LATENCY, timestamp, actor, data)
233+
) = SessionEvent(Type.NETWORK_DATA, Subtype.MIN_LATENCY, timestamp, actor, data)
213234

214235
fun maxLatency(
215236
actor: String,
216237
timestamp: Long,
217238
data: String
218-
) = SessionEvent(Type.NETWORK_DATA, SubType.MAX_LATENCY, timestamp, actor, data)
239+
) = SessionEvent(Type.NETWORK_DATA, Subtype.MAX_LATENCY, timestamp, actor, data)
219240

220241
fun jitter(
221242
actor: String,
222243
timestamp: Long,
223244
data: String
224-
) = SessionEvent(Type.NETWORK_DATA, SubType.JITTER, timestamp, actor, data)
245+
) = SessionEvent(Type.NETWORK_DATA, Subtype.JITTER, timestamp, actor, data)
225246

226247
fun medianLatency(
227248
actor: String,
228249
timestamp: Long,
229250
data: String
230-
) = SessionEvent(Type.NETWORK_DATA, SubType.MEDIAN_LATENCY, timestamp, actor, data)
251+
) = SessionEvent(Type.NETWORK_DATA, Subtype.MEDIAN_LATENCY, timestamp, actor, data)
231252

232253
fun measurementCount(
233254
actor: String,
234255
timestamp: Long,
235256
data: String
236-
) = SessionEvent(Type.NETWORK_DATA, SubType.MEASUREMENT_COUNT, timestamp, actor, data)
257+
) = SessionEvent(Type.NETWORK_DATA, Subtype.MEASUREMENT_COUNT, timestamp, actor, data)
237258

238259
fun timeoutThreshold(
239260
actor: String,
240261
timestamp: Long,
241262
data: String
242-
) = SessionEvent(Type.NETWORK_DATA, SubType.TIMEOUT_THRESHOLD, timestamp, actor, data)
263+
) = SessionEvent(Type.NETWORK_DATA, Subtype.TIMEOUT_THRESHOLD, timestamp, actor, data)
243264

244265
fun timeoutsCount(
245266
actor: String,
246267
timestamp: Long,
247268
data: String
248-
) = SessionEvent(Type.NETWORK_DATA, SubType.TIMEOUTS_COUNT, timestamp, actor, data)
269+
) = SessionEvent(Type.NETWORK_DATA, Subtype.TIMEOUTS_COUNT, timestamp, actor, data)
249270

250271
fun packetOutOfOrder(
251272
actor: String,
252273
timestamp: Long,
253-
) = SessionEvent(Type.NETWORK_DATA, SubType.PACKET_OUT_OF_ORDER, timestamp, actor)
274+
) = SessionEvent(Type.NETWORK_DATA, Subtype.PACKET_OUT_OF_ORDER, timestamp, actor)
254275

255276
fun networkError(
256277
actor: String,
257278
timestamp: Long,
258279
data: String
259-
) = SessionEvent(Type.NETWORK_DATA, SubType.NETWORK_ERROR, timestamp, actor, data)
280+
) = SessionEvent(Type.NETWORK_DATA, Subtype.NETWORK_ERROR, timestamp, actor, data)
260281

261282
fun reconnected(
262283
actor: String,
263284
timestamp: Long
264-
) = SessionEvent(Type.NETWORK_DATA, SubType.RECONNECTED, timestamp, actor)
285+
) = SessionEvent(Type.NETWORK_DATA, Subtype.RECONNECTED, timestamp, actor)
265286

266287
// ==================== SYNC_DATA ==================== |
267288

268289
fun syncStartTime(
269290
actor: String,
270291
timestamp: Long
271-
) = SessionEvent(Type.SYNC_DATA, SubType.SYNC_START_TIME, timestamp, actor)
292+
) = SessionEvent(Type.SYNC_DATA, Subtype.SYNC_START_TIME, timestamp, actor)
272293

273294
fun syncEndTime(
274295
actor: String,
275296
timestamp: Long
276-
) = SessionEvent(Type.SYNC_DATA, SubType.SYNC_END_TIME, timestamp, actor)
297+
) = SessionEvent(Type.SYNC_DATA, Subtype.SYNC_END_TIME, timestamp, actor)
277298

278299
fun syncedAtTime(
279300
actor: String,
280301
timestamp: Long
281-
) = SessionEvent(Type.SYNC_DATA, SubType.SYNCED_AT_TIME, timestamp, actor)
302+
) = SessionEvent(Type.SYNC_DATA, Subtype.SYNCED_AT_TIME, timestamp, actor)
282303

283304
// ==================== META_DATA ==================== |
284305

285306
fun serverStartTime(
286307
actor: String,
287308
timestamp: Long,
288309
data: String
289-
) = SessionEvent(Type.META_DATA, SubType.SERVER_START_TIME, timestamp, actor, data)
310+
) = SessionEvent(Type.META_DATA, Subtype.SERVER_START_TIME, timestamp, actor, data)
290311

291312
fun clientStartTime(
292313
actor: String,
293314
timestamp: Long,
294315
data: String
295-
) = SessionEvent(Type.META_DATA, SubType.CLIENT_START_TIME, timestamp, actor, data)
316+
) = SessionEvent(Type.META_DATA, Subtype.CLIENT_START_TIME, timestamp, actor, data)
296317

297318
fun timeServerDelta(
298319
actor: String,
299320
timestamp: Long,
300321
data: String
301-
) = SessionEvent(Type.META_DATA, SubType.TIME_SERVER_DELTA, timestamp, actor, data)
322+
) = SessionEvent(Type.META_DATA, Subtype.TIME_SERVER_DELTA, timestamp, actor, data)
302323

303324
fun sessionStarted(
304325
actor: String,
305326
timestamp: Long
306-
) = SessionEvent(Type.META_DATA, SubType.SESSION_STARTED, timestamp, actor)
327+
) = SessionEvent(Type.META_DATA, Subtype.SESSION_STARTED, timestamp, actor)
307328

308329
fun sessionEnded(
309330
actor: String,
310331
timestamp: Long,
311332
reason: String
312-
) = SessionEvent(Type.META_DATA, SubType.SESSION_ENDED, timestamp, actor, reason)
333+
) = SessionEvent(Type.META_DATA, Subtype.SESSION_ENDED, timestamp, actor, reason)
313334

314335
fun syncTolerance(
315336
actor: String,
316337
timestamp: Long,
317338
data: String
318-
) = SessionEvent(Type.META_DATA, SubType.SYNC_TOLERANCE, timestamp, actor, data)
339+
) = SessionEvent(Type.META_DATA, Subtype.SYNC_TOLERANCE, timestamp, actor, data)
319340

320341
fun syncWindowLength(
321342
actor: String,
322343
timestamp: Long,
323344
data: String
324-
) = SessionEvent(Type.META_DATA, SubType.SYNC_WINDOW_LENGTH, timestamp, actor, data)
345+
) = SessionEvent(Type.META_DATA, Subtype.SYNC_WINDOW_LENGTH, timestamp, actor, data)
325346

326347
}
327348
}

watch/app/src/main/java/com/imsproject/watch/model/MainModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ class MainModel (private val scope : CoroutineScope) {
291291
Log.d(TAG, "uploadSessionEvents: Success")
292292
eventCollector.clearEvents()
293293
} else {
294-
Log.e(TAG, "uploadSessionEvents: Failed to upload events")
294+
Log.e(TAG, "uploadSessionEvents: Failed to upload events\n${response.message}")
295295
}
296296
return response.success
297297
}

watch/app/src/main/java/com/imsproject/watch/sensors/HeartRateSensorHandler.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,10 @@ class HeartRateSensorHandler() {
4747
tracker.setEventListener(object : HealthTracker.TrackerEventListener {
4848
override fun onDataReceived(dataPoints: List<DataPoint>) = dataPoints.forEach {
4949
val (hr,ibi) = it.toHeartRateData()
50-
gameViewModel.addEvent(
51-
SessionEvent.heartRate(
52-
gameViewModel.playerId,
53-
gameViewModel.getCurrentGameTime(),
54-
"${hr};${ibi}"
55-
)
56-
)
50+
val actor = gameViewModel.playerId
51+
val timestamp = gameViewModel.getCurrentGameTime()
52+
gameViewModel.addEvent(SessionEvent.heartRate(actor, timestamp, hr.toString()))
53+
gameViewModel.addEvent(SessionEvent.interBeatInterval(actor, timestamp, ibi.toString()))
5754
}
5855
override fun onFlushCompleted() = Unit
5956
override fun onError(error: HealthTracker.TrackerError) {
@@ -68,6 +65,6 @@ class HeartRateSensorHandler() {
6865
(getValue(ValueKey.HeartRateSet.IBI_LIST).lastOrNull() ?: 0)
6966

7067
companion object {
71-
private const val TAG = "HeartRateMonitor"
68+
private const val TAG = "HeartRateSensorHandler"
7269
}
7370
}

0 commit comments

Comments
 (0)