public void ReadLoop() { // TODO2: Proveri da li je sve u ovom metodu thread safe. bool lastRead = false; bool pendingClear = false; int visibleCount = 0; int skipCount = 0; while (!_shouldStop) { if (lastRead) { // Preskoci narednih CitacKarticaThreadSkipCount ocitavanja. // Kod radi samo za CitacKarticaThreadSkipCount > 0. lastRead = false; skipCount = 1; } else { if (skipCount > 0 && ++skipCount > Options.Instance.CitacKarticaThreadSkipCount) { skipCount = 0; } if (skipCount == 0) { lastRead = CitacKartica.Instance.TryReadDolazakNaTrening(Options.Instance.COMPortReader, pendingClear); } } if (lastRead) { // Prikazivanje treba da bude vidljivo tokom trajanja CitacKarticaThreadVisibleCount intervala. pendingClear = true; visibleCount = 1; } else if (pendingClear) { ++visibleCount; if (visibleCount > Options.Instance.CitacKarticaThreadVisibleCount) { CitacKarticaForm citacKarticaForm = Form1.Instance.CitacKarticaForm; if (citacKarticaForm != null) { citacKarticaForm.Clear(); } pendingClear = false; } } Thread.Sleep(Options.Instance.CitacKarticaThreadInterval); } }
public bool handleOcitavanjeKarticeTrening(int broj, DateTime vremeOcitavanja, bool obrisiPrePrikazivanja) { CitacKarticaForm citacKarticaForm = Form1.Instance.CitacKarticaForm; if (obrisiPrePrikazivanja) { // Kartica je ocitana, a na displeju je prikaz prethodnog ocitavanja. Obrisi prethodno ocitavanje // i pauziraj (tako da se vidi prazan displej), pre nego sto prikazes naredno ocitavanje. if (citacKarticaForm != null) { citacKarticaForm.Clear(); Thread.Sleep(Options.Instance.CitacKarticaThreadPauzaZaBrisanje); } } if (broj == TEST_KARTICA_BROJ) { if (citacKarticaForm != null) { string msg = FormatMessage(broj, null, TEST_KARTICA_NAME); citacKarticaForm.Prikazi(msg, Options.Instance.PozadinaCitacaKartica); } return(true); } Sesija.Instance.OnOcitavanjeKartice(broj, vremeOcitavanja); Clan clan = CitacKarticaDictionary.Instance.findClan(broj); if (clan == null) { return(false); } // Odmah prikazi ocitavanje, da bi se momentalno videlo na ekranu nakon zvuka ocitavanja kartice. UplataClanarine uplata; prikaziOcitavanje(clan, vremeOcitavanja, out uplata); unesiOcitavanje(clan, vremeOcitavanja, uplata); return(true); }
private void prikaziOcitavanje(Clan clan, DateTime vremeOcitavanja, out UplataClanarine uplata) { uplata = CitacKarticaDictionary.Instance.findUplata(clan); bool okForTrening = false; if (uplata != null) { // Moguce da je clan uplatio clanarinu npr. pre 3 meseca, a tek ovog meseca mu je promenjen status // u neplaca clanarinu. U tom slucaju treba da svetli zeleno. if (clan.NeplacaClanarinu) { okForTrening = true; } else if (uplata.Grupa.ImaGodisnjuClanarinu) { okForTrening = uplata.VaziOd.Value.Year == vremeOcitavanja.Year; } else { // Proveri da li postoji uplata za ovaj ili sledeci mesec. okForTrening = uplata.VaziOd.Value.Year == vremeOcitavanja.Year && uplata.VaziOd.Value.Month == vremeOcitavanja.Month; if (!okForTrening) { DateTime sledeciMesec = DateTime.Now.AddMonths(1); okForTrening = uplata.VaziOd.Value.Year == sledeciMesec.Year && uplata.VaziOd.Value.Month == sledeciMesec.Month; } } } else { okForTrening = clan.NeplacaClanarinu; } // Tolerisi do odredjenog dana u mesecu, ali ne i za godisnje clanarine. if (!okForTrening) { if (uplata != null && uplata.Grupa.ImaGodisnjuClanarinu) { okForTrening = vremeOcitavanja.Month <= Options.Instance.PoslednjiMesecZaGodisnjeClanarine; } else { okForTrening = vremeOcitavanja.Day <= Options.Instance.PoslednjiDanZaUplate; } } string grupa = null; if (uplata != null) { grupa = uplata.Grupa.Naziv; } string msg = FormatMessage(clan.BrojKartice.Value, clan, grupa); // Posto ocitavanje kartice traje relativno dugo (oko 374 ms), moguce je da je prozor // zatvoren bas u trenutku dok se kartica ocitava. Korisnik je u tom slucaju cuo zvuk // da je kartica ocitana ali se na displeju ne prikazuje da je kartica ocitana. CitacKarticaForm form = Form1.Instance.CitacKarticaForm; if (form != null) { Color color = Options.Instance.PozadinaCitacaKartica; if (Options.Instance.PrikaziBojeKodOcitavanja) { if (okForTrening) { color = Color.SpringGreen; } else { color = Color.Red; } } form.Prikazi(msg, color); } }
public void WaitAndReadLoop() { // TODO2: Proveri da li je sve u ovom metodu thread safe. while (!_shouldStop) { // NOTE: Izabran je mali vremenski interval 2 sec (a ne recimo 10 sec), zato sto kada se program zatvori // WaitAndReadDataCard je i dalje aktivan dok ne istekne interval, a samim tim i proces je i dalje // aktivan, i nije moguce ponovo restartovanje programa (ili je moguce ali imamo istovremeno dva // procesa). int nSecs = Options.Instance.NumSecondsWaitAndRead; string sType = " "; string sID1 = " "; string sID2 = " "; string name = " "; int broj = -1; ulong retval; if (Options.Instance.JedinstvenProgram) { lock (readAndWriteLock) { retval = WaitAndReadDataCard(Options.Instance.COMPortReader, nSecs, ref sType, ref sID1, ref sID2, ref name) & 0xFFFFFFFF; } } else { retval = WaitAndReadDataCard(Options.Instance.COMPortReader, nSecs, ref sType, ref sID1, ref sID2, ref name) & 0xFFFFFFFF; } /*retval = 2; * sID1 = "5504"; * name = NAME_FIELD;*/ if (retval > 1) { if (dobroFormatiranaKartica(sID1, name, out broj) && handleOcitavanjeKarticeTrening(broj, DateTime.Now, false)) { CitacKarticaForm citacKarticaForm = Form1.Instance.CitacKarticaForm; if (citacKarticaForm != null) { Thread.Sleep(Options.Instance.CitacKarticaThreadVisibleCount * Options.Instance.CitacKarticaThreadInterval); citacKarticaForm.Clear(); } } } else if (retval == 1) { // Waiting time elapsed } else { // Wrong card } } }