mata in datum och tid

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

mata in datum och tid

Inlägg av jesse »

hmmm.... jag har fått en uppgift som jag tycker är bökig att lösa... det går säkert att lösa smidigt på många olika sätt, men jag måste bara skriva av min frustration innan jag försöker komma på hur jag ska lösa det. Om någon dessutom hinner komma med ett bra förslag innan jag bestämt mig för en metod, så tar jag tacksamt emot tips (Jag kan göra annat under tiden :) ).

Jag har en µC med en 4x20 alfanumerisk display, där visar jag en bild som ser ut så här:

Kod: Markera allt

 "rubrik"
 Inställn tid & datum
>2012-01-01 12:00:00
 Format   ÅÅÅÅ-MM-DD
När jag går ner med pilen till tredje raden, ska jag kunna trycka på OK och sedan ändra i datumet och tiden. Jag förflyttar markören med två knappar: fram och back, samt ändrar värde (på den siffra som markören pekar på) med knapparna upp och ner. För att godkänna trycker jag OK igen, för att återgå trycker jag back-pil tills jag kommer längst till vänster.

Datum och tid finns i en struct med 6 st uint8_t : yy,mo,dd,hh,mm,ss
Datumet lagras i BCD-format, så skriver man ut det i hexformat går det att läsa.

Hade det bara funnits ett datumformat hade det väl varit OK, men nu ska den kunna hantera tre format:

Det finns en format-variabel som kan anta värdena 0,1 och 2:

0 = 20YY-MO-DD
1 = DD/MO/20YY
2 = MO/DD/20YY

