#include "tslib.h" #include //tslib::tslib() //{ //} /* uint16_t tslib::uchar2uint(uint8_t Highbyte, uint8_t Lowbyte) { uint16_t uitmp; uitmp=0; uitmp |= uint8_t(Highbyte); uitmp<<=8; uitmp |= uint8_t(Lowbyte); return uitmp; } uint8_t tslib::uint2uchar(uint16_t uival, bool getHighB) { // getHighB: low=GetLowByte uint16_t uitmp=uival; if (getHighB==0) return uint8_t(uitmp); uitmp>>=8; return uint8_t(uitmp); }*/ uint16_t uchar2uint(char Highbyte, char Lowbyte) { uint16_t uitmp; uitmp=0; uitmp |= uint8_t(Highbyte); uitmp<<=8; uitmp |= uint8_t(Lowbyte); return uitmp; } uint16_t uchar2uint(uint8_t Highbyte, uint8_t Lowbyte) { uint16_t uitmp; uitmp=0; uitmp |= uint8_t(Highbyte); uitmp<<=8; uitmp |= uint8_t(Lowbyte); return uitmp; } uint32_t uchar2ulong(uint8_t Highbyte, uint8_t MHbyte, uint8_t MLbyte, uint8_t Lowbyte) { uint32_t ultmp=0; ultmp |= uint8_t(Highbyte); ultmp<<=8; ultmp |= uint8_t(MHbyte); ultmp<<=8; ultmp |= uint8_t(MLbyte); ultmp<<=8; ultmp |= uint8_t(Lowbyte); return ultmp; } uint8_t uint2uchar(uint16_t uival, bool getHighB) { // getHighB: low=GetLowByte uint16_t uitmp=uival; if (getHighB==0) return uint8_t(uitmp); uitmp>>=8; return uint8_t(uitmp); } void delay(uint16_t MilliSec) { QThread::msleep(uint32_t(MilliSec)); } void GetTimeString(uint8_t hours, uint8_t minutes, uint8_t seconds, uint8_t System12h, uint8_t ShowSec, uint8_t *buf) { // Zahlenwerte in String wandeln, 12/24h-Format // 12byte für buf! uint8_t usa; uint16_t jj; uint8_t hh, mm, ss, with_sec; // buf[0]= ganz linkes Zeichen hh=hours; mm=minutes; ss=seconds; // 15.10.12, Plausibilitätsprüfung -------------------------------------------------- if (hh>23) hh=0; if (mm>59) mm=0; if (ss>59) ss=0; with_sec=ShowSec; for (jj=0; jj<12; jj++) buf[jj]=0; usa = System12h; // 1:12h 0:24h // Stunden: if (usa) { // 12h System if (hh==0 || hh==12) { // 12AM (Mitternacht) oder 12PM (Mittag) buf[0]=0x31; buf[1]=0x32; } else if (hh<12) { // 1..11AM buf[0]=hh/10+0x30; buf[1]=hh%10+0x30; } else { //13:00 bis 23Uhr buf[0]=(hh-12)/10+0x30; buf[1]=(hh-12)%10+0x30; } } else { // 24h System buf[0]=hh/10+0x30; buf[1]=hh%10+0x30; } // Minuten: buf[2]=':'; //buf[2]='_'; // : not allowed in JsonFormat buf[3]=mm/10+0x30; buf[4]=mm%10+0x30; jj=5; if (with_sec) { buf[jj++]=':'; //buf[jj++]='_'; // : not allowed in JsonFormat buf[jj++]=ss/10+0x30; buf[jj++]=ss%10+0x30; } if (usa) { buf[jj++]=' '; if (hh<12) buf[jj++]='A'; else buf[jj++]='P'; buf[jj++]='M'; } } // ------------------- ******************************************************************************** void GetDateString(uint8_t day, uint8_t month, uint8_t yearhigh, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf) { // generate date as ascii string from integers day/month/year // yearhigh: 10..29, in europe always 20 (not in arabia!) comes as hex number, e.g. 0x20 // format= 0: dd.mm.yyyy (deutsch) // 1: mm.dd.yyyy (amerika) // 2: yyyy.mm.dd (Iran, Dubai) // 3: dd.yyyy.mm // 4: mm.yyyy.dd // 5: yyyy.dd.mm // sep: 0: use . as seperator 1: use / as seperator // return String in *buf // 11byte für buf! uint8_t tag, mon, jahr, d10, d1, m10, m1, y1000, y100, y10, y1; uint8_t slash; y100= (yearhigh & 0x0F)+0x30; y1000=((yearhigh & 0xF0)>>4)+0x30; // if (yearhigh>=20) // { // y1000='2'; // y100=28+yearhigh; // '0' + (yearhigh-20) // } else // if (yearhigh<20) // { // y1000='1'; // y100=38-yearhigh; // '9' - (19-yearhigh) // } tag=day; mon=month; jahr=yearlow; if (mon>12 || mon==0) mon=1; // 23.10.12 if (tag>31 || tag==0) tag=1; if (jahr>50 || jahr<11) jahr=1; if (sep==0) slash='.'; // slash==0 else if (sep==1) slash='/'; else if (sep>=0x20) slash=sep; else slash='.'; d10 =tag/10; d1 =tag%10; m10 =mon/10; m1 =mon%10; y10 =jahr/10; y1 =jahr%10; d10 +=0x30; // in Asccii wandeln d1 +=0x30; m10 +=0x30; m1 +=0x30; y10 +=0x30; y1 +=0x30; switch (format) { // 0: dd.mm.yyyy case 0: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=m10; buf[4]=m1; buf[5]=slash; buf[6]=y1000; buf[7]=y100; buf[8]=y10; buf[9]=y1; break; // 1: mm.dd.yyyy case 1: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=d10; buf[4]=d1; buf[5]=slash; buf[6]=y1000; buf[7]=y100; buf[8]=y10; buf[9]=y1; break; // 2: yyyy.mm.dd case 2: buf[0]=y1000; buf[1]=y100; buf[2]=y10; buf[3]=y1; buf[4]=slash; buf[5]=m10; buf[6]=m1; buf[7]=slash; buf[8]=d10; buf[9]=d1; break; // 3: dd.yyyy.mm case 3: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=y1000; buf[4]=y100; buf[5]=y10; buf[6]=y1; buf[7]=slash; buf[8]=m10; buf[9]=m1; break; // 4: mm.yyyy.dd case 4: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=y1000; buf[4]=y100; buf[5]=y10; buf[6]=y1; buf[7]=slash; buf[8]=d10; buf[9]=d1; break; // 5: yyyy.dd.mm case 5: buf[0]=y1000; buf[1]=y100; buf[2]=y10; buf[3]=y1; buf[4]=slash; buf[5]=d10; buf[6]=d1; buf[7]=slash; buf[8]=m10; buf[9]=m1; break; } buf[10]=0; } // ------------------- ******************************************************************************** void GetShortDateString(uint8_t day, uint8_t month, uint8_t yearlow, uint8_t format, uint8_t sep, uint8_t *buf) { // generate date as ascii string from integers day/month/year // format= 0: dd.mm.yy (deutsch) // 1: mm.dd.yy (amerika) // 2: yy.mm.dd (Iran, Dubai) // 3: dd.yy.mm // 4: mm.yy.dd // 5: yy.dd.mm // sep: 0: use . as seperator 1: use / as seperator // return String in *buf // 11byte für buf! uint8_t tag, mon, jahr, d10, d1, m10, m1, y10, y1; uint8_t slash; tag=day; mon=month; jahr=yearlow; if (mon>12 || mon==0) mon=1; // 23.10.12 if (tag>31 || tag==0) tag=1; if (jahr>50 || jahr<11) jahr=1; if (sep==0) slash='.'; // slash==0 else if (sep==1) slash='/'; else if (sep>=0x20) slash=sep; else slash='.'; d10 =tag/10; d1 =tag%10; m10 =mon/10; m1 =mon%10; y10 =jahr/10; y1 =jahr%10; d10 +=0x30; // in Asccii wandeln d1 +=0x30; m10 +=0x30; m1 +=0x30; y10 +=0x30; y1 +=0x30; switch (format) { // 0: dd.mm.yyyy case 0: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=m10; buf[4]=m1; buf[5]=slash; buf[6]=y10; buf[7]=y1; break; // 1: mm.dd.yyyy case 1: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=d10; buf[4]=d1; buf[5]=slash; buf[6]=y10; buf[7]=y1; break; // 2: yyyy.mm.dd case 2: buf[0]=y10; buf[1]=y1; buf[2]=slash; buf[3]=m10; buf[4]=m1; buf[5]=slash; buf[6]=d10; buf[7]=d1; break; // 3: dd.yyyy.mm case 3: buf[0]=d10; buf[1]=d1; buf[2]=slash; buf[3]=y10; buf[4]=y1; buf[5]=slash; buf[6]=m10; buf[7]=m1; break; // 4: mm.yyyy.dd case 4: buf[0]=m10; buf[1]=m1; buf[2]=slash; buf[3]=y10; buf[4]=y1; buf[5]=slash; buf[6]=d10; buf[7]=d1; break; // 5: yyyy.dd.mm case 5: buf[0]=y10; buf[1]=y1; buf[2]=slash; buf[3]=d10; buf[4]=d1; buf[5]=slash; buf[6]=m10; buf[7]=m1; break; } buf[8]=0; } uint16_t tslib_strlen(char *buf) { uint16_t nn; for (nn=0; nn<0xFFF0; nn++) if (buf[nn]==0) return nn; return 0; } void tslib_strclr(char *buf, char clrsign, uint16_t len) { uint16_t nn; for (nn=0; nn=0x30 && sign<=0x39) return true; return false; } bool tslib_isHexAsciiNumber(char sign) { if (sign>=0x30 && sign<=0x39) return true; if (sign>=0x61 && sign<=0x66) // a...f return true; if (sign>=0x41 && sign<=0x46) // A...F return true; return false; } int tslib_getMinimum(int val1, int val2) { if (val1maxArayLen) LL=maxArayLen; for (ii=0; ii> (7 - nn)) & 0x01); if (B15H) { crc ^= 0x1021; } } } for (nn = 0; nn < 16; nn++) { B15H = 0; if(crc & 0x8000) B15H = 1; crc = (crc << 1) | 0x00; if (B15H) { crc ^= 0x1021; } } return crc; } static uint8_t LastBLcmd; // stored the last sent cmd in order to analys response // cmd echo'ed: error cmd or'ed with 0x80: OK uint8_t tslib_prepareDC_BLcmd(uint8_t Cmd, uint8_t SendDataLength, uint8_t *sendData, uint8_t *outBuf) { // make BL protocol, retval = outbuf length (5...133) // bring data in correct form: start always with 0x02 finish with 0x03 and append checksum // 0x02 Cmd < ...sendData ..> CRC CRC 0x03 // Data length = 0...64 // special conversion: if data contain 2 or 3 (STX, ETX) then write two bytes: 0x1B (=ESC) and data|0x80 // so maxlength = 5 + 2 x 64 (if all data are 2 or 3) without 2,3: maxlength = 5 + 64 uint8_t myBuf[140], pp=0, nn, uctmp, currLen=0; uint16_t calcCrc; tslib_strclr(myBuf, 0, 140); myBuf[pp++]=2; // STX myBuf[pp++]=Cmd; LastBLcmd=Cmd; // append data: for (nn=0; nn>8) & 0x00FF); myBuf[pp++]=3; currLen=pp; return currLen; } // some special commands (right out of bootloader manual) uint8_t tslib_readBLversion(uint8_t *sendData) { // minimum size of sendData-buffer: 5byte retval: length uint8_t myBuf[2]; tslib_strclr(myBuf, 0, 2); return tslib_prepareDC_BLcmd(0x11, 0, myBuf, sendData); } uint8_t tslib_readFWversion(uint8_t *sendData) { // minimum size of sendData-buffer: 5byte retval: length uint8_t myBuf[2]; tslib_strclr(myBuf, 0, 2); return tslib_prepareDC_BLcmd(0x12, 0, myBuf, sendData); } uint8_t tslib_exitBL(uint8_t *sendData) { // minimum size of sendData-buffer: 5byte retval: length uint8_t myBuf[2]; tslib_strclr(myBuf, 0, 2); return tslib_prepareDC_BLcmd(0x18, 0, myBuf, sendData); } uint8_t tslib_sendFlashStartAddr2BL(uint32_t startAddr, uint8_t *sendData) { // minimum size of sendData-buffer: 13byte retval: length (9...13) uint8_t myBuf[2]; tslib_strclr(myBuf, 0, 2); return tslib_prepareDC_BLcmd(0x11, 0, myBuf, sendData); } */ // ----------------------------------------------------------------------------------------------- bool tslib_plausiChkTime(uint8_t hour, uint8_t min, uint8_t sec ) { // retval: true: time is OK bool ret=true; if (hour>23) ret=false; if (min>59) ret=false; if (sec>59) ret=false; return ret; } // ----------------------------------------------------------------------------------------------- bool tslib_plausiChkDate(uint8_t year, uint8_t month, uint8_t dom ) { // retval: true: time is OK bool ret=true; if (year<23) ret=false; if (month<1 || month>12) ret=false; if (dom<1 || dom>31) ret=false; return ret; } // ----------------------------------------------------------------------------------------------- UCHAR swl_LengthCurrentMonth(UCHAR month, UCHAR year) { // return nr of days for this month, respecting leap years if (month==2) { // Sonderfall Februar: if (year%4) return 28; // Rest wenn durch 4 geteilt wird else return 29; // durch 4 teilbar ohne Rest } else if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { return 31; } else return 30; } // ----------------------------------------------------------------------------------------------- UINT swl_GetDaysOfaCompleteYear(UCHAR year) { // year: 0=2000 4=2004 99=2099 // retval: 365 or 366 (leap year) UCHAR jahr; jahr=year; if (jahr & 3) // wenn bits 0 und 1 low sind dann Vielfaches von 4 { // dann kein Schaltjahr return(365); } else { // Schaltjahr return(366); } } // ----------------------------------------------------------------------------------------------- UINT swl_GetDaysOfYear(UCHAR year, UCHAR month, UCHAR day) { // number of days of momentary year from 1. Jan until // (inclusive) given date with respect to leap years // year: 0..99 month=1..12 day=1..31 int summe=0; UCHAR mo, ta, yy, mm, uctmp; yy=year; mo=month; ta=day; if (mo==0 || mo>12 || ta==0 || ta>31 || yy>99) return(0); // Fehler // Beispiel: mo=5: summiere Tage des Jan, Feb, März und April // der Mai ist noch nicht komplett abgelaufen! mm=1; // start mit Januar while (mo>1) { uctmp=swl_LengthCurrentMonth(mm,yy); summe += (int)uctmp; mo--; mm++; } summe+=ta; return(summe); } // ----------------------------------------------------------------------------------------------- unsigned long swl_getNrOfDaysSince2000Jan1(UCHAR thisYear, UCHAR thisMonth, UCHAR thisDay) { // till today ULONG ultmp=0; UCHAR jj; for (jj=0; jj