Alessandro Angelino / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
screamer
Date:
Wed Mar 30 16:23:44 2016 +0000
Revision:
0:4a2e5f0422d6
Child:
2:5f044fef8f98
Initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 """
screamer 0:4a2e5f0422d6 2 mbed SDK
screamer 0:4a2e5f0422d6 3 Copyright (c) 2011-2013 ARM Limited
screamer 0:4a2e5f0422d6 4
screamer 0:4a2e5f0422d6 5 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:4a2e5f0422d6 6 you may not use this file except in compliance with the License.
screamer 0:4a2e5f0422d6 7 You may obtain a copy of the License at
screamer 0:4a2e5f0422d6 8
screamer 0:4a2e5f0422d6 9 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:4a2e5f0422d6 10
screamer 0:4a2e5f0422d6 11 Unless required by applicable law or agreed to in writing, software
screamer 0:4a2e5f0422d6 12 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:4a2e5f0422d6 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:4a2e5f0422d6 14 See the License for the specific language governing permissions and
screamer 0:4a2e5f0422d6 15 limitations under the License.
screamer 0:4a2e5f0422d6 16 """
screamer 0:4a2e5f0422d6 17
screamer 0:4a2e5f0422d6 18 # Check if 'serial' module is installed
screamer 0:4a2e5f0422d6 19 try:
screamer 0:4a2e5f0422d6 20 from serial import Serial
screamer 0:4a2e5f0422d6 21 except ImportError, e:
screamer 0:4a2e5f0422d6 22 print "Error: Can't import 'serial' module: %s"% e
screamer 0:4a2e5f0422d6 23 exit(-1)
screamer 0:4a2e5f0422d6 24
screamer 0:4a2e5f0422d6 25 import os
screamer 0:4a2e5f0422d6 26 import re
screamer 0:4a2e5f0422d6 27 import types
screamer 0:4a2e5f0422d6 28 from sys import stdout
screamer 0:4a2e5f0422d6 29 from time import sleep, time
screamer 0:4a2e5f0422d6 30 from optparse import OptionParser
screamer 0:4a2e5f0422d6 31
screamer 0:4a2e5f0422d6 32 import host_tests_plugins
screamer 0:4a2e5f0422d6 33
screamer 0:4a2e5f0422d6 34 # This is a little tricky. We need to add upper directory to path so
screamer 0:4a2e5f0422d6 35 # we can find packages we want from the same level as other files do
screamer 0:4a2e5f0422d6 36 import sys
screamer 0:4a2e5f0422d6 37 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))
screamer 0:4a2e5f0422d6 38 from workspace_tools.test_api import get_autodetected_MUTS_list
screamer 0:4a2e5f0422d6 39 from workspace_tools.test_api import get_module_avail
screamer 0:4a2e5f0422d6 40
screamer 0:4a2e5f0422d6 41
screamer 0:4a2e5f0422d6 42 class Mbed:
screamer 0:4a2e5f0422d6 43 """ Base class for a host driven test
screamer 0:4a2e5f0422d6 44 """
screamer 0:4a2e5f0422d6 45 def __init__(self):
screamer 0:4a2e5f0422d6 46 parser = OptionParser()
screamer 0:4a2e5f0422d6 47
screamer 0:4a2e5f0422d6 48 parser.add_option("-m", "--micro",
screamer 0:4a2e5f0422d6 49 dest="micro",
screamer 0:4a2e5f0422d6 50 help="The target microcontroller",
screamer 0:4a2e5f0422d6 51 metavar="MICRO")
screamer 0:4a2e5f0422d6 52
screamer 0:4a2e5f0422d6 53 parser.add_option("-p", "--port",
screamer 0:4a2e5f0422d6 54 dest="port",
screamer 0:4a2e5f0422d6 55 help="The serial port of the target mbed",
screamer 0:4a2e5f0422d6 56 metavar="PORT")
screamer 0:4a2e5f0422d6 57
screamer 0:4a2e5f0422d6 58 parser.add_option("-d", "--disk",
screamer 0:4a2e5f0422d6 59 dest="disk",
screamer 0:4a2e5f0422d6 60 help="The target disk path",
screamer 0:4a2e5f0422d6 61 metavar="DISK_PATH")
screamer 0:4a2e5f0422d6 62
screamer 0:4a2e5f0422d6 63 parser.add_option("-f", "--image-path",
screamer 0:4a2e5f0422d6 64 dest="image_path",
screamer 0:4a2e5f0422d6 65 help="Path with target's image",
screamer 0:4a2e5f0422d6 66 metavar="IMAGE_PATH")
screamer 0:4a2e5f0422d6 67
screamer 0:4a2e5f0422d6 68 parser.add_option("-c", "--copy",
screamer 0:4a2e5f0422d6 69 dest="copy_method",
screamer 0:4a2e5f0422d6 70 help="Copy method selector",
screamer 0:4a2e5f0422d6 71 metavar="COPY_METHOD")
screamer 0:4a2e5f0422d6 72
screamer 0:4a2e5f0422d6 73 parser.add_option("-C", "--program_cycle_s",
screamer 0:4a2e5f0422d6 74 dest="program_cycle_s",
screamer 0:4a2e5f0422d6 75 help="Program cycle sleep. Define how many seconds you want wait after copying bianry onto target",
screamer 0:4a2e5f0422d6 76 type="float",
screamer 0:4a2e5f0422d6 77 metavar="COPY_METHOD")
screamer 0:4a2e5f0422d6 78
screamer 0:4a2e5f0422d6 79 parser.add_option("-t", "--timeout",
screamer 0:4a2e5f0422d6 80 dest="timeout",
screamer 0:4a2e5f0422d6 81 help="Timeout",
screamer 0:4a2e5f0422d6 82 metavar="TIMEOUT")
screamer 0:4a2e5f0422d6 83
screamer 0:4a2e5f0422d6 84 parser.add_option("-r", "--reset",
screamer 0:4a2e5f0422d6 85 dest="forced_reset_type",
screamer 0:4a2e5f0422d6 86 help="Forces different type of reset")
screamer 0:4a2e5f0422d6 87
screamer 0:4a2e5f0422d6 88 parser.add_option("-R", "--reset-timeout",
screamer 0:4a2e5f0422d6 89 dest="forced_reset_timeout",
screamer 0:4a2e5f0422d6 90 metavar="NUMBER",
screamer 0:4a2e5f0422d6 91 type="int",
screamer 0:4a2e5f0422d6 92 help="When forcing a reset using option -r you can set up after reset timeout in seconds")
screamer 0:4a2e5f0422d6 93
screamer 0:4a2e5f0422d6 94 parser.add_option('', '--auto',
screamer 0:4a2e5f0422d6 95 dest='auto_detect',
screamer 0:4a2e5f0422d6 96 metavar=False,
screamer 0:4a2e5f0422d6 97 action="store_true",
screamer 0:4a2e5f0422d6 98 help='Use mbed-ls module to detect all connected mbed devices')
screamer 0:4a2e5f0422d6 99
screamer 0:4a2e5f0422d6 100 (self.options, _) = parser.parse_args()
screamer 0:4a2e5f0422d6 101
screamer 0:4a2e5f0422d6 102 self.DEFAULT_RESET_TOUT = 0
screamer 0:4a2e5f0422d6 103 self.DEFAULT_TOUT = 10
screamer 0:4a2e5f0422d6 104
screamer 0:4a2e5f0422d6 105 if self.options.port is None:
screamer 0:4a2e5f0422d6 106 raise Exception("The serial port of the target mbed have to be provided as command line arguments")
screamer 0:4a2e5f0422d6 107
screamer 0:4a2e5f0422d6 108 # Options related to copy / reset mbed device
screamer 0:4a2e5f0422d6 109 self.port = self.options.port
screamer 0:4a2e5f0422d6 110 self.disk = self.options.disk
screamer 0:4a2e5f0422d6 111 self.image_path = self.options.image_path.strip('"')
screamer 0:4a2e5f0422d6 112 self.copy_method = self.options.copy_method
screamer 0:4a2e5f0422d6 113 self.program_cycle_s = float(self.options.program_cycle_s)
screamer 0:4a2e5f0422d6 114
screamer 0:4a2e5f0422d6 115 self.serial = None
screamer 0:4a2e5f0422d6 116 self.serial_baud = 9600
screamer 0:4a2e5f0422d6 117 self.serial_timeout = 1
screamer 0:4a2e5f0422d6 118
screamer 0:4a2e5f0422d6 119 self.timeout = self.DEFAULT_TOUT if self.options.timeout is None else self.options.timeout
screamer 0:4a2e5f0422d6 120 print 'MBED: Instrumentation: "%s" and disk: "%s"' % (self.port, self.disk)
screamer 0:4a2e5f0422d6 121
screamer 0:4a2e5f0422d6 122 def init_serial_params(self, serial_baud=9600, serial_timeout=1):
screamer 0:4a2e5f0422d6 123 """ Initialize port parameters.
screamer 0:4a2e5f0422d6 124 This parameters will be used by self.init_serial() function to open serial port
screamer 0:4a2e5f0422d6 125 """
screamer 0:4a2e5f0422d6 126 self.serial_baud = serial_baud
screamer 0:4a2e5f0422d6 127 self.serial_timeout = serial_timeout
screamer 0:4a2e5f0422d6 128
screamer 0:4a2e5f0422d6 129 def init_serial(self, serial_baud=None, serial_timeout=None):
screamer 0:4a2e5f0422d6 130 """ Initialize serial port.
screamer 0:4a2e5f0422d6 131 Function will return error is port can't be opened or initialized
screamer 0:4a2e5f0422d6 132 """
screamer 0:4a2e5f0422d6 133 # Overload serial port configuration from default to parameters' values if they are specified
screamer 0:4a2e5f0422d6 134 serial_baud = serial_baud if serial_baud is not None else self.serial_baud
screamer 0:4a2e5f0422d6 135 serial_timeout = serial_timeout if serial_timeout is not None else self.serial_timeout
screamer 0:4a2e5f0422d6 136
screamer 0:4a2e5f0422d6 137 if get_module_avail('mbed_lstools') and self.options.auto_detect:
screamer 0:4a2e5f0422d6 138 # Ensure serial port is up-to-date (try to find it 60 times)
screamer 0:4a2e5f0422d6 139 found = False
screamer 0:4a2e5f0422d6 140
screamer 0:4a2e5f0422d6 141 for i in range(0, 60):
screamer 0:4a2e5f0422d6 142 print('Looking for %s with MBEDLS' % self.options.micro)
screamer 0:4a2e5f0422d6 143 muts_list = get_autodetected_MUTS_list(platform_name_filter=[self.options.micro])
screamer 0:4a2e5f0422d6 144
screamer 0:4a2e5f0422d6 145 if 1 in muts_list:
screamer 0:4a2e5f0422d6 146 mut = muts_list[1]
screamer 0:4a2e5f0422d6 147 self.port = mut['port']
screamer 0:4a2e5f0422d6 148 found = True
screamer 0:4a2e5f0422d6 149 break
screamer 0:4a2e5f0422d6 150 else:
screamer 0:4a2e5f0422d6 151 sleep(3)
screamer 0:4a2e5f0422d6 152
screamer 0:4a2e5f0422d6 153 if not found:
screamer 0:4a2e5f0422d6 154 return False
screamer 0:4a2e5f0422d6 155
screamer 0:4a2e5f0422d6 156 # Clear serial port
screamer 0:4a2e5f0422d6 157 if self.serial:
screamer 0:4a2e5f0422d6 158 self.serial.close()
screamer 0:4a2e5f0422d6 159 self.serial = None
screamer 0:4a2e5f0422d6 160
screamer 0:4a2e5f0422d6 161 # We will pool for serial to be re-mounted if it was unmounted after device reset
screamer 0:4a2e5f0422d6 162 result = self.pool_for_serial_init(serial_baud, serial_timeout) # Blocking
screamer 0:4a2e5f0422d6 163
screamer 0:4a2e5f0422d6 164 # Port can be opened
screamer 0:4a2e5f0422d6 165 if result:
screamer 0:4a2e5f0422d6 166 self.flush()
screamer 0:4a2e5f0422d6 167 return result
screamer 0:4a2e5f0422d6 168
screamer 0:4a2e5f0422d6 169 def pool_for_serial_init(self, serial_baud, serial_timeout, pooling_loops=40, init_delay=0.5, loop_delay=0.25):
screamer 0:4a2e5f0422d6 170 """ Functions pools for serial port readiness
screamer 0:4a2e5f0422d6 171 """
screamer 0:4a2e5f0422d6 172 result = True
screamer 0:4a2e5f0422d6 173 last_error = None
screamer 0:4a2e5f0422d6 174 # This loop is used to check for serial port availability due to
screamer 0:4a2e5f0422d6 175 # some delays and remounting when devices are being flashed with new software.
screamer 0:4a2e5f0422d6 176 for i in range(pooling_loops):
screamer 0:4a2e5f0422d6 177 sleep(loop_delay if i else init_delay)
screamer 0:4a2e5f0422d6 178 try:
screamer 0:4a2e5f0422d6 179 self.serial = Serial(self.port, baudrate=serial_baud, timeout=serial_timeout)
screamer 0:4a2e5f0422d6 180 except Exception as e:
screamer 0:4a2e5f0422d6 181 result = False
screamer 0:4a2e5f0422d6 182 last_error = "MBED: %s"% str(e)
screamer 0:4a2e5f0422d6 183 stdout.write('.')
screamer 0:4a2e5f0422d6 184 stdout.flush()
screamer 0:4a2e5f0422d6 185 else:
screamer 0:4a2e5f0422d6 186 print "...port ready!"
screamer 0:4a2e5f0422d6 187 result = True
screamer 0:4a2e5f0422d6 188 break
screamer 0:4a2e5f0422d6 189 if not result and last_error:
screamer 0:4a2e5f0422d6 190 print last_error
screamer 0:4a2e5f0422d6 191 return result
screamer 0:4a2e5f0422d6 192
screamer 0:4a2e5f0422d6 193 def set_serial_timeout(self, timeout):
screamer 0:4a2e5f0422d6 194 """ Wraps self.mbed.serial object timeout property
screamer 0:4a2e5f0422d6 195 """
screamer 0:4a2e5f0422d6 196 result = None
screamer 0:4a2e5f0422d6 197 if self.serial:
screamer 0:4a2e5f0422d6 198 self.serial.timeout = timeout
screamer 0:4a2e5f0422d6 199 result = True
screamer 0:4a2e5f0422d6 200 return result
screamer 0:4a2e5f0422d6 201
screamer 0:4a2e5f0422d6 202 def serial_read(self, count=1):
screamer 0:4a2e5f0422d6 203 """ Wraps self.mbed.serial object read method
screamer 0:4a2e5f0422d6 204 """
screamer 0:4a2e5f0422d6 205 result = None
screamer 0:4a2e5f0422d6 206 if self.serial:
screamer 0:4a2e5f0422d6 207 try:
screamer 0:4a2e5f0422d6 208 result = self.serial.read(count)
screamer 0:4a2e5f0422d6 209 except:
screamer 0:4a2e5f0422d6 210 result = None
screamer 0:4a2e5f0422d6 211 return result
screamer 0:4a2e5f0422d6 212
screamer 0:4a2e5f0422d6 213 def serial_readline(self, timeout=5):
screamer 0:4a2e5f0422d6 214 """ Wraps self.mbed.serial object read method to read one line from serial port
screamer 0:4a2e5f0422d6 215 """
screamer 0:4a2e5f0422d6 216 result = ''
screamer 0:4a2e5f0422d6 217 start = time()
screamer 0:4a2e5f0422d6 218 while (time() - start) < timeout:
screamer 0:4a2e5f0422d6 219 if self.serial:
screamer 0:4a2e5f0422d6 220 try:
screamer 0:4a2e5f0422d6 221 c = self.serial.read(1)
screamer 0:4a2e5f0422d6 222 result += c
screamer 0:4a2e5f0422d6 223 except Exception as e:
screamer 0:4a2e5f0422d6 224 print "MBED: %s"% str(e)
screamer 0:4a2e5f0422d6 225 result = None
screamer 0:4a2e5f0422d6 226 break
screamer 0:4a2e5f0422d6 227 if c == '\n':
screamer 0:4a2e5f0422d6 228 break
screamer 0:4a2e5f0422d6 229 return result
screamer 0:4a2e5f0422d6 230
screamer 0:4a2e5f0422d6 231 def serial_write(self, write_buffer):
screamer 0:4a2e5f0422d6 232 """ Wraps self.mbed.serial object write method
screamer 0:4a2e5f0422d6 233 """
screamer 0:4a2e5f0422d6 234 result = None
screamer 0:4a2e5f0422d6 235 if self.serial:
screamer 0:4a2e5f0422d6 236 try:
screamer 0:4a2e5f0422d6 237 result = self.serial.write(write_buffer)
screamer 0:4a2e5f0422d6 238 except:
screamer 0:4a2e5f0422d6 239 result = None
screamer 0:4a2e5f0422d6 240 return result
screamer 0:4a2e5f0422d6 241
screamer 0:4a2e5f0422d6 242 def reset_timeout(self, timeout):
screamer 0:4a2e5f0422d6 243 """ Timeout executed just after reset command is issued
screamer 0:4a2e5f0422d6 244 """
screamer 0:4a2e5f0422d6 245 for n in range(0, timeout):
screamer 0:4a2e5f0422d6 246 sleep(1)
screamer 0:4a2e5f0422d6 247
screamer 0:4a2e5f0422d6 248 def reset(self):
screamer 0:4a2e5f0422d6 249 """ Calls proper reset plugin to do the job.
screamer 0:4a2e5f0422d6 250 Please refer to host_test_plugins functionality
screamer 0:4a2e5f0422d6 251 """
screamer 0:4a2e5f0422d6 252 # Flush serials to get only input after reset
screamer 0:4a2e5f0422d6 253 self.flush()
screamer 0:4a2e5f0422d6 254 if self.options.forced_reset_type:
screamer 0:4a2e5f0422d6 255 result = host_tests_plugins.call_plugin('ResetMethod', self.options.forced_reset_type, disk=self.disk)
screamer 0:4a2e5f0422d6 256 else:
screamer 0:4a2e5f0422d6 257 result = host_tests_plugins.call_plugin('ResetMethod', 'default', serial=self.serial)
screamer 0:4a2e5f0422d6 258 # Give time to wait for the image loading
screamer 0:4a2e5f0422d6 259 reset_tout_s = self.options.forced_reset_timeout if self.options.forced_reset_timeout is not None else self.DEFAULT_RESET_TOUT
screamer 0:4a2e5f0422d6 260 self.reset_timeout(reset_tout_s)
screamer 0:4a2e5f0422d6 261 return result
screamer 0:4a2e5f0422d6 262
screamer 0:4a2e5f0422d6 263 def copy_image(self, image_path=None, disk=None, copy_method=None):
screamer 0:4a2e5f0422d6 264 """ Closure for copy_image_raw() method.
screamer 0:4a2e5f0422d6 265 Method which is actually copying image to mbed
screamer 0:4a2e5f0422d6 266 """
screamer 0:4a2e5f0422d6 267 # Set closure environment
screamer 0:4a2e5f0422d6 268 image_path = image_path if image_path is not None else self.image_path
screamer 0:4a2e5f0422d6 269 disk = disk if disk is not None else self.disk
screamer 0:4a2e5f0422d6 270 copy_method = copy_method if copy_method is not None else self.copy_method
screamer 0:4a2e5f0422d6 271 # Call proper copy method
screamer 0:4a2e5f0422d6 272 result = self.copy_image_raw(image_path, disk, copy_method)
screamer 0:4a2e5f0422d6 273 return result
screamer 0:4a2e5f0422d6 274
screamer 0:4a2e5f0422d6 275 def copy_image_raw(self, image_path=None, disk=None, copy_method=None):
screamer 0:4a2e5f0422d6 276 """ Copy file depending on method you want to use. Handles exception
screamer 0:4a2e5f0422d6 277 and return code from shell copy commands.
screamer 0:4a2e5f0422d6 278 """
screamer 0:4a2e5f0422d6 279 # image_path - Where is binary with target's firmware
screamer 0:4a2e5f0422d6 280 if copy_method is not None:
screamer 0:4a2e5f0422d6 281 # We override 'default' method with 'shell' method
screamer 0:4a2e5f0422d6 282 if copy_method == 'default':
screamer 0:4a2e5f0422d6 283 copy_method = 'shell'
screamer 0:4a2e5f0422d6 284 else:
screamer 0:4a2e5f0422d6 285 copy_method = 'shell'
screamer 0:4a2e5f0422d6 286
screamer 0:4a2e5f0422d6 287 result = host_tests_plugins.call_plugin('CopyMethod', copy_method, image_path=image_path, destination_disk=disk, program_cycle_s=self.program_cycle_s, target_mcu=self.options.micro)
screamer 0:4a2e5f0422d6 288 return result;
screamer 0:4a2e5f0422d6 289
screamer 0:4a2e5f0422d6 290 def flush(self):
screamer 0:4a2e5f0422d6 291 """ Flush serial ports
screamer 0:4a2e5f0422d6 292 """
screamer 0:4a2e5f0422d6 293 result = False
screamer 0:4a2e5f0422d6 294 if self.serial:
screamer 0:4a2e5f0422d6 295 self.serial.flushInput()
screamer 0:4a2e5f0422d6 296 self.serial.flushOutput()
screamer 0:4a2e5f0422d6 297 result = True
screamer 0:4a2e5f0422d6 298 return result
screamer 0:4a2e5f0422d6 299
screamer 0:4a2e5f0422d6 300
screamer 0:4a2e5f0422d6 301 class HostTestResults:
screamer 0:4a2e5f0422d6 302 """ Test results set by host tests
screamer 0:4a2e5f0422d6 303 """
screamer 0:4a2e5f0422d6 304 def __init__(self):
screamer 0:4a2e5f0422d6 305 self.RESULT_SUCCESS = 'success'
screamer 0:4a2e5f0422d6 306 self.RESULT_FAILURE = 'failure'
screamer 0:4a2e5f0422d6 307 self.RESULT_ERROR = 'error'
screamer 0:4a2e5f0422d6 308 self.RESULT_IO_SERIAL = 'ioerr_serial'
screamer 0:4a2e5f0422d6 309 self.RESULT_NO_IMAGE = 'no_image'
screamer 0:4a2e5f0422d6 310 self.RESULT_IOERR_COPY = "ioerr_copy"
screamer 0:4a2e5f0422d6 311 self.RESULT_PASSIVE = "passive"
screamer 0:4a2e5f0422d6 312 self.RESULT_NOT_DETECTED = "not_detected"
screamer 0:4a2e5f0422d6 313 self.RESULT_MBED_ASSERT = "mbed_assert"
screamer 0:4a2e5f0422d6 314
screamer 0:4a2e5f0422d6 315
screamer 0:4a2e5f0422d6 316 import workspace_tools.host_tests as host_tests
screamer 0:4a2e5f0422d6 317
screamer 0:4a2e5f0422d6 318
screamer 0:4a2e5f0422d6 319 class Test(HostTestResults):
screamer 0:4a2e5f0422d6 320 """ Base class for host test's test runner
screamer 0:4a2e5f0422d6 321 """
screamer 0:4a2e5f0422d6 322 # Select default host_test supervision (replaced after autodetection)
screamer 0:4a2e5f0422d6 323 test_supervisor = host_tests.get_host_test("default")
screamer 0:4a2e5f0422d6 324
screamer 0:4a2e5f0422d6 325 def __init__(self):
screamer 0:4a2e5f0422d6 326 self.mbed = Mbed()
screamer 0:4a2e5f0422d6 327
screamer 0:4a2e5f0422d6 328 def detect_test_config(self, verbose=False):
screamer 0:4a2e5f0422d6 329 """ Detects test case configuration
screamer 0:4a2e5f0422d6 330 """
screamer 0:4a2e5f0422d6 331 result = {}
screamer 0:4a2e5f0422d6 332 while True:
screamer 0:4a2e5f0422d6 333 line = self.mbed.serial_readline()
screamer 0:4a2e5f0422d6 334 if "{start}" in line:
screamer 0:4a2e5f0422d6 335 self.notify("HOST: Start test...")
screamer 0:4a2e5f0422d6 336 break
screamer 0:4a2e5f0422d6 337 else:
screamer 0:4a2e5f0422d6 338 # Detect if this is property from TEST_ENV print
screamer 0:4a2e5f0422d6 339 m = re.search('{([\w_]+);([\w\d\+ ]+)}}', line[:-1])
screamer 0:4a2e5f0422d6 340 if m and len(m.groups()) == 2:
screamer 0:4a2e5f0422d6 341 # This is most likely auto-detection property
screamer 0:4a2e5f0422d6 342 result[m.group(1)] = m.group(2)
screamer 0:4a2e5f0422d6 343 if verbose:
screamer 0:4a2e5f0422d6 344 self.notify("HOST: Property '%s' = '%s'"% (m.group(1), m.group(2)))
screamer 0:4a2e5f0422d6 345 else:
screamer 0:4a2e5f0422d6 346 # We can check if this is TArget Id in mbed specific format
screamer 0:4a2e5f0422d6 347 m2 = re.search('^([\$]+)([a-fA-F0-9]+)', line[:-1])
screamer 0:4a2e5f0422d6 348 if m2 and len(m2.groups()) == 2:
screamer 0:4a2e5f0422d6 349 if verbose:
screamer 0:4a2e5f0422d6 350 target_id = m2.group(1) + m2.group(2)
screamer 0:4a2e5f0422d6 351 self.notify("HOST: TargetID '%s'"% target_id)
screamer 0:4a2e5f0422d6 352 self.notify(line[len(target_id):-1])
screamer 0:4a2e5f0422d6 353 else:
screamer 0:4a2e5f0422d6 354 self.notify("HOST: Unknown property: %s"% line.strip())
screamer 0:4a2e5f0422d6 355 return result
screamer 0:4a2e5f0422d6 356
screamer 0:4a2e5f0422d6 357 def run(self):
screamer 0:4a2e5f0422d6 358 """ Test runner for host test. This function will start executing
screamer 0:4a2e5f0422d6 359 test and forward test result via serial port to test suite
screamer 0:4a2e5f0422d6 360 """
screamer 0:4a2e5f0422d6 361 # Copy image to device
screamer 0:4a2e5f0422d6 362 self.notify("HOST: Copy image onto target...")
screamer 0:4a2e5f0422d6 363 result = self.mbed.copy_image()
screamer 0:4a2e5f0422d6 364 if not result:
screamer 0:4a2e5f0422d6 365 self.print_result(self.RESULT_IOERR_COPY)
screamer 0:4a2e5f0422d6 366
screamer 0:4a2e5f0422d6 367 # Initialize and open target's serial port (console)
screamer 0:4a2e5f0422d6 368 self.notify("HOST: Initialize serial port...")
screamer 0:4a2e5f0422d6 369 result = self.mbed.init_serial()
screamer 0:4a2e5f0422d6 370 if not result:
screamer 0:4a2e5f0422d6 371 self.print_result(self.RESULT_IO_SERIAL)
screamer 0:4a2e5f0422d6 372
screamer 0:4a2e5f0422d6 373 # Reset device
screamer 0:4a2e5f0422d6 374 self.notify("HOST: Reset target...")
screamer 0:4a2e5f0422d6 375 result = self.mbed.reset()
screamer 0:4a2e5f0422d6 376 if not result:
screamer 0:4a2e5f0422d6 377 self.print_result(self.RESULT_IO_SERIAL)
screamer 0:4a2e5f0422d6 378
screamer 0:4a2e5f0422d6 379 # Run test
screamer 0:4a2e5f0422d6 380 try:
screamer 0:4a2e5f0422d6 381 CONFIG = self.detect_test_config(verbose=True) # print CONFIG
screamer 0:4a2e5f0422d6 382
screamer 0:4a2e5f0422d6 383 if "host_test_name" in CONFIG:
screamer 0:4a2e5f0422d6 384 if host_tests.is_host_test(CONFIG["host_test_name"]):
screamer 0:4a2e5f0422d6 385 self.test_supervisor = host_tests.get_host_test(CONFIG["host_test_name"])
screamer 0:4a2e5f0422d6 386 result = self.test_supervisor.test(self) #result = self.test()
screamer 0:4a2e5f0422d6 387
screamer 0:4a2e5f0422d6 388 if result is not None:
screamer 0:4a2e5f0422d6 389 self.print_result(result)
screamer 0:4a2e5f0422d6 390 else:
screamer 0:4a2e5f0422d6 391 self.notify("HOST: Passive mode...")
screamer 0:4a2e5f0422d6 392 except Exception, e:
screamer 0:4a2e5f0422d6 393 print str(e)
screamer 0:4a2e5f0422d6 394 self.print_result(self.RESULT_ERROR)
screamer 0:4a2e5f0422d6 395
screamer 0:4a2e5f0422d6 396 def setup(self):
screamer 0:4a2e5f0422d6 397 """ Setup and check if configuration for test is
screamer 0:4a2e5f0422d6 398 correct. E.g. if serial port can be opened.
screamer 0:4a2e5f0422d6 399 """
screamer 0:4a2e5f0422d6 400 result = True
screamer 0:4a2e5f0422d6 401 if not self.mbed.serial:
screamer 0:4a2e5f0422d6 402 result = False
screamer 0:4a2e5f0422d6 403 self.print_result(self.RESULT_IO_SERIAL)
screamer 0:4a2e5f0422d6 404 return result
screamer 0:4a2e5f0422d6 405
screamer 0:4a2e5f0422d6 406 def notify(self, message):
screamer 0:4a2e5f0422d6 407 """ On screen notification function
screamer 0:4a2e5f0422d6 408 """
screamer 0:4a2e5f0422d6 409 print message
screamer 0:4a2e5f0422d6 410 stdout.flush()
screamer 0:4a2e5f0422d6 411
screamer 0:4a2e5f0422d6 412 def print_result(self, result):
screamer 0:4a2e5f0422d6 413 """ Test result unified printing function
screamer 0:4a2e5f0422d6 414 """
screamer 0:4a2e5f0422d6 415 self.notify("\r\n{{%s}}\r\n{{end}}" % result)
screamer 0:4a2e5f0422d6 416
screamer 0:4a2e5f0422d6 417
screamer 0:4a2e5f0422d6 418 class DefaultTestSelector(Test):
screamer 0:4a2e5f0422d6 419 """ Test class with serial port initialization
screamer 0:4a2e5f0422d6 420 """
screamer 0:4a2e5f0422d6 421 def __init__(self):
screamer 0:4a2e5f0422d6 422 HostTestResults.__init__(self)
screamer 0:4a2e5f0422d6 423 Test.__init__(self)
screamer 0:4a2e5f0422d6 424
screamer 0:4a2e5f0422d6 425 if __name__ == '__main__':
screamer 0:4a2e5f0422d6 426 DefaultTestSelector().run()