wgrube/microbridge

Shell Example

Opened this issue · 11 comments

What steps will reproduce the problem?
1. Running Shell Example, uploaded to Uno with Oleg's USB HS
2. Open Serial Monitor at 57600 baud, and carriage return
3. Type ls. press send.

What is the expected output? What do you see instead?
I expected to see a list of files and directories
.
..
/bin
/root
/etc

What I see instead is..
$ Shell not openl
l: permission denied
$ 

What version of the product are you using? On what operating system?
I tried on Ubunto 10.4, and Windows XP. Same operation.

Please provide any additional information below.

Arduino Uno,
Oleg's USB Host Shield
Logcat example works on windows side, but not with Ubuntu.

Original issue reported on code.google.com by chrisisi...@gmail.com on 1 Jul 2011 at 8:31

root your device..

Original comment by sanctuar...@gmail.com on 5 Jul 2011 at 2:18

same problem, and the device is already rooted, when plugged into ubuntu, adb 
shell can return all the directories in response to ls.
U8800 with circuits@home USB host shield

Original comment by jingle.y...@gmail.com on 25 Jul 2011 at 2:05

Same problem. Device (G1 1.6) is rooted. Adb from ubuntu shell works as 
expected. Arduino Uno, Oleg's USB Shield. 

Tracked the problem to an incorrect assumption in the loop of the example. It 
assumes that the only valid value that it should see for shell->status is 
ADB_OPEN, but it can see others, and does see ADB_WRITING after sending the 
first character. 

If you look at the original error report, you can see that it is complaining 
that "l" cannot be executed because it does not have execute permissions.

In the loop function of the example, immediately after the Serial.read() call, 
loop on poll as long as the status is one of the "busy" flavors:

    while (shell->status == ADB_RECEIVING || shell->status == ADB_WRITING) {
      ADB::poll();
    }


Original comment by dennis.p...@gmail.com on 18 Sep 2011 at 1:32

Part of my last comment was not clear. The reason for the permission denied 
message in the original description is that the "l" from the "ls" command was 
sent and interpreted by the shell on the Android side as a command. As I 
experimented with line ending settings on the "serial monitor" in the Adruino 
studio and with details of sending I observed this happening. The sequence was:

1. The 'l' was read by Serial.read()
2. The shell->write call worked
3. The ADB::poll() at the end of the loop function occurred before the Android 
sent the "okay" message, so the shell connection was still in state ADB_WRITING.
4. The loop ran again, before the Android "okay" arrived. The "s" was read by 
the Serial.read() call. 
5. The shell->write was not attempted because the shell->status value was 
ADB_WRITING instead of ADB_OPEN. This meant that the "s" character was lost.
6. The ADB::poll() at the end of the loop was called, and the "okay" message 
was processed, setting the status to ADB_OPEN when it was done.
7. The loop was entered again, and the newline was read by Serial.read(). 
8. The newline was sent, so the shell on Android tried to execute the command 
'l' and received the permission denied.

The moral of this story is that Adruino code must be written with an awareness 
of the fact that the processing model is a form of single threaded cooperative 
multitasking based on an event model. When you write code in this model, you 
must always consider how your code interacts with the even system and all the 
states and event listeners. You must ensure that any event listeners that 
provide services to your loop function get the opportunity to run, which means 
you need to ensure that the even source gets filled.


Original comment by dennis.p...@gmail.com on 18 Sep 2011 at 3:50

Sorry for the slightly out-of-scope question but did anyone get the shell 
example to run on the Duemilanove? I manage to upload the app to the arduino 
but then keep getting: Shell not openl (not even l: permission denied).

Also: my android device (HTC Hero 1.5) is not rooted, is that really required 
for microbridge to work? Do you guys know why? 

Cheers

Original comment by mister...@gmail.com on 21 Sep 2011 at 4:12

I Running Shell Example, uploaded to DFRduino with arduino ADK shield for 
android and i getting: Shell not openl.
but i try to modify Shell Example loop to be like this:

void loop()
{
  byte ch;

  // Check for incoming serial data
  if (Serial.available() > 0)
  {
    // read the incoming byte:
    ch = Serial.read();

    // Write to shell
    if (shell->status == ADB_OPEN)
      shell->writeString("ls\n");
    else
      Serial.print("Shell not open");

  }

  // Poll the ADB subsystem.
  ADB::poll();
}

it's works every time i press send any character and i see a list of files and 
directories.

i am using huawei ideos s7


Original comment by jodyzach...@gmail.com on 3 Oct 2011 at 4:40

We had the same issues with an Arduino Uno and a Host Shield.

attached is our working solution.
We tried many different approaches, this was the only one that worked

#include <SPI.h>
#include <Adb.h>

Connection * shell;

// Event handler for the shell connection. 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t 
length, uint8_t * data)
{
  int i;

  if (event == ADB_CONNECTION_RECEIVE)
    for (i=0; i<length; i++)
      Serial.print(data[i]);

}

void setup()
{

  // Initialise serial port
  Serial.begin(57600);

  // Initialise the ADB subsystem.  
  ADB::init();

  // Open an ADB stream to the phone's shell. Auto-reconnect
  shell = ADB::addConnection("shell:", true, adbEventHandler);  

}

void loop()
{
  ADB::poll();
  byte ch;

  // Check for incoming serial data
  if (Serial.available() > 0)
  {
    // read the incoming byte:
    ch = Serial.read();

    // Write to shell
    if (shell->status == ADB_OPEN)
      shell->write(1, &ch);
    else
      Serial.print("Shell not open");

  }

  // Poll the ADB subsystem.
  while(shell->status == ADB_RECEIVING || shell->status == ADB_WRITING) 
  {    
    ADB::poll();
  }
}

Original comment by Matthias...@gmail.com on 10 Nov 2011 at 8:19

Hallo,

using MEGA ADK, Arduino 1.0 and LG Optimus One, ADB library from 
http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip


The solution from Matthias works beautifully.

I just have a problem with the echo char from ADB, it is printed as a number 
instead of a char.
I replaced

      Serial.print(data[i]);

with

      Serial.print((char)data[i]);

and I have the correct display.
Wonder why you never had this issue, I guess Arduino 1.0 libraries?



Original comment by antonio....@gmail.com on 4 Apr 2012 at 4:52

Hi guys ,

Trying to get a usb host connection on a arduino pro mini 3.3v from sparkfun 
coupled with Oleg's usb host mini.

The usb shell returns "shell not open" to both the default implementation 
provided
in the adb library (from here : 
http://labs.arduino.cc/uploads/ADK/GettingStarted/arduino_bundle_ADB.zip) and 
Matthias's version as well.

I've spent 2 nights trying to pin this down... 
I've also tried to run some other basic examples such as 
http://mitchtech.net/android-arduino-usb-host-simple-digital-input/

But cannot establish a connection between my device and the arduino.
if you have any advice, i'd appreciate it.

Kind regards,
arie


Original comment by arie.co...@gmail.com on 7 Mar 2013 at 10:34

Hi guys,
same as arie said. The problem is that still says shell not open and if I try 
to force to execute shell->write(1, &ch); without the if condition, it returns 
-1.

Any suggestion? 

Original comment by marco.br...@gmail.com on 27 May 2014 at 5:07

Solution for android >4.2 here:

http://forum.arduino.cc/index.php?topic=243029.0

hope it helps!

Original comment by marco.br...@gmail.com on 27 May 2014 at 9:30