diff --git a/app/src/main/java/xdsopl/robot36/ImageView.java b/app/src/main/java/xdsopl/robot36/ImageView.java
index ed02491..56d9983 100644
--- a/app/src/main/java/xdsopl/robot36/ImageView.java
+++ b/app/src/main/java/xdsopl/robot36/ImageView.java
@@ -37,6 +37,8 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback {
boolean takeABreak = true, cantTouchThis = true;
int imageWidth = 320;
int imageHeight = 240;
+ MainActivity activity;
+ String title;
final SurfaceHolder holder;
final Bitmap bitmap;
final Paint paint;
@@ -47,11 +49,22 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback {
final int sampleRate = 44100;
final short[] audioBuffer;
final int[] pixelBuffer;
+ final int[] currentMode;
final RenderScript rs;
- final Allocation rsDecoderAudioBuffer, rsDecoderPixelBuffer, rsDecoderValueBuffer;
+ final Allocation rsDecoderAudioBuffer, rsDecoderPixelBuffer;
+ final Allocation rsDecoderValueBuffer, rsDecoderCurrentMode;
final ScriptC_decoder rsDecoder;
+ final int mode_raw = 0;
+ final int mode_robot36 = 1;
+ final int mode_robot72 = 2;
+ final int mode_martin1 = 3;
+ final int mode_martin2 = 4;
+ final int mode_scottie1 = 5;
+ final int mode_scottie2 = 6;
+ final int mode_scottieDX = 7;
+
final Thread thread = new Thread() {
@Override
public void run() {
@@ -92,93 +105,121 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback {
audioBuffer = new short[framesPerSecond * bufferSizeInSamples];
int maxHorizontalLength = 2 * sampleRate;
+ currentMode = new int[1];
rs = RenderScript.create(context);
rsDecoderAudioBuffer = Allocation.createSized(rs, Element.I16(rs), audioBuffer.length, Allocation.USAGE_SHARED | Allocation.USAGE_SCRIPT);
rsDecoderValueBuffer = Allocation.createSized(rs, Element.U8(rs), maxHorizontalLength, Allocation.USAGE_SCRIPT);
rsDecoderPixelBuffer = Allocation.createSized(rs, Element.I32(rs), pixelBuffer.length, Allocation.USAGE_SHARED | Allocation.USAGE_SCRIPT);
+ rsDecoderCurrentMode = Allocation.createSized(rs, Element.I32(rs), 1, Allocation.USAGE_SHARED | Allocation.USAGE_SCRIPT);
rsDecoder = new ScriptC_decoder(rs);
rsDecoder.bind_audio_buffer(rsDecoderAudioBuffer);
rsDecoder.bind_value_buffer(rsDecoderValueBuffer);
rsDecoder.bind_pixel_buffer(rsDecoderPixelBuffer);
+ rsDecoder.bind_current_mode(rsDecoderCurrentMode);
rsDecoder.invoke_initialize(sampleRate, maxHorizontalLength, bitmap.getWidth(), bitmap.getHeight());
thread.start();
}
void debug_sync() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = bitmap.getHeight();
rsDecoder.invoke_debug_sync();
}
}
void debug_image() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = bitmap.getHeight();
rsDecoder.invoke_debug_image();
}
}
void debug_both() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = bitmap.getHeight();
rsDecoder.invoke_debug_both();
}
}
void robot36_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 240;
rsDecoder.invoke_robot36_mode();
}
}
void robot72_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 240;
rsDecoder.invoke_robot72_mode();
}
}
void martin1_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 256;
rsDecoder.invoke_martin1_mode();
}
}
void martin2_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 256;
rsDecoder.invoke_martin2_mode();
}
}
void scottie1_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 256;
rsDecoder.invoke_scottie1_mode();
}
}
void scottie2_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 256;
rsDecoder.invoke_scottie2_mode();
}
}
void scottieDX_mode() {
synchronized (thread) {
- imageWidth = 320;
- imageHeight = 256;
rsDecoder.invoke_scottieDX_mode();
}
}
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+
+ void updateTitle(int id) { activity.updateTitle(activity.getString(id)); }
+ void switch_mode(int mode)
+ {
synchronized (thread) {
- canvasWidth = width;
- canvasHeight = height;
+ switch (mode) {
+ case mode_raw:
+ imageWidth = 320;
+ imageHeight = bitmap.getHeight();
+ updateTitle(R.string.action_debug_mode);
+ break;
+ case mode_robot36:
+ imageWidth = 320;
+ imageHeight = 240;
+ updateTitle(R.string.action_robot36_mode);
+ break;
+ case mode_robot72:
+ imageWidth = 320;
+ imageHeight = 240;
+ updateTitle(R.string.action_robot72_mode);
+ break;
+ case mode_martin1:
+ imageWidth = 320;
+ imageHeight = 256;
+ updateTitle(R.string.action_martin1_mode);
+ break;
+ case mode_martin2:
+ imageWidth = 320;
+ imageHeight = 256;
+ updateTitle(R.string.action_martin2_mode);
+ break;
+ case mode_scottie1:
+ imageWidth = 320;
+ imageHeight = 256;
+ updateTitle(R.string.action_scottie1_mode);
+ break;
+ case mode_scottie2:
+ imageWidth = 320;
+ imageHeight = 256;
+ updateTitle(R.string.action_scottie2_mode);
+ break;
+ case mode_scottieDX:
+ imageWidth = 320;
+ imageHeight = 256;
+ updateTitle(R.string.action_scottieDX_mode);
+ break;
+ default:
+ break;
+ }
}
}
void pause() {
@@ -201,6 +242,12 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback {
thread.notify();
}
}
+ public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+ synchronized (thread) {
+ canvasWidth = width;
+ canvasHeight = height;
+ }
+ }
public void surfaceCreated(SurfaceHolder holder) {
synchronized (thread) {
cantTouchThis = false;
@@ -241,5 +288,8 @@ public class ImageView extends SurfaceView implements SurfaceHolder.Callback {
rsDecoder.invoke_decode(samples);
rsDecoderPixelBuffer.copyTo(pixelBuffer);
bitmap.setPixels(pixelBuffer, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
+
+ rsDecoderCurrentMode.copyTo(currentMode);
+ switch_mode(currentMode[0]);
}
}
diff --git a/app/src/main/java/xdsopl/robot36/MainActivity.java b/app/src/main/java/xdsopl/robot36/MainActivity.java
index f15d34c..7ce63f2 100644
--- a/app/src/main/java/xdsopl/robot36/MainActivity.java
+++ b/app/src/main/java/xdsopl/robot36/MainActivity.java
@@ -24,11 +24,25 @@ import android.view.MenuItem;
public class MainActivity extends Activity {
ImageView view;
+
+ void updateTitle(final String newTitle)
+ {
+ if (getTitle() != newTitle) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ setTitle(newTitle);
+ }
+ });
+ }
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view = (ImageView)findViewById(R.id.image);
+ view.activity = this;
}
@Override
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5fa7f0e..23e3075 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5,6 +5,7 @@
Debug Sync
Debug Image
Debug Image and Sync
+ Debug Mode
Robot36 Mode
Robot72 Mode
Martin1 Mode
diff --git a/app/src/main/rs/decoder.rs b/app/src/main/rs/decoder.rs
index 3512017..f11a3eb 100644
--- a/app/src/main/rs/decoder.rs
+++ b/app/src/main/rs/decoder.rs
@@ -27,10 +27,7 @@ limitations under the License.
#include "modes.rsh"
#include "constants.rsh"
#include "state.rsh"
-
-short *audio_buffer;
-uchar *value_buffer;
-uchar4 *pixel_buffer;
+#include "exports.rsh"
static inline uchar4 rgb(uchar r, uchar g, uchar b) { return (uchar4){ b, g, r, 255 }; }
static inline uchar4 yuv(uchar y, uchar u, uchar v)
@@ -145,13 +142,13 @@ void decode(int samples) {
int sync_pulse = !sync_level && sync_counter >= sync_length;
sync_counter = sync_level ? sync_counter + 1 : 0;
- if (current_mode != mode_raw) {
+ if (*current_mode != mode_raw) {
int detected_mode = calibration_detector(dat_value, cnt_active, cnt_quantized);
if (detected_mode >= 0)
reset();
switch_mode(detected_mode);
int estimated_mode = scanline_estimator(sync_level);
- if (estimated_mode >= 0 && estimated_mode != current_mode)
+ if (estimated_mode >= 0 && estimated_mode != *current_mode)
reset();
switch_mode(estimated_mode);
}
@@ -167,7 +164,7 @@ void decode(int samples) {
seperator_counter = 0;
continue;
}
- switch (current_mode) {
+ switch (*current_mode) {
case mode_robot36:
robot36_decoder();
break;
diff --git a/app/src/main/rs/exports.rsh b/app/src/main/rs/exports.rsh
new file mode 100644
index 0000000..5002c10
--- /dev/null
+++ b/app/src/main/rs/exports.rsh
@@ -0,0 +1,25 @@
+/*
+Copyright 2014 Ahmet Inan
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ */
+
+#ifndef EXPORTS_RSH
+#define EXPORTS_RSH
+
+short *audio_buffer;
+uchar *value_buffer;
+uchar4 *pixel_buffer;
+int *current_mode;
+
+#endif
\ No newline at end of file
diff --git a/app/src/main/rs/modes.rsh b/app/src/main/rs/modes.rsh
index 57f462b..8f010be 100644
--- a/app/src/main/rs/modes.rsh
+++ b/app/src/main/rs/modes.rsh
@@ -19,12 +19,13 @@ limitations under the License.
#include "constants.rsh"
#include "state.rsh"
+#include "exports.rsh"
void debug_sync()
{
save_cnt = 1;
save_dat = 0;
- current_mode = mode_raw;
+ *current_mode = mode_raw;
sync_length = minimum_sync_length;
maximum_length = buffer_length;
scanline_length = maximum_length;
@@ -33,7 +34,7 @@ void debug_image()
{
save_dat = 1;
save_cnt = 0;
- current_mode = mode_raw;
+ *current_mode = mode_raw;
sync_length = minimum_sync_length;
maximum_length = buffer_length;
scanline_length = maximum_length;
@@ -42,7 +43,7 @@ void debug_both()
{
save_cnt = 1;
save_dat = 1;
- current_mode = mode_raw;
+ *current_mode = mode_raw;
sync_length = minimum_sync_length;
maximum_length = buffer_length;
scanline_length = maximum_length;
@@ -51,7 +52,7 @@ void robot36_mode()
{
save_dat = 1;
save_cnt = 0;
- current_mode = mode_robot36;
+ *current_mode = mode_robot36;
const float tolerance = 0.8f;
const float settling_time = 0.0011f;
const float sync_seconds = 0.009f;
@@ -75,7 +76,7 @@ void robot72_mode()
{
save_dat = 1;
save_cnt = 0;
- current_mode = mode_robot72;
+ *current_mode = mode_robot72;
const float tolerance = 0.8f;
const float settling_time = 0.0011f;
const float sync_seconds = 0.009f;
@@ -103,7 +104,7 @@ void martin1_mode()
{
save_cnt = 0;
save_dat = 1;
- current_mode = mode_martin1;
+ *current_mode = mode_martin1;
const float tolerance = 0.5f;
const float sync_seconds = 0.004862f;
const float sync_porch_seconds = 0.000572f;
@@ -126,7 +127,7 @@ void martin2_mode()
{
save_cnt = 0;
save_dat = 1;
- current_mode = mode_martin2;
+ *current_mode = mode_martin2;
const float tolerance = 0.5f;
const float sync_seconds = 0.004862f;
const float sync_porch_seconds = 0.000572f;
@@ -149,7 +150,7 @@ void scottie1_mode()
{
save_cnt = 0;
save_dat = 1;
- current_mode = mode_scottie1;
+ *current_mode = mode_scottie1;
const float tolerance = 0.8f;
const float settling_time = 0.0011f;
const float sync_seconds = 0.009f;
@@ -173,7 +174,7 @@ void scottie2_mode()
{
save_cnt = 0;
save_dat = 1;
- current_mode = mode_scottie2;
+ *current_mode = mode_scottie2;
const float tolerance = 0.8f;
const float settling_time = 0.0011f;
const float sync_seconds = 0.009f;
@@ -197,7 +198,7 @@ void scottieDX_mode()
{
save_cnt = 0;
save_dat = 1;
- current_mode = mode_scottieDX;
+ *current_mode = mode_scottieDX;
const float tolerance = 0.8f;
const float settling_time = 0.0011f;
const float sync_seconds = 0.009f;
@@ -220,7 +221,7 @@ void scottieDX_mode()
static void switch_mode(int new_mode)
{
- if (new_mode == current_mode)
+ if (new_mode == *current_mode)
return;
switch (new_mode) {
case mode_robot36:
diff --git a/app/src/main/rs/state.rsh b/app/src/main/rs/state.rsh
index c20c538..c318c4b 100644
--- a/app/src/main/rs/state.rsh
+++ b/app/src/main/rs/state.rsh
@@ -20,7 +20,7 @@ limitations under the License.
static ema_t avg_power, leader_lowpass;
static ddc_t cnt_ddc, dat_ddc;
static fmd_t cnt_fmd, dat_fmd;
-static int sample_rate, current_mode, even_hpos;
+static int sample_rate, even_hpos;
static int maximum_variance, minimum_sync_length;
static int scanline_length, minimum_length, maximum_length;
static int vis_timeout, vis_length, bit_length;