Notices

My new CarPC Project - Honeycomb Here I Come

Old 02-20-2012, 11:55 PM
  #26  
i haz rotary? say what?
iTrader: (2)
 
Matrx8's Avatar
 
Join Date: Nov 2010
Location: Southern Arizona
Posts: 534
Likes: 0
Received 0 Likes on 0 Posts
Dude. You have a frickin tablet in your car. *shakes shelldude* YOU HAVE A FRICKIN TABLET IN YOUR CAR!!! AND IT LOOKS GREAT TOO!!! Totally Stoked.
Old 03-01-2012, 12:40 PM
  #27  
Registered User
 
quicke's Avatar
 
Join Date: Mar 2012
Posts: 2
Likes: 0
Received 0 Likes on 0 Posts
ok this is going to sound stupid but i tried to do this with my dell streak 7 and i can get S**t to work is there a soft ware you need to download or some thing i need. help me what do i need to do please help.
Old 03-01-2012, 06:34 PM
  #28  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
What exactly is it you tried to do? There are numerous aspects to this project, none of which up to this point have required custom code on the Streak -- however I will be doing some custom service work for the bluetooth stack shortly... just waiting on getting my 8 back from a turbo rebuild.
Old 03-05-2012, 12:49 PM
  #29  
Registered User
 
quicke's Avatar
 
Join Date: Mar 2012
Posts: 2
Likes: 0
Received 0 Likes on 0 Posts
ok then how do you get the fuel and all of that to show up on your dell streak 7?
Old 03-05-2012, 10:33 PM
  #30  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
An ELM bluetooth adapter and any number of Android OBD2 apps. I believe I'm using Dashcommand in the screenshots.

Something like this should work fine:

Amazon Amazon
Old 03-25-2012, 08:05 PM
  #31  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
Finally gutted the old PC, all wiring, and the car2pc adapter today.

the grom aux/Bluetooth adapter is installed and paired.

5v power from my carnetix p2140 is done too.

Now I've just got to put everything back together.
Old 03-26-2012, 08:11 AM
  #32  
User and Abuser
iTrader: (3)
 
firebirdude's Avatar
 
Join Date: Nov 2006
Location: Sunshine State
Posts: 3,113
Received 9 Likes on 8 Posts
Time moves fast. Ice Cream Sandwich is now on your heels.
Old 03-26-2012, 10:37 AM
  #33  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
Originally Posted by firebirdude
Time moves fast. Ice Cream Sandwich is now on your heels.
Unfortunately the Dell steak will never have official ICS support and the current community development ROM for it does not support 3g.

I may even go back to gingerbread at some point.
Old 04-05-2012, 10:22 PM
  #34  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
I've started development on my Car Home activity. Wrapped up music and bluetooth remote control tonight.


Some things I plan to add:
  • Breadcrumb Location Storage to my home server
  • SMS location reply (via SMS TXT from me)
  • MMS Front/Rear Camera reply (via SMS TXT from me)
  • Remote Device Wipe
Old 04-07-2012, 11:15 PM
  #35  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
Still refining the base UI

Attached Thumbnails My new CarPC Project - Honeycomb Here I Come-device-2012-04-08-001122.jpg  
Old 04-08-2012, 01:41 AM
  #36  
Registered Lunatic
iTrader: (1)
 
Tamas's Avatar
 
Join Date: Aug 2003
Location: SF Bay Area, California
Posts: 3,575
Received 37 Likes on 32 Posts
Very cool. Looking forward to further news about this.

Great song selection too

Wish there was a way to find that mount for a sane price though...
Old 04-14-2012, 12:38 AM
  #37  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
I stumbled upon an Android open source OBD2 library yesterday and couldn't resist the urge to integrate it into my "RX-8 Home" app. After a little bit of trial and error I'm reading all of the basic OBD2 PIDs and have pulled in the ones I'm most interested in.


Over the next couple days I'll skin some cool gauges and integrated them in place of the current TextViews.

