mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

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