Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,7 @@ captures/

# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches
.idea/

# Keystore files
# Uncomment the following line if you do not want to check your keystore files in.
Expand Down
6 changes: 6 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions .idea/jarRepositories.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 10 additions & 3 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 0 additions & 9 deletions .idea/modules.xml

This file was deleted.

12 changes: 0 additions & 12 deletions .idea/runConfigurations.xml

This file was deleted.

29 changes: 13 additions & 16 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

android {
compileSdkVersion 28
compileSdkVersion 30

defaultConfig {
applicationId "com.backyardbrains"
minSdkVersion 19
targetSdkVersion 28
versionCode 89
versionName '1.8.3.1'
targetSdkVersion 30
versionCode 90
versionName '1.8.3.5'

externalNativeBuild {
cmake {
Expand Down Expand Up @@ -45,7 +46,7 @@ android {
debug {
debuggable true
minifyEnabled false
ext.enableCrashlytics = false
// ext.enableCrashlytics = false
}
}

Expand Down Expand Up @@ -111,6 +112,11 @@ dependencies {
implementation "androidx.room:room-runtime:$roomVersion"
annotationProcessor "androidx.room:room-compiler:$roomVersion"

implementation platform('com.google.firebase:firebase-bom:28.0.0')
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-core'

// material design
implementation "com.google.android.material:material:$materialDesignVersion"

Expand Down Expand Up @@ -147,15 +153,6 @@ dependencies {

// signal filtering
implementation "org.apache.commons:commons-math3:$commonsMathVersion"

// firebase & crashlytics
implementation "com.google.firebase:firebase-core:$firebaseVersion"
implementation("com.crashlytics.sdk.android:crashlytics:$crashlyticsVersion") {
transitive = true
}

// benchmark
implementation "com.github.T-Spoon:Benchit:$benchitVersion"
}

apply plugin: 'com.google.gms.google-services'
}
25 changes: 21 additions & 4 deletions app/src/main/cpp/byb/SampleStreamProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,13 @@ namespace backyardbrains {
msb = msb & REMOVER;
msb = msb << 7u;
lsb = lsb & REMOVER;
sample = (short) (((msb | lsb) - 512) * 30);
sample = (short) (((msb | lsb)
-
backyardbrains::utils::SampleStreamUtils::getResolution(
hardwareType))
*
backyardbrains::utils::SampleStreamUtils::getResolutionMultiplier(
hardwareType));

// calculate average sample
average = 0.0001 * sample + 0.9999 * average;
Expand Down Expand Up @@ -196,10 +202,19 @@ namespace backyardbrains {
// inDataPrevLength = length;

bool avoidFilteringOfChannels = stopFilteringAfterChannelIndex >= 0;

for (int i = 0; i < channelCount; i++) {
// apply additional filtering if necessary
if (avoidFilteringOfChannels && i <= stopFilteringAfterChannelIndex)
//TODO: Check is stopFilteringAfterChannelIndex variable properly updated after insert extension board
if (avoidFilteringOfChannels && i <= stopFilteringAfterChannelIndex) {

applyFilters(i, channels[i], sampleCounters[i]);
}
else if (!avoidFilteringOfChannels)
{
applyFilters(i, channels[i], sampleCounters[i]);

}
outSamples[i] = new short[sampleCounters[i]];
std::copy(channels[i], channels[i] + sampleCounters[i], outSamples[i]);
outSampleCounts[i] = sampleCounters[i];
Expand All @@ -217,8 +232,8 @@ namespace backyardbrains {
__android_log_print(ANDROID_LOG_DEBUG, TAG, "ESCAPE SEQUENCE MESSAGE %s AT %d", message.c_str(),
sampleIndex);
if (backyardbrains::utils::SampleStreamUtils::isHardwareTypeMsg(message)) {
listener->onSpikerBoxHardwareTypeDetected(
backyardbrains::utils::SampleStreamUtils::getHardwareType(message));
hardwareType = backyardbrains::utils::SampleStreamUtils::getHardwareType(message);
listener->onSpikerBoxHardwareTypeDetected(hardwareType);
} else if (backyardbrains::utils::SampleStreamUtils::isSampleRateAndNumOfChannelsMsg(message)) {
const int sampleRate = backyardbrains::utils::SampleStreamUtils::getMaxSampleRate(message);
const int channelCount = backyardbrains::utils::SampleStreamUtils::getChannelCount(message);
Expand All @@ -235,6 +250,8 @@ namespace backyardbrains {
}

void SampleStreamProcessor::updateProcessingParameters(int expansionBoardType) {
__android_log_print(ANDROID_LOG_DEBUG, typeid(*this).name(),"expansionBoardType %d", expansionBoardType);

switch (expansionBoardType) {
default:
case backyardbrains::utils::SampleStreamUtils::NONE_BOARD_DETACHED:
Expand Down
42 changes: 34 additions & 8 deletions app/src/main/cpp/byb/SampleStreamUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ namespace backyardbrains {
namespace utils {

const std::string SampleStreamUtils::HARDWARE_TYPE_PREFIX = "HWT:";
const std::string SampleStreamUtils::HARDWARE_TYPE_PLANT = SampleStreamUtils::HARDWARE_TYPE_PREFIX + "PLANTSS;";
const std::string SampleStreamUtils::HARDWARE_TYPE_PLANT =
SampleStreamUtils::HARDWARE_TYPE_PREFIX + "PLANTSS;";
const std::string SampleStreamUtils::HARDWARE_TYPE_MUSCLE =
SampleStreamUtils::HARDWARE_TYPE_PREFIX + "MUSCLESS;";
const std::string SampleStreamUtils::HARDWARE_TYPE_HEART_AND_BRAIN_6CH =
Expand All @@ -20,6 +21,8 @@ namespace backyardbrains {
SampleStreamUtils::HARDWARE_TYPE_PREFIX + "NEURONSB;";
const std::string SampleStreamUtils::HARDWARE_TYPE_MUSCLE_PRO =
SampleStreamUtils::HARDWARE_TYPE_PREFIX + "MUSCLESB;";
const std::string SampleStreamUtils::HARDWARE_TYPE_HUMANS =
SampleStreamUtils::HARDWARE_TYPE_PREFIX + "HUMANSB;";
const std::string SampleStreamUtils::SAMPLE_RATE_PREFIX = "MSF:";
const std::string SampleStreamUtils::NUM_OF_CHANNELS_PREFIX = "MNC:";
const std::string SampleStreamUtils::EVENT_PREFIX = "EVNT:";
Expand All @@ -30,12 +33,20 @@ namespace backyardbrains {
}

int SampleStreamUtils::getHardwareType(std::string message) {
if (std::strcmp(HARDWARE_TYPE_PLANT.c_str(), message.c_str()) == 0) return PLANT_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_MUSCLE.c_str(), message.c_str()) == 0) return MUSCLE_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_HEART_AND_BRAIN_6CH.c_str(), message.c_str()) == 0) return HEART_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_HEART_AND_BRAIN.c_str(), message.c_str()) == 0) return HEART_HARDWARE;
if (message.find(HARDWARE_TYPE_NEURON_PRO) != std::string::npos) return NEURON_PRO_HARDWARE;
if (message.find(HARDWARE_TYPE_MUSCLE_PRO) != std::string::npos) return MUSCLE_PRO_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_PLANT.c_str(), message.c_str()) == 0)
return PLANT_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_MUSCLE.c_str(), message.c_str()) == 0)
return MUSCLE_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_HEART_AND_BRAIN_6CH.c_str(), message.c_str()) == 0)
return HEART_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_HEART_AND_BRAIN.c_str(), message.c_str()) == 0)
return HEART_HARDWARE;
if (std::strcmp(HARDWARE_TYPE_HUMANS.c_str(), message.c_str()) == 0)
return HUMANS_HARDWARE;
if (message.find(HARDWARE_TYPE_NEURON_PRO) != std::string::npos)
return NEURON_PRO_HARDWARE;
if (message.find(HARDWARE_TYPE_MUSCLE_PRO) != std::string::npos)
return MUSCLE_PRO_HARDWARE;
return UNKNOWN_HARDWARE;
}

