Welcome to EQ2430/EQ2440 Android Lecture - a crash course in Android March 22, 2011 Per Zetterberg School of Electrical Engineering 1 The project course goes Android! Features used in our projects: • • • • • • • • Display : plots and text. Microphone. Loudspeaker. Magnetometer measurements. WiFi RSSI measurements. Send data using WiFi. Accelerometers. Touch screen. Cool! 2 FrameWork • FrameWork is a java project (program) in Eclipse. • FrameWork is a Android 2.2 project that runs (at least) on HTC Desire. • FrameWork is a generic skeleton which can be used as the starting point for many student projects (including yours!). • FrameWork has an object StudentCode which is where you implement your prototype. • Application name: StudentFrameWork (Change this) • Creators: Martin Ohlsson and Per Zetterberg 3 FrameWork: User interface PlotView: Graphs and/or Camera picture TextView: Textual output. 4 StudentCode (i.e your code) Parameters: useSensors, loggingOn, useMessaging, messageServer, processInterval, introText, messageGroups, StudentMessage (class) useSensors (bitfield): “xor” the following GPS,CAMERA,SOUND_OUT,SOUND_IN,WIFI_SCAN, ACCELEROMETER,MAGNETIC_FIELD,PROXIMITY,TIME_SYNC , PROXIMITY,LIGHT,SOUND_IN,CAMERA 5 Called by StudentCode sound_out(short[] buffer, int length): Send data to DAC=>loudspeaker. message_out(StudentMessage message): Send message to all the other phones. message_out(StudentMessage message, String groupIdString): Send message to the phones in group defined by “groupIdString. streaming_buffer_out(short[] buffer, int length, String groupIdString): Send buffer of int16 to the phones in group defined by “groupIdString. set_output_text(String text): Set the text too be displayed in TextView. plot_data(Canvas plotCanvas, int width, int height): Make a drawing in PlotView. plot_camera_image(Canvas plotCanvas, byte[] image, int imageWidth,int imageHeight, int width, int height): Display a camera image in PlotView. write_string_on_logfile(String): No ”\n” or ”;”. 6 All are inputs except plot_data! You fill these functions with code! Defined by StudentCode: Called by FrameWork init(): Do all your initialization. process(), Periodic processing message_in(…) Received message from other phone. gps(…) …… position estimate magnetic_field(…) …… magnetic field measurement light(…) : …. Light intensity (lux) event (trigger when changed) proximity(…): Proximity state event (trigger when changed) accelerometer(…) accelerometer measurement sound_in(…) … sound input samples wifi_ap(…) ... signal strength of surrounding WiFi APs screen_touched(…) position event streaming_sound_in(…) buffer of samples (int16) received from other phone camera_image(…) image received from camera 7 Threads (internals) “Parent thread”: Indirectly calls init(). studentProcessThread: Calls process(). ipListenerThread: Calls message_in() guiTriggerThread: Renders what you provide with set_output_text() and plot_data(). t1: Calls sound_in(…) wifiScanThread: calls wifi_ap(…) ipSoundListenerThread: calls streaming_buffer_in FrameWork implements OnRecordPositionUpdateListener: Calls gps() FrameWork implements SensorEventListener accelerometer(), magnetic_field(), light(), proximity() FrameWork extends Activity: sreen_touched() streaming_sound_in(…) buffer of samples (int16) sent from other phone 8 How communication between phones works 1(2) • A Linux computer connected to internet acts as a server (the address of which is given by messageServer). • When FrameWork starts, it contacts the server and asks for the ip adress of one of the other phones in the project (a projec t is defined by the projectName string e.g. ”yellow”). • The phone the contacts that phone and get a list of all other phones in the project. • When one phone calls message_out(message) the message is sent to all other phones. • The other phones receives the message through a call of message_in (”callback”). • The message is of type StudentMessage and contains the fields that you decide. 9 How communication between phones work 2(2) • Second form of message_out: message_out(message, groupIdString) • Where groupIdString defines a group of users e.g. ”data_receivers” which should receive the message. • Which groups exist ? You define the groups with the ”messageGroups” parameters. • When FrameWork starts, it asks the user which group the phone belongs to. • When sending buffers of int16 use the following version: streaming_buffer_out(buffer,length, groupIdString) • This data is received through: streaming_buffer_in( buffer, int length, senderId) 10 How to use communication between phones • • • • • • • • • Set useMessaging = true; If you need groups: String temp[] = {"MICROPHONE","SPEAKER"}; messageGroups = temp; Otherwise: messageGroups = null; messageServerType = LINUX_MESSAGE_SERVER; messageServer = "192.168.0.68"; Define StudentMessage. Which message group do this phone belong to ?: messageGroups[myGroupID] 11 Logging on file • loggingOn = true; • Creates a measurement file called sensorlogYYYYMMDDHHMM.csv on the SDCARD. • Copy file to PC-harddisc (matlab command): copy_file_from_sdcard_to_working_directory.m • Obtain the data from the log-file into matlab: get_log_data_from_FrameWork.m • Extract data from some certain sensors: extract_acceloremeter_from_log_data.m, extract_sound_from_log_data.m, extract_magnetic_from_log_data.m • Other sensors: Do it yourself. 12 Test harness Purpose: Test implementation of math-intensive functions/algorithms in an isolated and repeatable way. Method: Run your matlab- and java- (with android environment) implementations side by side with exactly the same input . How? • Matlab produces data, and pushes it on the sdcard • FrameWork includes a function called ”test_harness()”. • Inside this function the data can be read from the sdcard, All, non-trivial functions should be tested like this. the function to be tested is called, and the results are saved on the sdcard. • Matlab then pulls the data from sdcard. • Finally, the results from the matlab- and java-implementation are compared. What do I need to do ? The example test_harness_example.m shows how to automate the process. This code can be used as a starting point, however, you need to customize the code to the function you are going to test. 13 State-machine and functions int State=START; public void process() { { Functions that can be tested against matlab implementation switch(State) { case START: res1=func1(arg1,arg2); res2=func2(signal1); State=WAITIING; break; case WAITING: sync=func3(arg1,res2); if (sync) {State=RUNNING; transmit(signal2)} else {State=WAITING; transmit(signal1)}; break; case RUNNING: ..... Example of debugging } write_string_on_logfile("State="+State); method. } 14 Assignments 1. Write letter ”A” and ”B” in plot_data. 2. Switch between the letters of your name every two seconds. 3. Send a dot between two phones i.e. one user pushes the screen on one phone, and a dot appears on the other users screen on the place where the user put her/his finger. 4. Record sound and play it again – but delayed 10 seconds. 5. Record sound on one phone and play it on the other. 6. Make a test-harness for a non-trivial algorithm which is relevant for your project. Deadline : April 11. 15 Downloading FrameWork Go to EQ2430 web => project, android and usrp support => Android support Download: FrameWork_empty.zip ”Empty” because most StudentCode functions are empty …. or almost empty. Unzip and move the code to workspace directory. Do “file->import->”existing project into workspace”-> 16 Tips • • • • • Start command line prompt in windows 7: press windows_button+”r”, then run “cmd.exe”. The tool “adb” is located at C:\android-sdkwindows\tools\ Android software developers kit: http://developer.android.com/sdk/index.html Killing tasks. Download and install “Advanced Task Killer Free (ATKF)”. To kill e.g. “StudentFrameWork” open ATFK press “StudentFrameWork” until a new menu appears where you can select “Kill” Error message: “ActivityManager: Warning: Activity not started, its current task has been brought to the front” => Change a single line in the source files code and try again. 17 Now Lets start! 18