Jag har redan en "printDateTime() - rutin som skriver ut både datum och tid på displayen beroende på datumformat.
Den använder sig av positionspekare för YY, MO och DD, så att t.ex. för format 2 så har pekYY = position 8, pekDD = position3, pekMO = position 0, samt pek20 = position6 (var "20" ska skrivas").

Datumet skrivs unt i en RAM-buffert som sedan skickas ut till LDC.
Jag hade tänkt använda mig av RAM-bufferten även då jag ändrar i siffrorna och sedan spara från den till timeDate-variabeln när jag trycker OK.

Förutom att jag ska kunna ändra på alla siffror utom på skiljetecknen ( : . / - ) så ska jag hålla reda på gränserna för talen, t.ex. att månad bara kan anta värden mellan 01 och 12. Så jag måste hålla reda på en massa saker - framför allt vilken variabel jag håller på med för tillfället.

Ja... så nu sitter jag här och funderar.... hur görs detta på smidigast sätt?

(smidigast i det här fallet är likvärdig med "enklast att programmera", jag skiter i vad det tar i form av processorkraft eller programminne. Däremot vill jag inte använda ytterligare utrymme i RAM-minnet, om det går att undvika.)

Jag kan tillägga att menysystemet är uppbyggt på det sättet att först så ritas hela bilden upp (med rätt datum och tid etc.), sedan anropas en speciell funktion varje gång en knapp trycks ner; menyMode1_navigateMenu(). I den funktionen avgör jag vad som ska göras beroende på vilken knapp det var. Om jag trycker "OK" när jag befinner mig på rad 3, så kommer jag till "meny mode 6" som innebär att en speciell funktion för knapptryckning anropas: menuMode6_datumTid() där jag alltså ska hantera detta. När jag nästa gång trycker OK går jag tillbaks till "meny mode 1" efter att ha sparat det nya datumet + tiden. (meny mode 1 = att navigera i menyn).
Senast redigerad av jesse 4 juni 2013, 14:12:02, redigerad totalt 1 gång.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: mata in datum och tid

Inlägg av johano »

XKCD har (som vanligt) svar:

Bild

/johan
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: mata in datum och tid

Inlägg av jesse »

Ja, JohanO, om bara italienare, engelsmän och amerikanare hade brytt sig om den standarden.... Men det är väl lika omöjligt som att få dem att frångå "inch" mm... :roll:

Men om dom vill att vi ska rätta oss efter deras senaste psykiatri-diagnos-manual (DSM V) så borde vi kunna kräva att de anammar ISO och det metriska systemet :D
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: mata in datum och tid

Inlägg av Swech »

Kan du inte skippa formatet då du matar in,
ha en rad för år
nästa rad för månad
och nästa för dag.

Då du matar in så uppdaterar du samtidigt en presentation av datumet i önskat format på ett 4de ställe

Swech
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: mata in datum och tid

Inlägg av jesse »

Inmatningen måste ske som jag beskrivit, enligt önskemål.
Hade jag fått göra på mitt sätt hade jag nog skippat de andra formaten helt och hållet och följt JohanO's tips.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: mata in datum och tid

Inlägg av Krille Krokodil »

Kod: Markera allt

char state;

while(någoting){
switch(state){
   case YEAR:
       if(right_pressed)
          state = MONTH;
       if(up_pressed)
           year++;
   break;
   case MONTH:  
   ...
      if(up_pressed){
          month++;
          if(month == 13)
              month = 1;
      }
   ...
}
Update_display();
}
Nerre
Inlägg: 27230
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: mata in datum och tid

Inlägg av Nerre »

En tanke är ju att ha en variabel vars innehåll styrs av den där format-variabeln.

Lite som hur man använder printf alltså.

Så när du stegar så tittar koden inte bara på var i datumfältet du befinner dig utan även var i den formatvariabeln. Och det tecken som står på den positionen i format-variabeln styr vilka värden du bläddrar mellan.

På så vis blir koden generell: Den fungerar för alla datumformat du kan komma på, så länge formatet går att beskriva med en formatsträng.

Formatsträngen behöver ju inte vara likadan som själva datumformatet, den kan ju vara nåt i stil med "DD_MM___YY", d.v.s. den håller bara reda på vad som står var och det styr då vilka värden du kan bläddra mellan.

Det blir lite värre om du t.ex. vill kunna ställa ental och tiotal i året separat, då kanske man får göra nåt i stil med "dD_mM___YY" där gemenen står för att den siffran ändras inte ensam så att säga. Stega höger och vänster då stegar bara mellan "versalerna". Bara att tänka på att padda med en nolla om dag eller månad är under 10.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: mata in datum och tid

Inlägg av jesse »

Nerre... jag spånade precis på en liknande idé.

Och då tänkte jag mig att denna "formatvariabel" innehåller index i date_time-structen. Den ser ju ut så här:

Kod: Markera allt

	typedef struct 
	{
		u8 ss; // 0-59 sekund
		u8 mm; // 0-59 minut
		u8 hh; // 0-23 timme
		u8 dd; // 0-31 dag
		u8 mo; // 1-12 månad
		u8 yy; // 0-99 årtal
	} TidTyp;


Eftersom varje byte innehåller två nibble med var sin siffra, kan indexet peka på en nibble. T.ex. noll pekar på sekunder,ental, 1 = sekunder, tiotal, 2 = minnuter ental, .... , 8 = månad , tiotal, etc..

formatsträngen kan då se ut som:
--BA-98-76-54-32-10
76-98---BA-54-32-10
98-76---BA-54-32-10
Då kommer jag alltid att veta vilken variabel jag arbetar med och om det är ental eller tiotal, och därmed också veta begränsningarna ( 01-12, 00-59 etc).
Jag ska testa detta.
Nerre
Inlägg: 27230
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: mata in datum och tid

Inlägg av Nerre »

Fast du har ju också såna saker att om entalet för dag är 8 så ska du inte kunna öka tiotalet till 3...

Jag tror, som användare, att det för månad och dag är bäst att helt enkelt stega hela talet. Annars hamnar man t.ex. i situationer där det står den 31:a och du ska ändra till 29:e, och går till entalet och börjar men så inser du att du måste ändra tiotalet först..

För årtalet kan man stega ental och tiotal för sig för där är alla kombinationer giltiga.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: mata in datum och tid

Inlägg av jesse »

krille: det blir bara så himla mycket att skriva....
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: mata in datum och tid

Inlägg av jesse »

Nerre:
tidigare när jag ställer andra tvåsiffriga heltal så kan jag ställa båda siffrorna, men om jag går från 9 till 0 på entalsdelen så ökas tiotalet automatiskt. (eller från 0 till 9 så minskar tiotalsdelen).

jag tänker mig att jag behandlar varje tal som en enhet, men kan ändå befinna mig på både entals och tiotals-positionen. Står det t.ex. 19 och jag trycker "upp" på entalspositionen så tar den talet "19" och ökar med ett - och skriver tillbaks det som "20".
Står jag på index 5 som motsvarar "timmar, tiotal", så delar jag det med 2 och får automatiskt adressen till den variabeln i "time_date"-structen: 5/2 = 2.
(u8*)time.date[2] = timmar.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: mata in datum och tid

Inlägg av Krille Krokodil »

Du brydde dig ju inte om hur mycket kod det blev ;)

Går ju att göra den också så att samma cases hanterar hanterar de olika formaten, då blir det mindre kod.