The library is called libvoyager and can be found here: https://github.com/gtosoft/libvoyager

I couldn't get any of the sibling sample projects to work unmodified, but after a little finesse I had my own utility class built that is working flawlessly.

Here's the code:

Code:
package com.shellware.CarHome;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;

import com.gtosoft.libvoyager.android.ActivityHelper;
import com.gtosoft.libvoyager.db.DashDB;
import com.gtosoft.libvoyager.session.HybridSession;
import com.gtosoft.libvoyager.session.OBD2Session;
import com.gtosoft.libvoyager.util.EasyTime;
import com.gtosoft.libvoyager.util.EventCallback;
import com.gtosoft.libvoyager.util.GeneralStats;
import com.gtosoft.libvoyager.util.OOBMessageTypes;

public class OBDHelper {

	private Context ctx;
	
	// General Stats about the internals of the app.
	private GeneralStats mgStats = new GeneralStats();

	// Dash DB. Has OBD PID lookup tables and much more. see assets/schema.sql.
	private DashDB ddb = null;
	
	// Hybridsession is a class that lets us communicate using OBD or passive or
	// direct network commands. It manages various "session" classes to do this.
	private HybridSession hs;

	// ActivityHelper helps us perform Bluetooth discovery so we don't have to
	// write a ton of code.
	private ActivityHelper aHelper = null;
	
	private double voltage = 0d;
	private double iat = 0d;
	private double equiv = 0d;
	private double fuel = 0d;
	private double coolant = 0d;
	private double maf;
	
	public OBDHelper(Context ctx) {
	    
		this.ctx = ctx;
		
		aHelper = new ActivityHelper(ctx);
		// Register with libvoyager to receive "we found an ELM device nearby"
		// message so when we perform a discovery, this method gets called.
		aHelper.registerChosenDeviceCallback(chosenCallback);
		// in the onResume method we will make the call to ActivityHelper to
		// actually kick off the bluetooth discovery.
		
		doBestAvailable();
	}
	
	private boolean doBestAvailable() {
		// kick off Bluetooth discovery. At this point the phone looks for
		// nearby bluetooth devices.
		// For each device, ActivityHelper checks its name to see if it's an OBD
		// device.
		// If the device seems to be an ELM OBD device, it calls the
		// "chosenCallback" event with details about the device (its MAC).
		if (hs == null || hs.getEBT().isConnected() != true) {
			connectToBestAvailable();
		} else {
			return false;
		}

		return true;
	}

	/**
	 * Either connects to last known device, or performs a discovery to find
	 * nearby OBD devices.
	 */
	private void connectToBestAvailable() {
		String lastmac = aHelper.getLastUsedMAC();

		// Connect to last known device if possible. Otherwise do the usual
		// bluetooth scan.
		if (lastmac.length() == 17) {
			// if we setupSession ourself, we are skipping the activityhelper
			// conveniences of discovery/etc.
			setupSession(lastmac);
		} else {
			// let the activityhelper find the device and fire off the
			// "chosenCallback" when it finds one.
			aHelper.startDiscovering();
		}
	}

	/**
	 * libVoyager can do the BT discovery and device choosing for you. When it
	 * finds/chooses a device it runs the device chosen callback. This method
	 * defines what to do when a new device is found.
	 */
	private EventCallback chosenCallback = new EventCallback() {
		@Override
		public void onELMDeviceChosen(String MAC) {
			setupSession(MAC);
		}
	};

