static void onNewRawGyroData(msgPump_MsgID_t id, const void *buffer) { if ((MSG_ID_GYRO_RAW_DATA == id) && (NULL != buffer)) { /* do post processing */ const l3gd20_gyroDataRaw_t *data = (const l3gd20_gyroDataRaw_t*) buffer; imuData_t processed; processed.timestampUS = getSystemTimeUS(); processed.v[0] = ((float)(*data)[0]) * L3GD20_SCALE; processed.v[1] = ((float)(*data)[1]) * L3GD20_SCALE; processed.v[2] = ((float)(*data)[2]) * L3GD20_SCALE; msgPump_postMessage(MSG_ID_GYRO_SCALED_DATA, &processed); } }
static void sineSurf_renderingFunction(cubeFrameBuf *buf) { static systemTime_t lastUpdateTime = 0U; systemTime_t curtime = getSystemTimeUS(); if (0 == lastUpdateTime) { lastUpdateTime = curtime; } if (lastUpdateTime + SINE_SURF_UPDATE_INTERVAL_US < curtime) { lastUpdateTime = getCurrentTime(); g_phase += 2.f * M_PI / (SINE_SURF_ROUND_TIME_US / SINE_SURF_UPDATE_INTERVAL_US); sineSurf_draw(buf); } }
static void explosion_renderingFunction(cubeFrameBuf *buf) { static systemTime_t lastTickTime = 0U; static bool isExploded = false; if (0U == lastTickTime) { lastTickTime = getSystemTimeUS(); } systemTime_t curTime = getSystemTimeUS(); if (lastTickTime + EXPLOSION_UPDATE_INTERVAL_US < curTime) { lastTickTime = getSystemTimeUS(); if (false == isExploded) { memset(buf, 0, sizeof(*buf)); (*buf)[z][y][x] = 1; ++z; if (z >= trigger_height) { (*buf)[z][y][x] = EXPLOSION_LAST_INTERVAL; isExploded = true; x = 0U; } } else { uint8_t i, j, k; bool needNoReset = false; for (i = 0U; i < CUBE_CONFIG_NUMBER_OF_LAYERS; ++i) { for (j = 0U; j < CUBE_CONFIG_NUMBER_OF_COLS; ++j) { for (k = 0U; k < CUBE_CONFIG_NUMBER_OF_ROWS; ++k) { /* spawn if there is a neighbor alive */ if ((0 == (*buf)[i][j][k]) && (((i > 0) && (EXPLOSION_LAST_INTERVAL == (*buf)[i - 1][j][k])) || ((i < 7) && (EXPLOSION_LAST_INTERVAL == (*buf)[i + 1][j][k])) || ((j > 0) && (EXPLOSION_LAST_INTERVAL == (*buf)[i][j - 1][k])) || ((j < 7) && (EXPLOSION_LAST_INTERVAL == (*buf)[i][j + 1][k])) || ((k > 0) && (EXPLOSION_LAST_INTERVAL == (*buf)[i][j][k - 1])) || ((k < 7) && (EXPLOSION_LAST_INTERVAL == (*buf)[i][j][k + 1])))) { (*buf)[i][j][k] = EXPLOSION_LAST_INTERVAL + 1; } else { /* and die */ if (0 < (*buf)[i][j][k]) { --(*buf)[i][j][k]; if (0 == (*buf)[i][j][k]) { (*buf)[i][j][k] = -1; } } } if (0 < (*buf)[i][j][k]) { needNoReset |= true; } } } } if (false == needNoReset) /* we need a reset */ { isExploded = false; x = getRandomNumber() % CUBE_CONFIG_NUMBER_OF_COLS; y = getRandomNumber() % CUBE_CONFIG_NUMBER_OF_ROWS; trigger_height = getRandomNumber() % CUBE_CONFIG_NUMBER_OF_LAYERS; x = CLIP_VAL(x, EXPLOSION_LAST_INTERVAL, CUBE_CONFIG_NUMBER_OF_COLS - EXPLOSION_LAST_INTERVAL); y = CLIP_VAL(y, EXPLOSION_LAST_INTERVAL, CUBE_CONFIG_NUMBER_OF_ROWS - EXPLOSION_LAST_INTERVAL); trigger_height = CLIP_VAL(trigger_height, EXPLOSION_LAST_INTERVAL, CUBE_CONFIG_NUMBER_OF_LAYERS - EXPLOSION_LAST_INTERVAL); z = 0; } } } }
static void rain_renderingFunction(cubeFrameBuf *buf) { uint32_t randomNr = getRandomNumber(); uint8_t x, y; uint8_t choice = randomNr % MAX_NUM_DROPLETS; static systemTime_t lastUpdateTime = 0U; static systemTime_t lastSpawnTime = 0U; systemTime_t curTime = getSystemTimeUS(); memset(buf, 0, sizeof(*buf)); if (0 == lastUpdateTime) { lastUpdateTime = getSystemTimeUS(); lastSpawnTime = lastUpdateTime; } if (lastUpdateTime + DROPLET_FALL_INTERVALL_US < curTime) { lastUpdateTime = curTime; /* let the rain fall! */ for (x = 0U; x < MAX_NUM_DROPLETS; ++x) { if (0xff != g_dropletPositions[x]) { g_dropletPositions[x] -= 1; } } } if (lastSpawnTime + DROPLET_SPAWN_INTERVAL_US < curTime) { lastSpawnTime = curTime; if (0xff == g_dropletPositions[choice]) /* this one can be spawned */ { g_dropletPositions[choice] = CUBE_CONFIG_NUMBER_OF_LAYERS - 1; } } for (x = 0U; x < CUBE_CONFIG_NUMBER_OF_COLS; ++x) { for (y = 0U; y < CUBE_CONFIG_NUMBER_OF_ROWS; ++y) { const uint8_t dropletNr = x * CUBE_CONFIG_NUMBER_OF_ROWS + y; if (0xff != g_dropletPositions[dropletNr]) { uint8_t j; for (j = 0U; j < DROPLET_HEIGHT; ++j) { if (g_dropletPositions[dropletNr] + j < CUBE_CONFIG_NUMBER_OF_LAYERS) { (*buf)[g_dropletPositions[dropletNr] + j][x][y] = 1; } } } } } }