char state_translate[][] = {{YEAR, MONTH...}, {DAY, MONTH...}, {MONTH, DAY...}}

switch(state_translate[format-variabel][state])
Användarvisningsbild
JimmyAndersson
Inlägg: 26579
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: mata in datum och tid

Inlägg av JimmyAndersson »

Några detaljer från en GUI-tok:

1) "Inställn tid & datum"
Borde vara "Inställn datum & tid". MSB helt enkelt. :)

2) Ska man inte kunna ändra tid-formatet också? T.ex AM/PM. 12H/24H.

3) Behöver man kunna ställa in sekunderna på klockan?
Isåfall måste man ju som användare veta hur lång tid man behöver på sig att ställa in och spara.
Många klockor sparar tiden som HH:MM:00 när man trycker Ok.

4) Om valet för datumformatet finns sist i menyn (som i bilden) så kommer alla att
först behöva klicka ner markören tills den står längst ner, ändra format
och sedan klicka upp markören till raden där man ändrar datum och tid.
Visserligen ändrar man väl bara datumformat en gång per användare..



Sedan hade jag en idé om själva problemet, men det visade sig att ni tänkt ungefär likadant.


edit:
Jag tänkte skriva det förut, men tänkte att det är självklart. Men nu tar jag med det ändå:
Oavsett vilken metod du väljer för datumformat-tricket så måste det ju fungera åt båda hållen.
Det jag menar är att man måste kunna använda Datum/Tid-inställnings-sidan som en konverterare mellan olika datumformat.
Om jag t.ex knappar in enligt 20YY-MO-DD så måste man kunna ändra sedan så att datumet visas enligt t.ex MO/DD/20YY.

Egentligen väldigt logiskt, men ändå är det inte alla som tänker på det.
Det som brukar hända då är antingen att t.ex 2013-05-31 (20YY-MO-DD)
visas som 20/13/0531 när man väljer visning enligt MO/DD/20YY...
eller att man måste skriva in datum och tid igen när man ändrat datumformat.


--
Parentes:
Jag hade en lite liknande grej att ordna i mitt senaste projekt,
men då rörde det koordinater på fyra "platser": Vänster upp, höger upp, vänster ner, höger ner.
Enligt en oskriven regel så skulle användaren dessutom definiera dem
enligt en speciell ordning och det finns förstås de som har en egen ordning...

Så jag började med att utgå från variabler döpta efter outline1X till outline4Y
för att helt enkelt släppa det där med vad som var vänster/höger/uppe/nere.
Dessa variabler fungerar även som mellanlandning vid konverteringar mm.
Användaren kan rent av låta "Höger ner" vara punkten längst upp till vänster. Det blir rätt ändå.
(Ungefär som att man kan ta på sig klockan uppochner, låta 6 stå för 12 och ställa den därefter.)

Det här skulle även kunna ha fungerat i ditt fall, med en liten modifiering,
om det inte var för att du ändå måste ha koll på vad som är vad
så att man inte kan knappa in för höga tal för datum och månad.



Kul tråd för övrigt! Det är alltid lika intressant med såna här trådar där man kan
följa någon annans funderingar och lösningar, även när det gäller programmering.
Det är inte så vanligt här. Jag ser gärna mer sådant på forumet. :tumupp:
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: mata in datum och tid

Inlägg av dangraf »

jag skulle nog löst det på "objektnivå" dvs att man skapar en "klass" som i detta fallet enbart är en fil och innehåller några generella funktioner som t.ex temp variabeln på datumet man vill ändra på samt lite funktioner som "stepDay", "stepMonth" etc.
Därefter så skulle jag skriva separata funktioner för att skriva ut datumet beroende på vilket format man väljer och använda funktionspekare till dessa.
Om man har t.ex en strukt med de funktionspekare man vill använda sig av så kan man sätta dessa när man väljer formatet och behöver inte bry sig om en massa switch-case satser etc som ganska snabbt blir stora.
Man kan göra det lite "fult" genom att sätta filen som en klass och sätta varablerna som "static" eller så kan man göra en strukt som håller koll på allt som man alltid skickar med vid funktionsanrop.
void
Inlägg: 119
Blev medlem: 8 juli 2007, 11:06:50
Ort: Enköping

Re: mata in datum och tid

Inlägg av void »

Om man skall börja från vänster och arbeta sig åt höger när man ställer datumet blir det ologiskt för formattyp 1, eftersom man behöver ange månad innan man vet tillåtet intervall för dagarna. Ibland kan det vara bättre att tala beställaren tillrätta istället för att göra en mindre lyckad lösning.
Skriv svar