When un-handled exceptions are caught on the IOIO thread they are written to the log. I don't know what you've done in the app you wrote from scratch that's different than the example apps. It is probably either not linking in all the relevant IOIO libraries or not having declared something in the manifest file.
I seriously doubt that what you're trying to do could ever work at a reasonable speed. You're trying to bit-bang a high rate of data over USB, which is not really possible. I'm not sure what protocol your LED matrix talks, but if it is asynchronous (i.e. expects the signals to be precisely-timed) than this can probably not work at all and not just not work fast. Please take a look at the PIXEL project, with its associated custom IOIO code that's intended to drive an LED array of up to 64x64 at >100fps On Sat, May 3, 2014 at 5:38 AM, Sidharta Prahladsingh <[email protected] > wrote: > *UPDATE!!* > I found the solution myself. I didn't know that loop() was being called > continuously so I got a Null Pointer right at the start of the program. > The reason I didn't catch this is because when the loop starts, there is > no feedback on Null pointers anymore and you just have to read the pins to > see what the outcome is. > Can that be fixed in later updates of the IOIO Library files? Also can > someone still tell me why I had to modify a HelloIOIO example app to make > everything work? > > Cheers, > > Sid > > > On Thursday, May 1, 2014 5:31:55 PM UTC+2, Sidharta Prahladsingh wrote: > >> 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. > -- 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.
