fholin fholin / Mbed 2 deprecated MiniMousetest

Dependencies:   mbed

Committer:
fholin
Date:
Mon Dec 18 16:31:11 2017 +0000
Revision:
1:eda561b01daf
Parent:
0:2325d1d28df3
inline with github repository : ; https://github.com/LoRaWanMiniMouse/Mini-Mouse.git

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fholin 0:2325d1d28df3 1 /*
fholin 0:2325d1d28df3 2
fholin 0:2325d1d28df3 3 __ __ _ _
fholin 0:2325d1d28df3 4 | \/ (_) (_)
fholin 0:2325d1d28df3 5 | \ / |_ _ __ _ _ __ ___ ___ _ _ ___ ___
fholin 0:2325d1d28df3 6 | |\/| | | '_ \| | '_ ` _ \ / _ \| | | / __|/ _ \
fholin 0:2325d1d28df3 7 | | | | | | | | | | | | | | (_) | |_| \__ \ __/
fholin 0:2325d1d28df3 8 |_| |_|_|_| |_|_|_| |_| |_|\___/ \__,_|___/\___|
fholin 0:2325d1d28df3 9
fholin 0:2325d1d28df3 10
fholin 0:2325d1d28df3 11 Description : Flash Api.
fholin 0:2325d1d28df3 12
fholin 0:2325d1d28df3 13
fholin 0:2325d1d28df3 14 License : Revised BSD License, see LICENSE.TXT file include in the project
fholin 0:2325d1d28df3 15
fholin 0:2325d1d28df3 16 Maintainer : Fabien Holin (SEMTECH)
fholin 0:2325d1d28df3 17 */
fholin 0:2325d1d28df3 18 #ifndef APIRTC_H
fholin 0:2325d1d28df3 19 #define APIRTC_H
fholin 0:2325d1d28df3 20 #include "mbed.h"
fholin 1:eda561b01daf 21 void my_rtc_init ( void ) ;
fholin 1:eda561b01daf 22 uint32_t RtcGetTimeMs ( void ) ;//uint32_t *Seconds, uint16_t * SubSeconds);
fholin 0:2325d1d28df3 23 uint32_t RtcGetTimeSecond( void ) ;//uint32_t *Seconds, uint16_t * SubSeconds);
fholin 0:2325d1d28df3 24 void myrtc_write( time_t t );
fholin 0:2325d1d28df3 25 void mysleep (int time);
fholin 0:2325d1d28df3 26 extern RTC_HandleTypeDef RtcHandle;
fholin 0:2325d1d28df3 27 extern Timer timerglobal ;
fholin 0:2325d1d28df3 28 void TimerLoraInit(void);
fholin 0:2325d1d28df3 29 int GetTime(void);
fholin 0:2325d1d28df3 30 void RtcSetAlarm( void );
fholin 0:2325d1d28df3 31 void RtcGetAlarm( void );
fholin 0:2325d1d28df3 32 void wait_s ( int t );
fholin 1:eda561b01daf 33
fholin 1:eda561b01daf 34
fholin 1:eda561b01daf 35
fholin 1:eda561b01daf 36 /* Specific implementation for STM32 . The following implementation is just to put in place
fholin 1:eda561b01daf 37 a setalarm function as described on the architecture specification of minimouse */
fholin 1:eda561b01daf 38
fholin 1:eda561b01daf 39 #define RTC_INIT_DATE 1
fholin 1:eda561b01daf 40 #define RTC_INIT_MONTH RTC_MONTH_JANUARY
fholin 1:eda561b01daf 41 #define RTC_INIT_YEAR 0
fholin 1:eda561b01daf 42 #define RTC_INIT_WEEKDAY RTC_WEEKDAY_SATURDAY
fholin 1:eda561b01daf 43 #define RTC_INIT_SUBSEC_SECONDS_MINUTES_HOURS 0 /*time at 0:0:0*/
fholin 1:eda561b01daf 44
fholin 1:eda561b01daf 45 #define END_OF_FEBRUARY_LEAP 60 //31+29
fholin 1:eda561b01daf 46 #define END_OF_JULY_LEAP 213 //31+29+...
fholin 1:eda561b01daf 47
fholin 1:eda561b01daf 48 #define END_OF_FEBRUARY_NORM 59 //31+28
fholin 1:eda561b01daf 49 #define END_OF_JULY_NORM 212 //31+28+...
fholin 1:eda561b01daf 50
fholin 1:eda561b01daf 51 #define DIV_1461(X) (( (X)*91867+22750)>>25)
fholin 1:eda561b01daf 52
fholin 1:eda561b01daf 53 #define DIV_APPROX_86400(X) ( ((X)>>18) +( (X)>>17))
fholin 1:eda561b01daf 54
fholin 1:eda561b01daf 55 #define DIV_1461(X) (( (X)*91867+22750)>>25)
fholin 1:eda561b01daf 56
fholin 1:eda561b01daf 57 #define DIV_APPROX_1000(X) ( ((X)>>10) +( (X)>>16) + ( (X)>>17))
fholin 1:eda561b01daf 58
fholin 1:eda561b01daf 59 #define DIV_APPROX_60(X) ( ( (X) *17476 )>>20 )
fholin 1:eda561b01daf 60
fholin 1:eda561b01daf 61 #define DIV_APPROX_61(X) (((X) *68759)>>22)
fholin 1:eda561b01daf 62
fholin 1:eda561b01daf 63 #define MODULO_7(X) ( (X) -(( ( ((X)+1) *299593)>>21)*7))
fholin 1:eda561b01daf 64
fholin 1:eda561b01daf 65 #define DAYS_IN_MONTH_CORRECTION_NORM ((uint32_t) 0x99AAA0 )
fholin 1:eda561b01daf 66 #define DAYS_IN_MONTH_CORRECTION_LEAP ((uint32_t) 0x445550 )
fholin 1:eda561b01daf 67
fholin 1:eda561b01daf 68 #define DAYS_IN_LEAP_YEAR (uint32_t) 366
fholin 1:eda561b01daf 69
fholin 1:eda561b01daf 70 #define DAYS_IN_YEAR (uint32_t) 365
fholin 1:eda561b01daf 71
fholin 1:eda561b01daf 72 #define SECONDS_IN_1DAY (uint32_t) 86400
fholin 1:eda561b01daf 73
fholin 1:eda561b01daf 74 #define SECONDS_IN_1HOUR (uint32_t) 3600
fholin 1:eda561b01daf 75
fholin 1:eda561b01daf 76 #define SECONDS_IN_1MINUTE (uint32_t) 60
fholin 1:eda561b01daf 77
fholin 1:eda561b01daf 78 #define MINUTES_IN_1HOUR (uint32_t) 60
fholin 1:eda561b01daf 79
fholin 1:eda561b01daf 80 #define HOURS_IN_1DAY (uint32_t) 24
fholin 1:eda561b01daf 81
fholin 1:eda561b01daf 82 /* Calculates ceiling(X/N) */
fholin 1:eda561b01daf 83 #define DIVC(X,N) ( ( (X) + (N) -1 ) / (N) )
fholin 1:eda561b01daf 84
fholin 1:eda561b01daf 85 #define DIVC_BY_4(X) ( ( (X) + 3 ) >>2 )
fholin 1:eda561b01daf 86
fholin 1:eda561b01daf 87 #define DIVC_BY_2(X) ( ( (X) + 1 ) >>1 )
fholin 1:eda561b01daf 88
fholin 1:eda561b01daf 89
fholin 1:eda561b01daf 90
fholin 1:eda561b01daf 91 /* subsecond number of bits */
fholin 1:eda561b01daf 92 #define N_PREDIV_S 10
fholin 1:eda561b01daf 93
fholin 1:eda561b01daf 94 /* Synchonuous prediv */
fholin 1:eda561b01daf 95 #define PREDIV_S ((1<<N_PREDIV_S)-1)
fholin 1:eda561b01daf 96
fholin 1:eda561b01daf 97 /* Asynchonuous prediv */
fholin 1:eda561b01daf 98 #define PREDIV_A (1<<(15-N_PREDIV_S))-1
fholin 1:eda561b01daf 99
fholin 1:eda561b01daf 100
fholin 1:eda561b01daf 101
fholin 1:eda561b01daf 102 /* Sub-second mask definition */
fholin 1:eda561b01daf 103 #define HW_RTC_ALARMSUBSECONDMASK N_PREDIV_S<<RTC_ALRMASSR_MASKSS_Pos
fholin 1:eda561b01daf 104
fholin 1:eda561b01daf 105 /* RTC Time base in us */
fholin 1:eda561b01daf 106 #define USEC_NUMBER 1000000
fholin 1:eda561b01daf 107 #define MSEC_NUMBER (USEC_NUMBER/1000)
fholin 1:eda561b01daf 108 #define RTC_ALARM_TIME_BASE (USEC_NUMBER>>N_PREDIV_S)
fholin 1:eda561b01daf 109
fholin 1:eda561b01daf 110 #define COMMON_FACTOR 3
fholin 1:eda561b01daf 111 #define CONV_NUMER (MSEC_NUMBER>>COMMON_FACTOR)
fholin 1:eda561b01daf 112 #define CONV_DENOM (1<<(N_PREDIV_S-COMMON_FACTOR))
fholin 1:eda561b01daf 113
fholin 1:eda561b01daf 114
fholin 1:eda561b01daf 115 __STATIC_INLINE uint32_t cal_div_61( uint32_t in )
fholin 1:eda561b01daf 116 {
fholin 1:eda561b01daf 117 #if 0
fholin 1:eda561b01daf 118 return (in / 61 );
fholin 1:eda561b01daf 119 #else
fholin 1:eda561b01daf 120
fholin 1:eda561b01daf 121 uint32_t out_temp=0;
fholin 1:eda561b01daf 122 uint32_t div_result=DIV_APPROX_61(in);
fholin 1:eda561b01daf 123 while (div_result >=1 )
fholin 1:eda561b01daf 124 {
fholin 1:eda561b01daf 125 out_temp+=div_result;
fholin 1:eda561b01daf 126 in -= div_result*61;
fholin 1:eda561b01daf 127 div_result=DIV_APPROX_61(in);
fholin 1:eda561b01daf 128 }
fholin 1:eda561b01daf 129 if( in>= 61 )
fholin 1:eda561b01daf 130 {
fholin 1:eda561b01daf 131 out_temp+=1;
fholin 1:eda561b01daf 132 in -= 61;
fholin 1:eda561b01daf 133 }
fholin 1:eda561b01daf 134 return out_temp;
fholin 1:eda561b01daf 135 #endif
fholin 1:eda561b01daf 136 }
fholin 1:eda561b01daf 137
fholin 1:eda561b01daf 138 __STATIC_INLINE uint32_t cal_get_month(uint32_t Days, uint32_t year)
fholin 1:eda561b01daf 139 {
fholin 1:eda561b01daf 140 uint32_t month;
fholin 1:eda561b01daf 141 if ( (year%4) ==0 )
fholin 1:eda561b01daf 142 { /*leap year*/
fholin 1:eda561b01daf 143 if ( Days<END_OF_FEBRUARY_LEAP )
fholin 1:eda561b01daf 144 { /*January or february*/
fholin 1:eda561b01daf 145 // month = Days*2/(30+31);
fholin 1:eda561b01daf 146 month = cal_div_61(Days*2);
fholin 1:eda561b01daf 147 }
fholin 1:eda561b01daf 148 else if ( Days<END_OF_JULY_LEAP )
fholin 1:eda561b01daf 149 {
fholin 1:eda561b01daf 150 month = cal_div_61((Days-END_OF_FEBRUARY_LEAP)*2)+2;
fholin 1:eda561b01daf 151 }
fholin 1:eda561b01daf 152 else
fholin 1:eda561b01daf 153 {
fholin 1:eda561b01daf 154 month = cal_div_61((Days-END_OF_JULY_LEAP)*2)+7;
fholin 1:eda561b01daf 155 }
fholin 1:eda561b01daf 156 }
fholin 1:eda561b01daf 157 else
fholin 1:eda561b01daf 158 {
fholin 1:eda561b01daf 159 if ( Days<END_OF_FEBRUARY_NORM )
fholin 1:eda561b01daf 160 { /*January of february*/
fholin 1:eda561b01daf 161 month = cal_div_61(Days*2);
fholin 1:eda561b01daf 162 }
fholin 1:eda561b01daf 163 else if ( Days<END_OF_JULY_NORM )
fholin 1:eda561b01daf 164 {
fholin 1:eda561b01daf 165 month = cal_div_61((Days-END_OF_FEBRUARY_NORM)*2)+2;
fholin 1:eda561b01daf 166 }
fholin 1:eda561b01daf 167 else
fholin 1:eda561b01daf 168 {
fholin 1:eda561b01daf 169 month = cal_div_61((Days-END_OF_JULY_NORM)*2)+7;
fholin 1:eda561b01daf 170 }
fholin 1:eda561b01daf 171 }
fholin 1:eda561b01daf 172 return month;
fholin 1:eda561b01daf 173 }
fholin 1:eda561b01daf 174
fholin 1:eda561b01daf 175 __STATIC_INLINE void cal_div_86400( uint32_t in, uint32_t* out, uint32_t* remainder )
fholin 1:eda561b01daf 176 {
fholin 1:eda561b01daf 177 #if 0
fholin 1:eda561b01daf 178 *remainder= total_nb_seconds % SECONDS_IN_1DAY;
fholin 1:eda561b01daf 179 * nbDays = total_nb_seconds / SECONDS_IN_1DAY;
fholin 1:eda561b01daf 180 #else
fholin 1:eda561b01daf 181
fholin 1:eda561b01daf 182 uint32_t out_temp=0;
fholin 1:eda561b01daf 183 uint32_t div_result=DIV_APPROX_86400(in);
fholin 1:eda561b01daf 184 while (div_result >=1 )
fholin 1:eda561b01daf 185 {
fholin 1:eda561b01daf 186 out_temp+=div_result;
fholin 1:eda561b01daf 187 in -= div_result*86400;
fholin 1:eda561b01daf 188 div_result=DIV_APPROX_86400(in);
fholin 1:eda561b01daf 189 }
fholin 1:eda561b01daf 190 if( in>=86400 )
fholin 1:eda561b01daf 191 {
fholin 1:eda561b01daf 192 out_temp+=1;
fholin 1:eda561b01daf 193 in -= 86400;
fholin 1:eda561b01daf 194 }
fholin 1:eda561b01daf 195
fholin 1:eda561b01daf 196 *remainder = in;
fholin 1:eda561b01daf 197 *out = out_temp;
fholin 1:eda561b01daf 198 #endif
fholin 1:eda561b01daf 199 }
fholin 1:eda561b01daf 200
fholin 1:eda561b01daf 201
fholin 1:eda561b01daf 202
fholin 1:eda561b01daf 203 __STATIC_INLINE void cal_div_1000( uint32_t in, uint32_t* out, uint32_t* remainder )
fholin 1:eda561b01daf 204 {
fholin 1:eda561b01daf 205 #if 0
fholin 1:eda561b01daf 206 *remainder= total_nb_seconds % 1000;
fholin 1:eda561b01daf 207 *out = total_nb_seconds / 1000;
fholin 1:eda561b01daf 208 #else
fholin 1:eda561b01daf 209
fholin 1:eda561b01daf 210 uint32_t out_temp=0;
fholin 1:eda561b01daf 211 uint32_t div_result=DIV_APPROX_1000(in);
fholin 1:eda561b01daf 212 while (div_result >=1 )
fholin 1:eda561b01daf 213 {
fholin 1:eda561b01daf 214 out_temp+=div_result;
fholin 1:eda561b01daf 215 in -= div_result*1000;
fholin 1:eda561b01daf 216 div_result=DIV_APPROX_1000(in);
fholin 1:eda561b01daf 217 }
fholin 1:eda561b01daf 218 if( in>= 1000 )
fholin 1:eda561b01daf 219 {
fholin 1:eda561b01daf 220 out_temp+=1;
fholin 1:eda561b01daf 221 in -= 1000;
fholin 1:eda561b01daf 222 }
fholin 1:eda561b01daf 223 *remainder = in;
fholin 1:eda561b01daf 224 *out = out_temp;
fholin 1:eda561b01daf 225 #endif
fholin 1:eda561b01daf 226 }
fholin 1:eda561b01daf 227
fholin 1:eda561b01daf 228 __STATIC_INLINE void cal_div_60( uint32_t in, uint32_t* out, uint32_t* remainder )
fholin 1:eda561b01daf 229 {
fholin 1:eda561b01daf 230 #if 0
fholin 1:eda561b01daf 231 *remainder= total_nb_seconds % 60;
fholin 1:eda561b01daf 232 *out = total_nb_seconds / 60;
fholin 1:eda561b01daf 233 #else
fholin 1:eda561b01daf 234
fholin 1:eda561b01daf 235 uint32_t out_temp=0;
fholin 1:eda561b01daf 236 uint32_t div_result=DIV_APPROX_60(in);
fholin 1:eda561b01daf 237 while (div_result >=1 )
fholin 1:eda561b01daf 238 {
fholin 1:eda561b01daf 239 out_temp+=div_result;
fholin 1:eda561b01daf 240 in -= div_result*60;
fholin 1:eda561b01daf 241 div_result=DIV_APPROX_60(in);
fholin 1:eda561b01daf 242 }
fholin 1:eda561b01daf 243 if( in>= 60 )
fholin 1:eda561b01daf 244 {
fholin 1:eda561b01daf 245 out_temp+=1;
fholin 1:eda561b01daf 246 in -= 60;
fholin 1:eda561b01daf 247 }
fholin 1:eda561b01daf 248 *remainder = in;
fholin 1:eda561b01daf 249 *out = out_temp;
fholin 1:eda561b01daf 250 #endif
fholin 1:eda561b01daf 251 }
fholin 1:eda561b01daf 252
fholin 1:eda561b01daf 253 __STATIC_INLINE uint64_t cal_convertBCD_2_Cnt64( RTC_DateTypeDef* RTC_DateStruct, RTC_TimeTypeDef* RTC_TimeStruct )
fholin 1:eda561b01daf 254 {
fholin 1:eda561b01daf 255 uint64_t cnt64 = 0;
fholin 1:eda561b01daf 256
fholin 1:eda561b01daf 257 uint32_t nbdays ;
fholin 1:eda561b01daf 258
fholin 1:eda561b01daf 259 uint32_t nbsecs;
fholin 1:eda561b01daf 260
fholin 1:eda561b01daf 261 uint32_t correction_month[4]={DAYS_IN_MONTH_CORRECTION_LEAP,
fholin 1:eda561b01daf 262 DAYS_IN_MONTH_CORRECTION_NORM,
fholin 1:eda561b01daf 263 DAYS_IN_MONTH_CORRECTION_NORM,
fholin 1:eda561b01daf 264 DAYS_IN_MONTH_CORRECTION_NORM};
fholin 1:eda561b01daf 265
fholin 1:eda561b01daf 266 nbdays= DIVC( (DAYS_IN_YEAR*3 + DAYS_IN_LEAP_YEAR)* RTC_DateStruct->Year , 4);
fholin 1:eda561b01daf 267
fholin 1:eda561b01daf 268 nbdays +=( DIVC_BY_2( (RTC_DateStruct->Month-1)*(30+31) ) - (((correction_month[RTC_DateStruct->Year % 4]>> ((RTC_DateStruct->Month-1)*2) )&0x3)));
fholin 1:eda561b01daf 269
fholin 1:eda561b01daf 270 nbdays += (RTC_DateStruct->Date -1);
fholin 1:eda561b01daf 271
fholin 1:eda561b01daf 272 /* convert from days to seconds */
fholin 1:eda561b01daf 273 cnt64 = nbdays* SECONDS_IN_1DAY;
fholin 1:eda561b01daf 274
fholin 1:eda561b01daf 275 nbsecs = ( ( uint32_t )RTC_TimeStruct->Seconds +
fholin 1:eda561b01daf 276 ( ( uint32_t )RTC_TimeStruct->Minutes * SECONDS_IN_1MINUTE ) +
fholin 1:eda561b01daf 277 ( ( uint32_t )RTC_TimeStruct->Hours * SECONDS_IN_1HOUR ) ) ;
fholin 1:eda561b01daf 278
fholin 1:eda561b01daf 279 cnt64 = nbdays * SECONDS_IN_1DAY + nbsecs ;
fholin 1:eda561b01daf 280
fholin 1:eda561b01daf 281 cnt64 = (cnt64<<N_PREDIV_S) + ( RTC_TimeStruct->SubSeconds);
fholin 1:eda561b01daf 282
fholin 1:eda561b01daf 283 return cnt64;
fholin 1:eda561b01daf 284 }
fholin 1:eda561b01daf 285
fholin 1:eda561b01daf 286
fholin 1:eda561b01daf 287
fholin 1:eda561b01daf 288 __STATIC_INLINE void cal_convert_Cnt64_2_Bcd( RTC_DateTypeDef* Date, RTC_TimeTypeDef* Time, uint64_t cnt64 )
fholin 1:eda561b01daf 289 {
fholin 1:eda561b01daf 290 uint32_t correction_month[4]={DAYS_IN_MONTH_CORRECTION_LEAP,
fholin 1:eda561b01daf 291 DAYS_IN_MONTH_CORRECTION_NORM,
fholin 1:eda561b01daf 292 DAYS_IN_MONTH_CORRECTION_NORM,
fholin 1:eda561b01daf 293 DAYS_IN_MONTH_CORRECTION_NORM};
fholin 1:eda561b01daf 294 uint32_t weekDays = (RTC_INIT_WEEKDAY-1);
fholin 1:eda561b01daf 295 uint32_t cnt32 = cnt64>> N_PREDIV_S; /*total in seconds (136 year)*/
fholin 1:eda561b01daf 296 uint32_t seconds;
fholin 1:eda561b01daf 297 uint32_t minutes;
fholin 1:eda561b01daf 298 uint32_t Days;
fholin 1:eda561b01daf 299 uint32_t div_out;
fholin 1:eda561b01daf 300 uint32_t div_rem;
fholin 1:eda561b01daf 301
fholin 1:eda561b01daf 302 cal_div_86400(cnt32, &Days, &seconds);
fholin 1:eda561b01daf 303
fholin 1:eda561b01daf 304 Time->SubSeconds = ( cnt64 & PREDIV_S);
fholin 1:eda561b01daf 305
fholin 1:eda561b01daf 306 /* calculates seconds */
fholin 1:eda561b01daf 307 cal_div_60(seconds, &minutes, &div_rem);
fholin 1:eda561b01daf 308 Time->Seconds=(uint8_t) div_rem;
fholin 1:eda561b01daf 309
fholin 1:eda561b01daf 310 /* calculates minutes and hours*/
fholin 1:eda561b01daf 311 cal_div_60(minutes, &div_out, &div_rem);
fholin 1:eda561b01daf 312 Time->Minutes = (uint8_t) div_rem;
fholin 1:eda561b01daf 313 Time->Hours = (uint8_t) div_out;
fholin 1:eda561b01daf 314 /* calculates Year */
fholin 1:eda561b01daf 315 Date->Year = DIV_1461(Days);
fholin 1:eda561b01daf 316 Days-= DIVC_BY_4( (DAYS_IN_YEAR*3 + DAYS_IN_LEAP_YEAR)* Date->Year );
fholin 1:eda561b01daf 317
fholin 1:eda561b01daf 318 /*calculates month*/
fholin 1:eda561b01daf 319 Date->Month = cal_get_month( Days, Date->Year) ;
fholin 1:eda561b01daf 320
fholin 1:eda561b01daf 321 /*calculates weekdays*/
fholin 1:eda561b01daf 322 weekDays += DIVC_BY_4((Date->Year*5));
fholin 1:eda561b01daf 323 weekDays += Days;
fholin 1:eda561b01daf 324 Date->WeekDay = MODULO_7( weekDays );
fholin 1:eda561b01daf 325
fholin 1:eda561b01daf 326 Days -=( DIVC_BY_2( (Date->Month)*(30+31) ) - (((correction_month[Date->Year % 4]>> ((Date->Month)*2) )&0x3)));
fholin 1:eda561b01daf 327
fholin 1:eda561b01daf 328 /* convert 0 to 1 indexed. */
fholin 1:eda561b01daf 329 Date->WeekDay ++ ;/* 0 to 1 indexed. month={0..6} to {1..7}*/
fholin 1:eda561b01daf 330 Date->Month++; /* 0 to 1 indexed. month={0..11} to {1..12}*/
fholin 1:eda561b01daf 331 Date->Date = (Days+1);/* 0 to 1 indexed */
fholin 1:eda561b01daf 332 }
fholin 1:eda561b01daf 333
fholin 1:eda561b01daf 334
fholin 1:eda561b01daf 335
fholin 1:eda561b01daf 336
fholin 1:eda561b01daf 337
fholin 1:eda561b01daf 338
fholin 0:2325d1d28df3 339 #endif