Expand Down Expand Up @@ -72,7 +83,8 @@ namespace backyardbrains {
}

bool SampleStreamUtils::isExpansionBoardTypeMsg(std::string message) {
return message.compare(0, EXPANSION_BOARD_TYPE_PREFIX.length(), EXPANSION_BOARD_TYPE_PREFIX) == 0;
return message.compare(0, EXPANSION_BOARD_TYPE_PREFIX.length(),
EXPANSION_BOARD_TYPE_PREFIX) == 0;
}

int SampleStreamUtils::getExpansionBoardType(std::string message) {
Expand All @@ -82,5 +94,19 @@ namespace backyardbrains {
message = message.replace(found, message.length() - found, "");
return std::stoi(message);
}

int SampleStreamUtils::getResolution(int hardwareType) {
if (hardwareType == HUMANS_HARDWARE) {
return 8192; //(2^14)/2
}
return 512; //(2^10)/2
}

int SampleStreamUtils::getResolutionMultiplier(int hardwareType) {
if (hardwareType == HUMANS_HARDWARE) {
return 1;
}
return 30;
}
}
}
2 changes: 2 additions & 0 deletions app/src/main/cpp/byb/includes/SampleStreamProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ namespace backyardbrains {
byte msb;
// Average signal which we use to avoid signal offset
double average;

int hardwareType = -1;
};
}
}
Expand Down
10 changes: 9 additions & 1 deletion app/src/main/cpp/byb/includes/SampleStreamUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ namespace backyardbrains {
*/
static int getExpansionBoardType(std::string message);

static int getResolution(int hardwareType);

static int getResolutionMultiplier(int hardwareType);

private:
// Hardware type SpikerBox reply message prefix.
static const std::string HARDWARE_TYPE_PREFIX;
Expand All @@ -102,6 +106,8 @@ namespace backyardbrains {
static const std::string HARDWARE_TYPE_NEURON_PRO;
// Muscle PRO SpikerBox reply message for hardware type inquiry.
static const std::string HARDWARE_TYPE_MUSCLE_PRO;
// Humans SpikerBox reply message for hardware type inquiry.
static const std::string HARDWARE_TYPE_HUMANS;
// Sample rate SpikerBox reply message prefix
static const std::string SAMPLE_RATE_PREFIX;
// Number of channels SpikerBox reply message prefix
Expand All @@ -123,9 +129,11 @@ namespace backyardbrains {
static const int MUSCLE_PRO_HARDWARE = 3;
// SpikerBox Neuron PRO hardware type.
static const int NEURON_PRO_HARDWARE = 4;
// SpikerBox Humans hardware type.
static const int HUMANS_HARDWARE = 5;

// Sample rate used throughout the app.
static const int SAMPLE_RATE = 10000;
static const int SAMPLE_RATE = 10000; //TODo sad je fizno proveri dal se negde cacka
};
}
}
Expand Down
10 changes: 0 additions & 10 deletions app/src/main/java/com/backyardbrains/BybApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,12 @@
package com.backyardbrains;

import android.app.Application;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import io.fabric.sdk.android.Fabric;
import org.greenrobot.eventbus.EventBus;

public class BybApplication extends Application {

@Override public void onCreate() {
super.onCreate();

// Set up Crashlytics, disabled for debug builds
Crashlytics crashlyticsKit =
new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build();
// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);

// initialize event bus
EventBus.builder()
.logNoSubscriberMessages(false)
Expand Down
Loading