Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

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 from mbed_host_tests import BaseHostTest
kadonotakashi 0:8fdf9a60065b 19 import time
kadonotakashi 0:8fdf9a60065b 20 import calendar
kadonotakashi 0:8fdf9a60065b 21 import datetime
kadonotakashi 0:8fdf9a60065b 22
kadonotakashi 0:8fdf9a60065b 23 class RTC_time_calc_test(BaseHostTest):
kadonotakashi 0:8fdf9a60065b 24 """
kadonotakashi 0:8fdf9a60065b 25 This is the host part of the test to verify if:
kadonotakashi 0:8fdf9a60065b 26 - _rtc_mktime function converts a calendar time into time since UNIX epoch as a time_t,
kadonotakashi 0:8fdf9a60065b 27 - _rtc_localtime function converts a given time in seconds since epoch into calendar time.
kadonotakashi 0:8fdf9a60065b 28
kadonotakashi 0:8fdf9a60065b 29 The same algoritm to generate next calendar time to be tested is used by both parts of the test.
kadonotakashi 0:8fdf9a60065b 30 We will check if correct time since UNIX epoch is calculated for the first and the last day
kadonotakashi 0:8fdf9a60065b 31 of each month and across valid years.
kadonotakashi 0:8fdf9a60065b 32
kadonotakashi 0:8fdf9a60065b 33 Mbed part of the test sends calculated time since UNIX epoch.
kadonotakashi 0:8fdf9a60065b 34 This part validates given value and responds to indicate pass or fail.
kadonotakashi 0:8fdf9a60065b 35 Additionally it sends also encoded day of week and day of year which
kadonotakashi 0:8fdf9a60065b 36 will be needed to verify _rtc_localtime.
kadonotakashi 0:8fdf9a60065b 37
kadonotakashi 0:8fdf9a60065b 38 Support for both types of RTC devices is provided:
kadonotakashi 0:8fdf9a60065b 39 - RTCs which handles all leap years in the mentioned year range correctly. Leap year is determined by checking if
kadonotakashi 0:8fdf9a60065b 40 the year counter value is divisible by 400, 100, and 4. No problem here.
kadonotakashi 0:8fdf9a60065b 41 - RTCs which handles leap years correctly up to 2100. The RTC does a simple bit comparison to see if the two
kadonotakashi 0:8fdf9a60065b 42 lowest order bits of the year counter are zero. In this case 2100 year will be considered
kadonotakashi 0:8fdf9a60065b 43 incorrectly as a leap year, so the last valid point in time will be 28.02.2100 23:59:59 and next day will be
kadonotakashi 0:8fdf9a60065b 44 29.02.2100 (invalid). So after 28.02.2100 the day counter will be off by a day.
kadonotakashi 0:8fdf9a60065b 45
kadonotakashi 0:8fdf9a60065b 46 """
kadonotakashi 0:8fdf9a60065b 47
kadonotakashi 0:8fdf9a60065b 48 edge_date = datetime.datetime(2100, 2, 28, 0, 0, 0)
kadonotakashi 0:8fdf9a60065b 49
kadonotakashi 0:8fdf9a60065b 50 # Test the following years:
kadonotakashi 0:8fdf9a60065b 51 # - first - 1970
kadonotakashi 0:8fdf9a60065b 52 # - example not leap year (not divisible by 4)
kadonotakashi 0:8fdf9a60065b 53 # - example leap year (divisible by 4 and by 100 and by 400)
kadonotakashi 0:8fdf9a60065b 54 # - example leap year (divisible by 4 and not by 100)
kadonotakashi 0:8fdf9a60065b 55 # - example not leap year (divisible by 4 and by 100)
kadonotakashi 0:8fdf9a60065b 56 # - last fully supported - 2105
kadonotakashi 0:8fdf9a60065b 57 years = [1970, 1971, 2000, 2096, 2100, 2105]
kadonotakashi 0:8fdf9a60065b 58 year_id = 0
kadonotakashi 0:8fdf9a60065b 59
kadonotakashi 0:8fdf9a60065b 60
kadonotakashi 0:8fdf9a60065b 61
kadonotakashi 0:8fdf9a60065b 62 full_leap_year_support = False
kadonotakashi 0:8fdf9a60065b 63
kadonotakashi 0:8fdf9a60065b 64 RTC_FULL_LEAP_YEAR_SUPPORT = 0
kadonotakashi 0:8fdf9a60065b 65 RTC_PARTIAL_LEAP_YEAR_SUPPORT = 1
kadonotakashi 0:8fdf9a60065b 66
kadonotakashi 0:8fdf9a60065b 67 def _set_leap_year_support(self, key, value, timestamp):
kadonotakashi 0:8fdf9a60065b 68 if (int(value) == self.RTC_FULL_LEAP_YEAR_SUPPORT):
kadonotakashi 0:8fdf9a60065b 69 self.full_leap_year_support = True
kadonotakashi 0:8fdf9a60065b 70 else:
kadonotakashi 0:8fdf9a60065b 71 self.full_leap_year_support = False
kadonotakashi 0:8fdf9a60065b 72
kadonotakashi 0:8fdf9a60065b 73 self.first = True
kadonotakashi 0:8fdf9a60065b 74 self.date = datetime.datetime(1970, 1, 1, 23, 0, 0)
kadonotakashi 0:8fdf9a60065b 75 self.year_id = 0
kadonotakashi 0:8fdf9a60065b 76
kadonotakashi 0:8fdf9a60065b 77 def _verify_timestamp(self, key, value, timestamp):
kadonotakashi 0:8fdf9a60065b 78 # week day in python is counted from sunday(0) and on mbed side week day is counted from monday(0).
kadonotakashi 0:8fdf9a60065b 79 # year day in python is counted from 1 and on mbed side year day is counted from 0.
kadonotakashi 0:8fdf9a60065b 80 week_day = ((self.date.timetuple().tm_wday + 1) % 7)
kadonotakashi 0:8fdf9a60065b 81 year_day = self.date.timetuple().tm_yday - 1
kadonotakashi 0:8fdf9a60065b 82
kadonotakashi 0:8fdf9a60065b 83 # Fix for RTC which not have full leap year support.
kadonotakashi 0:8fdf9a60065b 84 if (not self.full_leap_year_support):
kadonotakashi 0:8fdf9a60065b 85 if self.date >= self.edge_date:
kadonotakashi 0:8fdf9a60065b 86 # After 28.02.2100 we should be one day off - add this day and store original
kadonotakashi 0:8fdf9a60065b 87 date_org = self.date
kadonotakashi 0:8fdf9a60065b 88 self.date += datetime.timedelta(days = 1)
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 # Adjust week day.
kadonotakashi 0:8fdf9a60065b 91 week_day = ((self.date.timetuple().tm_wday + 1) % 7)
kadonotakashi 0:8fdf9a60065b 92
kadonotakashi 0:8fdf9a60065b 93 # Adjust year day.
kadonotakashi 0:8fdf9a60065b 94 if (self.date.year == 2100):
kadonotakashi 0:8fdf9a60065b 95 year_day = self.date.timetuple().tm_yday - 1
kadonotakashi 0:8fdf9a60065b 96 else:
kadonotakashi 0:8fdf9a60065b 97 year_day = date_org.timetuple().tm_yday - 1
kadonotakashi 0:8fdf9a60065b 98
kadonotakashi 0:8fdf9a60065b 99 # Last day in year
kadonotakashi 0:8fdf9a60065b 100 if (self.date.month == 1 and self.date.day == 1):
kadonotakashi 0:8fdf9a60065b 101 if (self.date.year == 2101):
kadonotakashi 0:8fdf9a60065b 102 # Exception for year 2100 - ivalid handled by RTC without full leap year support
kadonotakashi 0:8fdf9a60065b 103 year_day = 365
kadonotakashi 0:8fdf9a60065b 104 else:
kadonotakashi 0:8fdf9a60065b 105 year_day = date_org.timetuple().tm_yday - 1
kadonotakashi 0:8fdf9a60065b 106
kadonotakashi 0:8fdf9a60065b 107 t = (self.date.year , self.date.month, self.date.day, self.date.hour, self.date.minute, self.date.second, 0, 0, 0)
kadonotakashi 0:8fdf9a60065b 108
kadonotakashi 0:8fdf9a60065b 109 expected_timestamp = calendar.timegm(t)
kadonotakashi 0:8fdf9a60065b 110 actual_timestamp = int(value) & 0xffffffff # convert to unsigned int
kadonotakashi 0:8fdf9a60065b 111
kadonotakashi 0:8fdf9a60065b 112 # encode week day and year day in the response
kadonotakashi 0:8fdf9a60065b 113 response = (week_day << 16) | year_day
kadonotakashi 0:8fdf9a60065b 114
kadonotakashi 0:8fdf9a60065b 115 if (actual_timestamp == expected_timestamp):
kadonotakashi 0:8fdf9a60065b 116 # response contains encoded week day and year day
kadonotakashi 0:8fdf9a60065b 117 self.send_kv("passed", str(response))
kadonotakashi 0:8fdf9a60065b 118 else:
kadonotakashi 0:8fdf9a60065b 119 self.send_kv("failed", 0)
kadonotakashi 0:8fdf9a60065b 120 print "expected = %d, result = %d" % (expected_timestamp , actual_timestamp)
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 # calculate next date
kadonotakashi 0:8fdf9a60065b 123 if (self.first):
kadonotakashi 0:8fdf9a60065b 124 days_range = calendar.monthrange(self.date.year, self.date.month)
kadonotakashi 0:8fdf9a60065b 125 self.date = self.date.replace(day = days_range[1], minute = 59, second = 59)
kadonotakashi 0:8fdf9a60065b 126 self.first = not self.first
kadonotakashi 0:8fdf9a60065b 127 else:
kadonotakashi 0:8fdf9a60065b 128 self.date += datetime.timedelta(days = 1)
kadonotakashi 0:8fdf9a60065b 129 if (self.date.month == 1):
kadonotakashi 0:8fdf9a60065b 130 self.year_id += 1
kadonotakashi 0:8fdf9a60065b 131 if (len(self.years) == self.year_id):
kadonotakashi 0:8fdf9a60065b 132 # All years were processed, no need to calc next date
kadonotakashi 0:8fdf9a60065b 133 return
kadonotakashi 0:8fdf9a60065b 134 self.date = self.date.replace(year = self.years[self.year_id])
kadonotakashi 0:8fdf9a60065b 135 self.date = self.date.replace(day = 1, minute = 0, second = 0)
kadonotakashi 0:8fdf9a60065b 136 self.first = not self.first
kadonotakashi 0:8fdf9a60065b 137
kadonotakashi 0:8fdf9a60065b 138 def setup(self):
kadonotakashi 0:8fdf9a60065b 139 self.register_callback('timestamp', self._verify_timestamp)
kadonotakashi 0:8fdf9a60065b 140 self.register_callback('leap_year_setup', self._set_leap_year_support)