	/**
	 * This method gets called by the broadcast receiver, for bluetooth devices
	 * which are "OBD" devices. This takes care of any necessary actions to open
	 * a connection to the specified device. Run synchronized in case the
	 * discovery process throws us multiple devices. We only want the first
	 * valid one.
	 * 
	 * @param deviceMACAddress
	 * @return - true on success, false otherwise.
	 */
	private synchronized boolean setupSession(String deviceMACAddress) {
		// If there's an existing hybrid session, shut it down.
		if (hs != null) {
			hs.shutdown();
		}

		// instantiate dashDB if necessary.
		if (ddb == null) {
			ddb = new DashDB(ctx);
		}

		aHelper.setLastUsedMAC(deviceMACAddress);

		// instantiate hybridsession, which is just a class that controls
		// subclasses such as Monitorsession and OBDSession, that communicate
		// with the network in different ways.
		hs = new HybridSession(BluetoothAdapter.getDefaultAdapter(),
				deviceMACAddress, ddb, mLocalecbOOBMessageHandler);
		// after hybridsession is successful at opening the bluetooth
		// connection, we will get an OOB notification that the IO state changed
		// to "1".

		// Sets the session type to OBD2. nothing fancy.
		// hs.setActiveSession(HybridSession.SESSION_TYPE_OBD2);

		// register a method to be called when new data arrives.
		hs.registerDPArrivedCallback(mLocalDPNArrivedHandler);

		return true;
	}

	private int mLastIOState = 1234;

	private void ioStateChanged(int newState) {

		// Avoid non-events where iostateChanged is fired but no state change
		// actually occurred.
		if (newState == mLastIOState) {
			return;
		} else {
			mLastIOState = newState;
		}

		// Did bluetooth just establish connection? If so then kick off a
		// session detection to see what we're connected to.
		if (newState == 1) {
			// Bluetooth just connected, so kick off a thread that does network
			// detection and prepares the hybridsession class for use.
			detectSessionInBackground();
		} else {
			// Bluetooth just disconnected. ELMBT will try to reconnect a preset
			// number of times, at a preset interval.
			// TODO: Kill the auto detect routine in case it started and is still in progress. 
		}
	}

	public void shutdown() {
		// give hs a chance to properly close the network/bluetooth link.
		if (hs != null)
			hs.shutdown();
	};

	/**
	 * Kicks off an asynchronous thread which does network/hardware detection
	 * via the hybridSession class.
	 */
	private void detectSessionInBackground() {
		new Thread() {
			public void run() {
				mgStats.incrementStat("netDetectAttempts"); // sets it to
															// initial value, 1.
				// loop until either 1. we detect the network, or 2. bluetooth
				// disconnects.
				// Typically this detection process takes 5-15 seconds depending
				// on type of network. Cacheing optimizations haven't been built
				// in yet but would be quite easy down the road.
				while (hs.runSessionDetection() != true
						&& hs.getEBT().isConnected() == true) {
					mgStats.incrementStat("netDetectAttempts");
					if (!EasyTime.safeSleep(1000))
						break;
				}
			}
		}.start();
	}

	/**
	 * Define what action the hybridsession should take as it decodes data from
	 * the OBD network.
	 */
	private EventCallback mLocalDPNArrivedHandler = new EventCallback() {
		@Override
		public void onDPArrived(String DPN, final String sDecodedData, int iDecodedData) {

			if (DPN.equals("VOLTS")) voltage = getPrimaryDPNValue(sDecodedData);
			if (DPN.equals("TEMP_INTAKE")) iat = getPrimaryDPNValue(sDecodedData);
			if (DPN.equals("TEMP_COOLANT")) coolant = getPrimaryDPNValue(sDecodedData);
			if (DPN.equals("MAF_FLOW_RATE")) maf = getPrimaryDPNValue(sDecodedData);
			if (DPN.equals("FUEL_LEVEL")) fuel = getPrimaryDPNValue(sDecodedData);
			if (DPN.equals("COMMAND_EQUIVALENCE_RATIO")) equiv = getPrimaryDPNValue(sDecodedData);
		}
	};

