takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

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