Skip to content

Commit c76487a

Browse files
authored
Merge pull request #79 from dividiti/issue-78
Issue 78 - it now works on S7! Thanks! The next step is to check that it will work on other mobile phones (without breaking compatibility with S7) ...
2 parents 6b0b447 + ac61662 commit c76487a

File tree

3 files changed

+87
-14
lines changed

3 files changed

+87
-14
lines changed

app/src/main/java/openscience/crowdsource/video/experiments/AppConfigService.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
//todo it's better to implement all services using IoC
2828
public class AppConfigService {
2929

30+
public static final String DATA_LOCAL_TMP_VIENNACL_CACHE = "/data/local/tmp/viennacl_cache_";
3031
private final static String APP_CONFIG_DIR = "/sdcard/openscience/"; //todo get log dir from common config service
3132
private final static String APP_CONFIG_FILE_PATH = APP_CONFIG_DIR + "app_config.json";
3233

@@ -168,6 +169,23 @@ synchronized public static String getRecognitionResultText() {
168169
}
169170

170171

172+
synchronized public static String parsePredictionRawResult(String value) {
173+
final String[] predictions = value.split("[\\r\\n]+");
174+
//skip prefix
175+
boolean isPredictionStarted = false;
176+
StringBuilder predictionBuilder = new StringBuilder();
177+
for (String prediction : predictions) {
178+
if (prediction.contains("Prediction")){
179+
isPredictionStarted = true;
180+
continue;
181+
}
182+
if(isPredictionStarted) {
183+
predictionBuilder.append(prediction).append("\n");
184+
}
185+
}
186+
return predictionBuilder.toString();
187+
}
188+
171189
synchronized public static void updatePreviewRecognitionText(String value) {
172190
AppConfig appConfig = loadAppConfig();
173191
if (appConfig == null) {
@@ -176,8 +194,8 @@ synchronized public static void updatePreviewRecognitionText(String value) {
176194
if (previewRecognitionTextUpdater != null) {
177195
if (value != null) {
178196
final String[] predictions = value.split("[\\r\\n]+");
179-
if (predictions.length >= 2) {
180-
String previewRecognitionText = predictions[1];
197+
if (predictions.length >= 1) {
198+
String previewRecognitionText = predictions[0];
181199
appConfig.setPreviewRecognitionText(previewRecognitionText);
182200
previewRecognitionTextUpdater.update(previewRecognitionText);
183201
}

app/src/main/java/openscience/crowdsource/video/experiments/MainActivity.java

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@
6969
import javax.microedition.khronos.opengles.GL10;
7070

7171
import static openscience.crowdsource.video.experiments.AppConfigService.COMMAND_CHMOD_744;
72+
import static openscience.crowdsource.video.experiments.AppConfigService.DATA_LOCAL_TMP_VIENNACL_CACHE;
7273
import static openscience.crowdsource.video.experiments.AppConfigService.cachedScenariosFilePath;
7374
import static openscience.crowdsource.video.experiments.AppConfigService.externalSDCardOpensciencePath;
7475
import static openscience.crowdsource.video.experiments.AppConfigService.externalSDCardOpenscienceTmpPath;
7576
import static openscience.crowdsource.video.experiments.AppConfigService.externalSDCardPath;
7677
import static openscience.crowdsource.video.experiments.AppConfigService.initAppConfig;
78+
import static openscience.crowdsource.video.experiments.AppConfigService.parsePredictionRawResult;
7779
import static openscience.crowdsource.video.experiments.AppConfigService.url_cserver;
7880
import static openscience.crowdsource.video.experiments.RecognitionScenarioService.PRELOADING_TEXT;
7981
import static openscience.crowdsource.video.experiments.Utils.createDirIfNotExist;
@@ -926,9 +928,17 @@ public void println(String text) {
926928

927929
String scenarioCmd = meta.getString("cmd");
928930

931+
//patrh open cl version
932+
String openCLlibPath = null;
933+
// openCLlibPath = patchOpenCL(); temporary disabled
934+
935+
if (openCLlibPath != null) {
936+
libPath = libPath + ":" + openCLlibPath;
937+
}
929938
String[] scenarioEnv = {
930939
"CT_REPEAT_MAIN=" + String.valueOf(1),
931940
"LD_LIBRARY_PATH=" + libPath + ":$LD_LIBRARY_PATH",
941+
"VIENNACL_CACHE_PATH=" + DATA_LOCAL_TMP_VIENNACL_CACHE
932942
};
933943
publishProgress("Prepared scenario env " + scenarioEnv[0]);
934944
publishProgress("Prepared scenario env " + scenarioEnv[1]);
@@ -962,7 +972,8 @@ public void run() {
962972
List<Long> processingTimes = new LinkedList<>();
963973
List<List<Double[]>> cpuFreqs = new LinkedList<>();
964974
JSONArray fineGrainTimerJSONArray = new JSONArray();
965-
String recognitionResultText = null;
975+
String recognitionRawResultText = null;
976+
String predictions = null;
966977
for (int it = 0; it <= iterationNum; it ++) {
967978
if (it == 0) {
968979
publishProgress("Recognition in progress (the device is warming up) ...\n");
@@ -972,8 +983,8 @@ public void run() {
972983
long startTime = System.currentTimeMillis();
973984
String[] recognitionResult = openme.openme_run_program(scenarioCmd, scenarioEnv, executablePath); //todo fix ck response cmd value: addRecognitionScenario appropriate path to executable from according to path value at "file" json
974985
Long processingTime = System.currentTimeMillis() - startTime;
975-
recognitionResultText = recognitionResult[1]; // todo it better to compare recognition results and print error
976-
if (recognitionResultText == null || recognitionResultText.trim().equals("")) {
986+
recognitionRawResultText = recognitionResult[1]; // todo it better to compare recognition results and print error
987+
if (recognitionRawResultText == null || recognitionRawResultText.trim().equals("")) {
977988
publishProgress("\nError Recognition result is empty ...\n");
978989
if (recognitionResult.length>=1 && recognitionResult[0] != null && !recognitionResult[0].trim().equals("")) {
979990
publishProgress("\nRecognition errors: " + recognitionResult[0]);
@@ -983,11 +994,12 @@ public void run() {
983994
}
984995
return null;
985996
}
997+
predictions = parsePredictionRawResult(recognitionRawResultText);
986998
if (it == 0) {
987999
// the first iteration is used for warming up the device if it was in a low power state
9881000
publishProgress(" * Recognition time (warming up) " + processingTime + " ms \n");
989-
publishProgress("\nRecognition result (warming up):\n " + recognitionResultText);
990-
AppConfigService.updatePreviewRecognitionText(recognitionResultText);
1001+
publishProgress("\nRecognition result (warming up):\n " + recognitionRawResultText);
1002+
AppConfigService.updatePreviewRecognitionText(predictions);
9911003
continue;
9921004
}
9931005
publishProgress(" * Recognition time " + it + ": " + processingTime + " ms \n");
@@ -1001,7 +1013,7 @@ public void run() {
10011013
publishProgress("Error on reading fine-grain timers" + e.getLocalizedMessage());
10021014
}
10031015
}
1004-
publishProgress("\nRecognition result:" + recognitionResultText);
1016+
publishProgress("\nRecognition result:" + recognitionRawResultText);
10051017

10061018
publishProgress("Submitting results and unexpected behavior (if any) to the Collective Knowledge Aggregator ...\n");
10071019

@@ -1015,7 +1027,7 @@ public void run() {
10151027
JSONArray processingTimesJSON = new JSONArray(processingTimes);
10161028
results.put("xopenme", fineGrainTimerJSONArray);
10171029
results.put("time", processingTimesJSON);
1018-
results.put("prediction", recognitionResultText);
1030+
results.put("prediction", predictions);
10191031

10201032
results.put("image_width", imageInfo.getWidth());
10211033
results.put("image_height", imageInfo.getHeight());
@@ -1093,7 +1105,7 @@ public void run() {
10931105
AppConfigService.updateResultURL(resultURL);
10941106
publishProgress('\n' + status + '\n');
10951107

1096-
showIsThatCorrectDialog(recognitionResultText, actualImageFilePath, data_uid, behavior_uid, dataUID);
1108+
showIsThatCorrectDialog(predictions, actualImageFilePath, data_uid, behavior_uid, dataUID);
10971109
}
10981110
} catch (JSONException e) {
10991111
publishProgress("\nError obtaining key 'error' from OpenME output (" + e.getMessage() + ") ...");
@@ -1119,7 +1131,7 @@ private void showIsThatCorrectDialog(final String recognitionResultText, final S
11191131
final String behavior_uid, final String crowd_uid) {
11201132
String[] predictions = recognitionResultText.split("[\\r\\n]+");
11211133

1122-
if (predictions.length < 2) {
1134+
if (predictions.length < 1) {
11231135
publishProgress("\nError incorrect result text format ");
11241136
return;
11251137
}
@@ -1134,6 +1146,49 @@ private void showIsThatCorrectDialog(final String recognitionResultText, final S
11341146
AppConfigService.updateState(AppConfigService.AppConfig.State.RESULT);
11351147
openResultActivity();
11361148
}
1149+
1150+
private String patchOpenCL() {
1151+
String libOpenCLFileName = "libOpenCL.so";
1152+
String fromFilePath = "/system/vendor/lib/egl/libGLES_mali.so";
1153+
1154+
String targetAppFileDir = AppConfigService.getLocalAppPath() + File.separator + "openscience" + File.separator + "code/libopencl/armeabi-v7a";
1155+
String targetAppFilePath = targetAppFileDir + File.separator + libOpenCLFileName;
1156+
1157+
String[] rmResult = openme.openme_run_program("rm " + targetAppFilePath, null, targetAppFileDir);
1158+
if (rmResult[0].isEmpty() && rmResult[1].isEmpty() && rmResult[2].isEmpty()) {
1159+
publishProgress(" * File " + targetAppFilePath + " successfully removed...\n");
1160+
} else {
1161+
publishProgress("\nError removing file " + fromFilePath + " ..." + rmResult[0] + " " + rmResult[1] + " " + rmResult[2]);
1162+
}
1163+
1164+
1165+
File appfp = new File(targetAppFileDir);
1166+
if (!appfp.exists()) {
1167+
if (!appfp.mkdirs()) {
1168+
publishProgress("\nError creating dir (" + targetAppFileDir + ") ...");
1169+
return null;
1170+
}
1171+
}
1172+
1173+
1174+
try {
1175+
copy_bin_file(fromFilePath, targetAppFilePath);
1176+
publishProgress("\n * File " + fromFilePath + " successfully copied to " + targetAppFilePath);
1177+
} catch (IOException e) {
1178+
e.printStackTrace();
1179+
publishProgress("\nError copying file " + fromFilePath + " to " + targetAppFilePath + " ..." + e.getLocalizedMessage());
1180+
return null;
1181+
}
1182+
1183+
String[] chmodResult = openme.openme_run_program(COMMAND_CHMOD_744 + " " + targetAppFilePath, null, targetAppFileDir);
1184+
if (chmodResult[0].isEmpty() && chmodResult[1].isEmpty() && chmodResult[2].isEmpty()) {
1185+
publishProgress(" * File " + targetAppFilePath + " successfully set as executable ...\n");
1186+
} else {
1187+
publishProgress("\nError setting file " + fromFilePath + " as executable ...");
1188+
return null;
1189+
}
1190+
return targetAppFileDir;
1191+
}
11371192
}
11381193

11391194
private void openResultActivity() {

app/src/main/java/openscience/crowdsource/video/experiments/ResultActivity.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,20 @@ public void onClick(View arg0) {
102102
if (recognitionResultText != null) {
103103
final String[] predictions = recognitionResultText.split("[\\r\\n]+");
104104

105-
if (predictions.length < 2) {
105+
if (predictions.length < 1) {
106106
AppLogger.logMessage("Error incorrect result text format...");
107107
return;
108108
}
109109

110-
for (int p = 1; p <= predictions.length; p++) {
110+
for (int p = 0; p <= predictions.length; p++) {
111111
LinearLayout ll = new LinearLayout(this);
112112
ll.setOrientation(LinearLayout.HORIZONTAL);
113113
final TextView resultItemView = new TextView(this);
114114
resultItemView.setPadding(0, 20, 0 , 20);
115115
Spanned spanned;
116116
final EditText edittext = new EditText(ResultActivity.this);
117117
edittext.setEnabled(false);
118-
int skipIndex = 1; // 0 - mean do not skip
118+
int skipIndex = 0;
119119
if (p == skipIndex) {
120120
spanned = Html.fromHtml("<font color='red'><b>" + predictions[p] + "</b></font>");
121121
TextView correctResultvalue = (TextView) findViewById(R.id.predictedResultValue);

0 commit comments

Comments
 (0)