	// Defines the logic to take place when an out of band message is generated
	// by the hybrid session layer.
	private EventCallback mLocalecbOOBMessageHandler = new EventCallback() {
		@Override
		public void onOOBDataArrived(String dataName, String dataValue) {

			// state change?
			if (dataName.equals(OOBMessageTypes.IO_STATE_CHANGE)) {
				int newState = 0;
				try {
					newState = Integer.valueOf(dataValue);
					ioStateChanged(newState);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}// end of "if this was a io state change".

			// Bluetooth unable to connect to peer?
			if (dataName.equals(OOBMessageTypes.BLUETOOTH_FAILED_CONNECT)) {

				if (dataValue.equals("0")) {
					aHelper.startDiscovering();
				}
			}

			// session state change?
			if (dataName.equals(OOBMessageTypes.SESSION_STATE_CHANGE)) {
				int newState = 0;

				// convert from string to integer.
				try {
					newState = Integer.valueOf(dataValue);
				} catch (NumberFormatException e) {
					return;
				}

				// just connected? OBD mode?
				if (hs != null && hs.getRoutineScan() != null) {
					if (newState >= OBD2Session.STATE_OBDCONNECTED) {
						// Add some datapoints to the "routine scan" which is an
						// automatic loop that continuously scans those PIDs.
						hs.setRoutineScanDelay(2000);

						hs.getRoutineScan().addDPN("VOLTS");
						hs.getRoutineScan().addDPN("TEMP_INTAKE");
						hs.getRoutineScan().addDPN("TEMP_COOLANT");
						hs.getRoutineScan().addDPN("MAF_FLOW_RATE");
						hs.getRoutineScan().addDPN("FUEL_LEVEL");
						hs.getRoutineScan().addDPN("COMMAND_EQUIVALENCE_RATIO");
						
					} else {
						hs.getRoutineScan().removeAllDPNs();
					}
				}
			}// end of session state change handler.

			// Did we just perform detection stuff?
			if (dataName.equals(OOBMessageTypes.AUTODETECT_SUMMARY)) {
				if (hs.isDetectionValid() != true)
					return;
				
				SetupSessionBasedOnCapabilities();
			}// end of "if this is a autodetect summary"
		}// end of OOB event arrived handler function definition. 
	};// end of event handler definition. 


	/**
	 * Call this method upon connecting. We'll see what the capabilities are and set up the appropriate session.  
	 */
	private void SetupSessionBasedOnCapabilities() {
		
		if (hs.isDetectionValid() != true) {
			return;
		}
	
		// switch to OBD2 communications mode
		hs.setActiveSession(HybridSession.SESSION_TYPE_OBD2);
		
		// sanity check
		if (hs.getRoutineScan() == null) return;
	
		// add one or more datapoints to the routine scan class so that it actively scans that PID to generate DPN arrived events. 
		hs.getRoutineScan().addDPN("VOLTS");
		hs.getRoutineScan().addDPN("TEMP_INTAKE");
		hs.getRoutineScan().addDPN("TEMP_COOLANT");
		hs.getRoutineScan().addDPN("MAF_FLOW_RATE");
		hs.getRoutineScan().addDPN("FUEL_LEVEL");
		hs.getRoutineScan().addDPN("COMMAND_EQUIVALENCE_RATIO");
	}

	/**
	 * removes commas and takes just the first value, if present.
	 * 
	 * @param decodedData
	 * @return
	 */
	private Double getPrimaryDPNValue(String decodedData) {
		Double Y = 0d;

		// do our best to extract the data value.
		if (decodedData.contains(",")) {
			try {
				Y = Double.valueOf(decodedData.split(",")[0]);
			} catch (NumberFormatException e) {
			}
		} else {
			try {
				Y = Double.valueOf(decodedData);
			} catch (NumberFormatException e) {
			}
		}

		return Y;
	}

	public HybridSession getHs() {
		return hs;
	}

	public double getVoltage() {
		return voltage;
	}

	public double getIat() {
		return (9/5) * iat + 32;
	}

	public double getAfr() {
		return equiv * 14.7;
	}

	public double getFuel() {
		return fuel;
	}

	public double getCoolant() {
		return (9/5) * coolant + 32;
	}

	public double getMaf() {
		return maf;
	}
}
And you simply initialize it with something like this:

Code:
    @Override
    public void onResume() {
        super.onResume();
        
        // our obd helper class (lotsa stuff happens here)
        if (obd == null) obd = new OBDHelper(this);
		        
        handler.post(oneSecondHandler);
    }
And then access like any other plain old java object when needed (I'm currently polling it (lazily) every second in a handler:

Code:
	((TextView) findViewById(R.id.textView1)).setText("OBD Voltage: " + String.valueOf(obd.getVoltage()) + "v");
	((TextView) findViewById(R.id.textView2)).setText("OBD IAT: " + String.valueOf(obd.getIat()) + "\u00b0");
	((TextView) findViewById(R.id.textView3)).setText("OBD Coolant: " + String.valueOf(obd.getCoolant()) + "\u00b0");
	((TextView) findViewById(R.id.textView4)).setText("OBD AFR: " + String.valueOf(obd.getAfr()));
	((TextView) findViewById(R.id.textView5)).setText("OBD MAF: " + String.valueOf(obd.getMaf()) + "g/s");
While considered open source, libvoyager has a non-commercial use license attached to it. So if you plan to use it in a commercial project it's probably best to first contact the author to see what his terms are for commercial redistribution.

It is a FULL OBD/CAN implementation library. I can read and clear CELs, add Mazda specific PIDs, you name it.
Attached Thumbnails My new CarPC Project - Honeycomb Here I Come-screen_20120414_0121.jpg  

Last edited by ShellDude; 04-14-2012 at 02:13 AM.
Old 04-14-2012, 02:02 AM
  #38  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
From the start of this project I'd been wanting to do some things that utilized Location Services and the cameras.

Using an SMS receiver RX-8 Home intercepts inbound SMS text messages and looks for specific keywords from a phone # white list.

When it receives a "Where are you?" text message it responds with a URL to Google Maps including its current GPS coordinates.




The app also waits for a "What do you see?" text message and responds with two MMS messages containing snapshots from the front and back cameras.

Attached Thumbnails My new CarPC Project - Honeycomb Here I Come-device-2012-04-14-024129.png   My new CarPC Project - Honeycomb Here I Come-device-2012-04-14-025218.jpg   My new CarPC Project - Honeycomb Here I Come-device-2012-04-14-023955.png  
Old 04-14-2012, 12:54 PM
  #39  
Registered Lunatic
iTrader: (1)
 
Tamas's Avatar
 
Join Date: Aug 2003
Location: SF Bay Area, California
Posts: 3,575
Received 37 Likes on 32 Posts
Great stuff

Now... does anyone have this mount for sale?
Old 04-14-2012, 01:44 PM
  #40  
Registered
iTrader: (2)
 
HiFlite999's Avatar
 
Join Date: Jun 2009
Location: MI
Posts: 2,254
Likes: 0
Received 4 Likes on 4 Posts
Originally Posted by Tamas
Great stuff

Now... does anyone have this mount for sale?
Post #14, this thread.
Old 04-15-2012, 12:14 PM
  #41  
Registered Lunatic
iTrader: (1)
 
Tamas's Avatar
 
Join Date: Aug 2003
Location: SF Bay Area, California
Posts: 3,575
Received 37 Likes on 32 Posts
Originally Posted by HiFlite999
Post #14, this thread.
$420 for that is a bit too rich to my blood
Old 04-15-2012, 04:07 PM
  #42  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
You could always get the metra kit and the parrot asteroid.
Old 04-16-2012, 01:36 AM
  #43  
Registered Lunatic
iTrader: (1)
 
Tamas's Avatar
 
Join Date: Aug 2003
Location: SF Bay Area, California
Posts: 3,575
Received 37 Likes on 32 Posts
Eh... I like your tablet solution but not that parrot thingy.
Old 04-16-2012, 02:13 AM
  #44  
on his 3rd rx8
iTrader: (3)
 
dozer's Avatar
 
Join Date: Dec 2006
Location: santa ana, ca
Posts: 6,034
Received 10 Likes on 5 Posts
dude. LIKE A BOSS.
Old 04-17-2012, 06:52 PM
  #45  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
Skinned some gauges and wired up their needles. Still not 100% with the AFR gauge. I'm looking for a better template.

Attached Thumbnails My new CarPC Project - Honeycomb Here I Come-screen_20120417_1942.jpg  
Old 04-17-2012, 07:46 PM
  #46  
Registered User
 
Queef Latifah's Avatar
 
Join Date: Aug 2011
Posts: 20
Likes: 0
Received 0 Likes on 0 Posts
Looks awesome, I've been running the appradio set up for a while...wish pioneer would release some an app like Carhome hah
Old 04-17-2012, 08:16 PM
  #47  
SARX Legend
iTrader: (46)
 
9krpmrx8's Avatar
 
Join Date: Jan 2007
Location: San Antonio, Texas
Posts: 33,784
Received 452 Likes on 366 Posts
Awesome as usual Shell. Any real downside to this project yet?
Old 04-19-2012, 02:05 PM
  #48  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
Downside... hmm...

There's a bug with the Grom AUX / Bluetooth adapter that once you cycle past track 99 A2DP integration fails until you either cycle the bluetooth connection or press Prior Track enough times to get back in the 50-99 track range. I coded a work-around that recycles the bluetooth connection automatically every "net" 40 forward track presses as it cycles from one track to the next and have reached out to Grom to see if they can patch their firmware.

Reaching the Honeycomb lower action bar can be a pain at times since the tablet is recessed a bit into the JDM mount. It's not undo-able, just a little tricky while driving. I've built a work-around for this that I haven't shown in the thread yet that uses a Gallery type marquee and double tap steering wheel controls for basic Android navigation.

These are really trivial issues given what I'm getting back from all of this. And I fully anticipate resolution of both as I invest a little more time into the interface overall.

I'm currently in the process of tracking down some of the more advanced (and secretive) Mazda PIDs for things like TPMS, FOBs, etc. I know the CANBUS got a huge overall with the SIIs and there might be things I could do on an SII (such as controlling CD text, etc) that are not available to me on the S1... similar to what you see paimon.soror doing in his RxDuino: Development Chat thread.
Old 04-19-2012, 05:15 PM
  #49  
"I wanna go fast!"
 
CrazyJek's Avatar
 
Join Date: Jul 2008
Location: East Fishkill NY
Posts: 330
Likes: 0
Received 1 Like on 1 Post
Im a big Android fan and was thinking of a car PC myself for some time now... but this is just simply awesome. Subbed.
Old 04-19-2012, 10:51 PM
  #50  
weeeeeeeeee
Thread Starter
iTrader: (12)
 
ShellDude's Avatar
 
Join Date: Jun 2008
Location: Outside Philadelphia
Posts: 4,200
Received 229 Likes on 153 Posts
More gauges.... more cleanup up of the UI required... It's not flowing well enough for me yet.


I also finished up DTC detection and DTC Reset tonight (didn't have any stored codes ... otherwise they would've been listed)...


Here's what my "steering control double tap" scrollable menu looks like (pulled it off the emulator -- all other shots are from my Streak.

Attached Thumbnails My new CarPC Project - Honeycomb Here I Come-screen_20120419_2316.jpg   My new CarPC Project - Honeycomb Here I Come-screen_20120419_2318.jpg   My new CarPC Project - Honeycomb Here I Come-device-2012-04-19-234849.jpg  

Thread Tools
Search this Thread
Rate This Thread
Rate This Thread:
You have already rated this thread Rating: Thread Rating: 0 votes,  average.

Quick Reply: My new CarPC Project - Honeycomb Here I Come



All times are GMT -5. The time now is 11:14 PM.