Hello,
I am busy with a Bachelor project on my University where we want to drive a
32x32 LED screen. Normally this is easy to do with the IOIO-OTG but we want
to make our own system to drive the LEDs, but want to use the IOIO-OTG to
only stream the RGB data in bit streams to our own system.
I am trying to write an app that takes a picture out of your phone, changes
it to 32x32 bit, analyses the Colors per pixel, converts the color levels
(256 possible levels) to 8 bits and then finally making a very long array
(length = 32*32*8bits) serving as a bitstream for R,G and B which I want to
send via 3 pins through the IOIO-OTG.
I am having quite some problem with this though. The app itself work just
fine and I do get my 3 very long arrays without null entries. The only
problem is that the moment I want to initialize the pins using for example
pin2 = ioio_openDirectOutput(2,false);, I get a Null Pointer Exception for
some reason.
Main code:
> package com.example.imagetest2;
> import java.io.FileNotFoundException;
> import ioio.lib.spi.Log;
> import ioio.lib.util.BaseIOIOLooper;
> import ioio.lib.api.DigitalOutput;
> import ioio.lib.api.exception.ConnectionLostException;
> import ioio.lib.util.IOIOLooper;
> import ioio.lib.util.android.IOIOActivity;
> import android.view.Menu;
> import android.view.View;
> import android.view.View.OnClickListener;
> import android.content.Intent;
> import android.graphics.Bitmap;
> import android.graphics.BitmapFactory;
> import android.net.Uri;
> import android.os.Bundle;
> import android.widget.Button;
> import android.widget.ImageView;
> import android.widget.TextView;
>
> public class MainActivity extends IOIOActivity implements OnClickListener {
>
> private Button shareButton;
> private ImageView imagethingy;
> private Bitmap bitmapb;
> private TextView color;
> private TextView colorint;
> private TextView status;
> private static int picw = 32;
> private static int pich = 32;
> public static String[] sig2bitR = new String[picw * pich * 8];
> public static String[] sig2bitG = new String[picw * pich * 8];
> public static String[] sig2bitB = new String[picw * pich * 8];
> private String[] Red = new String[pich * picw];
> private String[] Green = new String[pich * picw];
> private String[] Blue = new String[pich * picw];
>
> @Override
> protected void onCreate(Bundle savedInstanceState) {
> super.onCreate(savedInstanceState);
> setContentView(R.layout.fragment_main);
> shareButton = (Button) findViewById(R.id.share_button);
> shareButton.setOnClickListener(this);
> imagethingy = (ImageView) findViewById(R.id.imageView1);
> color = (TextView) findViewById(R.id.textView2);
> colorint = (TextView) findViewById(R.id.textView3);
> status = (TextView) findViewById(R.id.textView1);
> }
> @Override
> public void onClick(View v) {
> Intent intent = new Intent(Intent.ACTION_PICK,
> android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
> startActivityForResult(intent, 0);
> }
> @Override
> protected void onActivityResult(int requestCode, int resultCode, Intent
> data) {
> super.onActivityResult(requestCode, resultCode, data);
> if (resultCode == RESULT_OK) {
> Uri targetUri = data.getData();
> // textTargetUri.setText(targetUri.toString());
> Bitmap bitmapa;
> try {
> bitmapa = BitmapFactory.decodeStream(getContentResolver()
> .openInputStream(targetUri));
> bitmapb = Bitmap.createScaledBitmap(bitmapa, 32, 32, false);
> imagethingy.setImageBitmap(bitmapb);
> int[] pix = new int[picw * pich];
> bitmapb.getPixels(pix, 0, picw, 0, 0, picw, pich);
> for (int y = 0; y < pich; y++) {
> for (int x = 0; x < picw; x++) {
> int index = y * picw + x;
> Red[index] = Integer
> .toBinaryString((pix[index] >> 16) & 0xff); // bitwise
> // shifting
> Green[index] = Integer
> .toBinaryString((pix[index] >> 8) & 0xff);
> Blue[index] = Integer.toBinaryString(pix[index] & 0xff);
> if (Red[index].length() != 8) {
> Red[index] = String.format("%08d",
> Integer.parseInt(Red[index]));
> }
> if (Green[index].length() != 8) {
> Green[index] = String.format("%08d",
> Integer.parseInt(Green[index]));
> }
> if (Blue[index].length() != 8) {
> Blue[index] = String.format("%08d",
> Integer.parseInt(Blue[index]));
> }
> }
> }
> for (int i = 0; i < Red.length; i++) {
> String[] s2r = Red[i].split("");
> String[] s2g = Green[i].split("");
> String[] s2b = Blue[i].split("");
> System.arraycopy(s2r, 1, sig2bitR, 8 * i, 8);
> System.arraycopy(s2g, 1, sig2bitG, 8 * i, 8);
> System.arraycopy(s2b, 1, sig2bitB, 8 * i, 8);
> }
> } catch (FileNotFoundException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> Looper looper = new Looper();
> try {
> looper.setup();
> looper.loop();
> } catch (ConnectionLostException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> }
>
> protected IOIOLooper createIOIOLooper() {
> return new Looper();
> }
> }
Looper code:
>
> package com.example.imagetest2;
> import ioio.lib.api.DigitalOutput;
> import ioio.lib.api.exception.ConnectionLostException;
> import ioio.lib.spi.Log;
> import ioio.lib.util.BaseIOIOLooper;
> import ioio.lib.util.IOIOLooper;
>
>
> class Looper extends BaseIOIOLooper {
> private DigitalOutput pin2;
> private DigitalOutput pin4;
> private DigitalOutput pin6;
> private DigitalOutput led_;
> private String[] sig2bitR = MainActivity.sig2bitR;
> private String[] sig2bitG = MainActivity.sig2bitG;
> private String[] sig2bitB = MainActivity.sig2bitB;
> private boolean check =false;
> private int counter;
>
> @Override
> protected void setup() throws ConnectionLostException {
> pin2 = ioio_.openDigitalOutput(2, false);
> pin4 = ioio_.openDigitalOutput(4, false);
> pin6 = ioio_.openDigitalOutput(6, false);
> }
> /**
> * Called repetitively while the IOIO is connected.
> *
> * @throws ConnectionLostException
> * When IOIO connection is lost.
> *
> * @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#loop()
> */
> @Override
> public void loop() throws ConnectionLostException {
>
> for (int j = 0; j < sig2bitR.length; j++) {
> if (sig2bitR[j] == null | sig2bitG[j] == null
> | sig2bitB[j] == null) {
> counter = counter + 1;
> }
> }
> Log.d("ImageTest", Integer.toString(counter));
> Log.d("ImageTest", sig2bitR[1]);
> for (int j = 0; j<sig2bitR.length;j++){
>
>
> if (sig2bitR[j]=="0"){
> pin2.write(false);
> }
> else{
> pin2.write(true);
> }
> if (sig2bitG[j]=="0"){
> pin4.write(false);
> }
> else{
> pin4.write(true);
> }
> if (sig2bitB[j]=="0"){
> pin6.write(false);
> }
> else{
> pin6.write(true);
> }
>
> }
>
> }
>
>
> }
Full error log:
> 05-01 17:13:23.350: E/AndroidRuntime(12620): FATAL EXCEPTION: main
> 05-01 17:13:23.350: E/AndroidRuntime(12620): Process:
> com.example.imagetest2, PID: 12620
> 05-01 17:13:23.350: E/AndroidRuntime(12620): java.lang.RuntimeException:
> Failure delivering result ResultInfo{who=null, request=0, result=-1,
> data=Intent { act=com.htc.HTCAlbum.action.ITEM_PICKER_FROM_COLLECTIONS
> dat=content: typ=image/jpeg (has extras) }} to activity
> {com.example.imagetest2/com.example.imagetest2.MainActivity}:
> java.lang.NullPointerException
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread.deliverResults(ActivityThread.java:3942)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread.handleSendResult(ActivityThread.java:3992)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread.access$1300(ActivityThread.java:156)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.os.Handler.dispatchMessage(Handler.java:102)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.os.Looper.loop(Looper.java:157)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread.main(ActivityThread.java:5872)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> java.lang.reflect.Method.invokeNative(Native Method)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> java.lang.reflect.Method.invoke(Method.java:515)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1069)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:885)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> dalvik.system.NativeStart.main(Native Method)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): Caused by:
> java.lang.NullPointerException
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> com.example.imagetest2.Looper.setup(Looper.java:34)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> com.example.imagetest2.MainActivity.onActivityResult(MainActivity.java:151)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.Activity.dispatchActivityResult(Activity.java:5535)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): at
> android.app.ActivityThread.deliverResults(ActivityThread.java:3938)
> 05-01 17:13:23.350: E/AndroidRuntime(12620): ... 11 more
--
You received this message because you are subscribed to the Google Groups
"ioio-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/ioio-users.
For more options, visit https://groups.google.com/d/optout.