Added a GPIO to power on/off for external I2C sensor(s) (with LEDs)

Dependencies:   UniGraphic mbed vt100

18-Jun-2018 外部センサの電源オン・オフ機能は下位互換の為に無効になっていました。 この版で再度有効にしました。

Committer:
Rhyme
Date:
Fri Apr 13 04:19:23 2018 +0000
Revision:
0:846e2321c637
power to color sensor on/off test OK. Currently the function is disabled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:846e2321c637 1 #include "mbed.h"
Rhyme 0:846e2321c637 2 #include "edge_time.h"
Rhyme 0:846e2321c637 3
Rhyme 0:846e2321c637 4 static const uint8_t daysInMonth[12] = {
Rhyme 0:846e2321c637 5 31, 28, 31, 30,
Rhyme 0:846e2321c637 6 31, 30, 31, 31,
Rhyme 0:846e2321c637 7 30, 31, 30, 31
Rhyme 0:846e2321c637 8 } ;
Rhyme 0:846e2321c637 9
Rhyme 0:846e2321c637 10 const char *nameOfDay[7] = {
Rhyme 0:846e2321c637 11 "Sunday", "Monday", "Tuesday", "Wednesday",
Rhyme 0:846e2321c637 12 "Thursday", "Friday", "Saturday"
Rhyme 0:846e2321c637 13 } ;
Rhyme 0:846e2321c637 14
Rhyme 0:846e2321c637 15 uint32_t edge_time = 0 ;
Rhyme 0:846e2321c637 16 uint32_t utc_offset = 9 * 60 * 60 ;
Rhyme 0:846e2321c637 17 tm current_time ;
Rhyme 0:846e2321c637 18 Ticker *tokei = 0 ;
Rhyme 0:846e2321c637 19
Rhyme 0:846e2321c637 20 void inc_sec(void)
Rhyme 0:846e2321c637 21 {
Rhyme 0:846e2321c637 22 __disable_irq() ; // Disable Interrupts
Rhyme 0:846e2321c637 23 edge_time++ ;
Rhyme 0:846e2321c637 24 __enable_irq() ; // Enable Interrupts
Rhyme 0:846e2321c637 25 }
Rhyme 0:846e2321c637 26
Rhyme 0:846e2321c637 27 void init_timer(void)
Rhyme 0:846e2321c637 28 {
Rhyme 0:846e2321c637 29 tokei = new Ticker() ;
Rhyme 0:846e2321c637 30 tokei->attach(inc_sec, 1.0) ;
Rhyme 0:846e2321c637 31 }
Rhyme 0:846e2321c637 32
Rhyme 0:846e2321c637 33 void set_time(const uint16_t valueLen, const uint8_t *value)
Rhyme 0:846e2321c637 34 {
Rhyme 0:846e2321c637 35 uint32_t tmp_timestamp = 0 ;
Rhyme 0:846e2321c637 36 for (int i = 0 ; i < valueLen ; i++ ) {
Rhyme 0:846e2321c637 37 tmp_timestamp |= (value[i] & 0xFF) << (i * 8) ;
Rhyme 0:846e2321c637 38 }
Rhyme 0:846e2321c637 39 edge_time = tmp_timestamp ;
Rhyme 0:846e2321c637 40 ts2tm(edge_time, &current_time) ;
Rhyme 0:846e2321c637 41 // ts2time(edge_time, &current_time) ;
Rhyme 0:846e2321c637 42 }
Rhyme 0:846e2321c637 43
Rhyme 0:846e2321c637 44 void ts2time(uint32_t timestamp, struct tm *tm)
Rhyme 0:846e2321c637 45 {
Rhyme 0:846e2321c637 46 uint32_t seconds, minutes, hours, days, month, year ;
Rhyme 0:846e2321c637 47 uint32_t dayOfWeek ;
Rhyme 0:846e2321c637 48
Rhyme 0:846e2321c637 49 // timestamp += (3600 * 9) ; /* +9 hours for JST */
Rhyme 0:846e2321c637 50 timestamp += utc_offset ;
Rhyme 0:846e2321c637 51
Rhyme 0:846e2321c637 52 seconds = timestamp % 60 ;
Rhyme 0:846e2321c637 53 minutes = timestamp / 60 ;
Rhyme 0:846e2321c637 54 hours = minutes / 60 ; /* +9 for JST */
Rhyme 0:846e2321c637 55 minutes -= hours * 60 ;
Rhyme 0:846e2321c637 56 days = hours / 24 ;
Rhyme 0:846e2321c637 57 hours -= days * 24 ;
Rhyme 0:846e2321c637 58
Rhyme 0:846e2321c637 59 tm->tm_sec = seconds ;
Rhyme 0:846e2321c637 60 tm->tm_min = minutes ;
Rhyme 0:846e2321c637 61 tm->tm_hour = hours ;
Rhyme 0:846e2321c637 62 tm->tm_mday = days + 1 ;
Rhyme 0:846e2321c637 63 // tm->tm_mon = month ;
Rhyme 0:846e2321c637 64 // tm->tm_year = year ;
Rhyme 0:846e2321c637 65 // tm->tm_wday = dayOfWeek ;
Rhyme 0:846e2321c637 66 }
Rhyme 0:846e2321c637 67
Rhyme 0:846e2321c637 68 void ts2tm(uint32_t timestamp, struct tm *tm)
Rhyme 0:846e2321c637 69 {
Rhyme 0:846e2321c637 70 uint32_t seconds, minutes, hours, days, month, year ;
Rhyme 0:846e2321c637 71 uint32_t dayOfWeek ;
Rhyme 0:846e2321c637 72
Rhyme 0:846e2321c637 73 // timestamp += (3600 * 9) ; /* +9 hours for JST */
Rhyme 0:846e2321c637 74 timestamp += utc_offset ;
Rhyme 0:846e2321c637 75
Rhyme 0:846e2321c637 76 seconds = timestamp % 60 ;
Rhyme 0:846e2321c637 77 minutes = timestamp / 60 ;
Rhyme 0:846e2321c637 78 hours = minutes / 60 ; /* +9 for JST */
Rhyme 0:846e2321c637 79 minutes -= hours * 60 ;
Rhyme 0:846e2321c637 80 days = hours / 24 ;
Rhyme 0:846e2321c637 81 hours -= days * 24 ;
Rhyme 0:846e2321c637 82
Rhyme 0:846e2321c637 83 /* Unix timestamp start 1-Jan-1970 Thursday */
Rhyme 0:846e2321c637 84 year = 1970 ;
Rhyme 0:846e2321c637 85 dayOfWeek = 4 ; /* Thursday */
Rhyme 0:846e2321c637 86
Rhyme 0:846e2321c637 87 while(1) {
Rhyme 0:846e2321c637 88 bool isLeapYear =
Rhyme 0:846e2321c637 89 (((year % 4) == 0)
Rhyme 0:846e2321c637 90 &&(((year % 100) != 0)
Rhyme 0:846e2321c637 91 || ((year % 400) == 0))) ;
Rhyme 0:846e2321c637 92 uint16_t daysInYear = isLeapYear ? 366 : 365 ;
Rhyme 0:846e2321c637 93 if (days >= daysInYear) {
Rhyme 0:846e2321c637 94 dayOfWeek += isLeapYear ? 2 : 1 ;
Rhyme 0:846e2321c637 95 days -= daysInYear ;
Rhyme 0:846e2321c637 96 if (dayOfWeek >= 7) {
Rhyme 0:846e2321c637 97 dayOfWeek -= 7 ;
Rhyme 0:846e2321c637 98 }
Rhyme 0:846e2321c637 99 year++ ;
Rhyme 0:846e2321c637 100 } else {
Rhyme 0:846e2321c637 101 tm->tm_yday = days ;
Rhyme 0:846e2321c637 102 dayOfWeek += days ;
Rhyme 0:846e2321c637 103 dayOfWeek %= 7 ;
Rhyme 0:846e2321c637 104
Rhyme 0:846e2321c637 105 /* calc the month and the day */
Rhyme 0:846e2321c637 106 for (month = 0 ; month < 12 ; month++) {
Rhyme 0:846e2321c637 107 uint8_t dim = daysInMonth[month] ;
Rhyme 0:846e2321c637 108
Rhyme 0:846e2321c637 109 /* add a day to feburary if this is a leap year */
Rhyme 0:846e2321c637 110 if ((month == 1) && (isLeapYear)) {
Rhyme 0:846e2321c637 111 dim++ ;
Rhyme 0:846e2321c637 112 }
Rhyme 0:846e2321c637 113
Rhyme 0:846e2321c637 114 if (days >= dim) {
Rhyme 0:846e2321c637 115 days -= dim ;
Rhyme 0:846e2321c637 116 } else {
Rhyme 0:846e2321c637 117 break ;
Rhyme 0:846e2321c637 118 }
Rhyme 0:846e2321c637 119 }
Rhyme 0:846e2321c637 120 break ;
Rhyme 0:846e2321c637 121 }
Rhyme 0:846e2321c637 122 }
Rhyme 0:846e2321c637 123 tm->tm_sec = seconds ;
Rhyme 0:846e2321c637 124 tm->tm_min = minutes ;
Rhyme 0:846e2321c637 125 tm->tm_hour = hours ;
Rhyme 0:846e2321c637 126 tm->tm_mday = days + 1 ;
Rhyme 0:846e2321c637 127 tm->tm_mon = month ;
Rhyme 0:846e2321c637 128 tm->tm_year = year ;
Rhyme 0:846e2321c637 129 tm->tm_wday = dayOfWeek ;
Rhyme 0:846e2321c637 130 }
Rhyme 0:846e2321c637 131
Rhyme 0:846e2321c637 132 void print_time(struct tm *tm)
Rhyme 0:846e2321c637 133 {
Rhyme 0:846e2321c637 134 printf("%02d:%02d:%02d",
Rhyme 0:846e2321c637 135 tm->tm_hour,
Rhyme 0:846e2321c637 136 tm->tm_min,
Rhyme 0:846e2321c637 137 tm->tm_sec ) ;
Rhyme 0:846e2321c637 138 }
Rhyme 0:846e2321c637 139
Rhyme 0:846e2321c637 140 void print_time(uint32_t thetime)
Rhyme 0:846e2321c637 141 {
Rhyme 0:846e2321c637 142 struct tm timestruct ;
Rhyme 0:846e2321c637 143 ts2time(thetime, &timestruct) ;
Rhyme 0:846e2321c637 144 print_time(&timestruct) ;
Rhyme 0:846e2321c637 145 }
Rhyme 0:846e2321c637 146
Rhyme 0:846e2321c637 147 void print_time(void)
Rhyme 0:846e2321c637 148 {
Rhyme 0:846e2321c637 149 struct tm timestruct ;
Rhyme 0:846e2321c637 150 ts2time(edge_time, &timestruct) ;
Rhyme 0:846e2321c637 151 print_time(&timestruct) ;
Rhyme 0:846e2321c637 152 }
Rhyme 0:846e2321c637 153
Rhyme 0:846e2321c637 154 void print_date(struct tm *tm)
Rhyme 0:846e2321c637 155 {
Rhyme 0:846e2321c637 156 printf("%d/%d/%d %02d:%02d:%02d",
Rhyme 0:846e2321c637 157 tm->tm_year,
Rhyme 0:846e2321c637 158 tm->tm_mon + 1,
Rhyme 0:846e2321c637 159 tm->tm_mday,
Rhyme 0:846e2321c637 160 tm->tm_hour,
Rhyme 0:846e2321c637 161 tm->tm_min,
Rhyme 0:846e2321c637 162 tm->tm_sec
Rhyme 0:846e2321c637 163 ) ;
Rhyme 0:846e2321c637 164 }
Rhyme 0:846e2321c637 165
Rhyme 0:846e2321c637 166 void print_date_wd(struct tm *tm)
Rhyme 0:846e2321c637 167 {
Rhyme 0:846e2321c637 168 printf("%d/%d/%d %02d:%02d:%02d (%s)",
Rhyme 0:846e2321c637 169 tm->tm_year,
Rhyme 0:846e2321c637 170 tm->tm_mon + 1,
Rhyme 0:846e2321c637 171 tm->tm_mday,
Rhyme 0:846e2321c637 172 tm->tm_hour,
Rhyme 0:846e2321c637 173 tm->tm_min,
Rhyme 0:846e2321c637 174 tm->tm_sec,
Rhyme 0:846e2321c637 175 nameOfDay[tm->tm_wday]
Rhyme 0:846e2321c637 176 ) ;
Rhyme 0:846e2321c637 177 }
Rhyme 0:846e2321c637 178
Rhyme 0:846e2321c637 179 void time2str(struct tm *tm, char *timestr)
Rhyme 0:846e2321c637 180 {
Rhyme 0:846e2321c637 181 sprintf(timestr, "%02d:%02d:%02d",
Rhyme 0:846e2321c637 182 tm->tm_hour,
Rhyme 0:846e2321c637 183 tm->tm_min,
Rhyme 0:846e2321c637 184 tm->tm_sec ) ;
Rhyme 0:846e2321c637 185 }
Rhyme 0:846e2321c637 186
Rhyme 0:846e2321c637 187 void time2str(char *timestr)
Rhyme 0:846e2321c637 188 {
Rhyme 0:846e2321c637 189 struct tm timestruct ;
Rhyme 0:846e2321c637 190 ts2time(edge_time, &timestruct) ;
Rhyme 0:846e2321c637 191 time2str(&timestruct, timestr) ;
Rhyme 0:846e2321c637 192 }
Rhyme 0:846e2321c637 193
Rhyme 0:846e2321c637 194 int32_t time2seq(uint32_t timestamp)
Rhyme 0:846e2321c637 195 {
Rhyme 0:846e2321c637 196 struct tm timestruct ;
Rhyme 0:846e2321c637 197 int32_t result ;
Rhyme 0:846e2321c637 198 ts2time(timestamp, &timestruct) ;
Rhyme 0:846e2321c637 199 result = timestruct.tm_hour * 10000
Rhyme 0:846e2321c637 200 + timestruct.tm_min * 100
Rhyme 0:846e2321c637 201 + timestruct.tm_sec ;
Rhyme 0:846e2321c637 202 return(result) ;
Rhyme 0:846e2321c637 203 }
Rhyme 0:846e2321c637 204
Rhyme 0:846e2321c637 205 void time2seq(uint32_t timestamp, char *timestr)
Rhyme 0:846e2321c637 206 {
Rhyme 0:846e2321c637 207 struct tm timestruct ;
Rhyme 0:846e2321c637 208 ts2tm(timestamp, &timestruct) ;
Rhyme 0:846e2321c637 209 sprintf(timestr, "%d%02d%02d%02d%02d%02d",
Rhyme 0:846e2321c637 210 timestruct.tm_year,
Rhyme 0:846e2321c637 211 timestruct.tm_mon + 1,
Rhyme 0:846e2321c637 212 timestruct.tm_mday,
Rhyme 0:846e2321c637 213 timestruct.tm_hour,
Rhyme 0:846e2321c637 214 timestruct.tm_min,
Rhyme 0:846e2321c637 215 timestruct.tm_sec
Rhyme 0:846e2321c637 216 ) ;
Rhyme 0:846e2321c637 217 }
Rhyme 0:846e2321c637 218
Rhyme 0:846e2321c637 219 void time2date(struct tm *tm, char *datestr)
Rhyme 0:846e2321c637 220 {
Rhyme 0:846e2321c637 221 sprintf(datestr, "%d/%d/%d %02d:%02d:%02d (%s)",
Rhyme 0:846e2321c637 222 tm->tm_year,
Rhyme 0:846e2321c637 223 tm->tm_mon + 1,
Rhyme 0:846e2321c637 224 tm->tm_mday,
Rhyme 0:846e2321c637 225 tm->tm_hour,
Rhyme 0:846e2321c637 226 tm->tm_min,
Rhyme 0:846e2321c637 227 tm->tm_sec,
Rhyme 0:846e2321c637 228 nameOfDay[tm->tm_wday]
Rhyme 0:846e2321c637 229 ) ;
Rhyme 0:846e2321c637 230 }