AccessControl By Pier Alessandro Aisa

Codice Sorgente Firmware – Access Control v1.0 del 29-03-2016 Pier Aisa

/*
  Access Control v1.0 del 29-03-2016 Pier Aisa
*/
#include <SdFat.h>
#include <FishinoUdp.h>
#include <FishinoSockBuf.h>
#include <Fishino.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h" 
#define BUFSIZ 38 //stringa piu' lunga "GET /?YYYYMMDDHHMMSS HTTP1.1" = 38
#define wc(s) wc_p(PSTR(s)) //save RAM used instead client.print with data on flash
#define fp(s) fp_p(PSTR(s)) //save RAM used instead file1.print with data on flash
#define header "HTTP/1.1 200 OK\n"
#define content "Content-Type: text/html\n\n"
#define head "<HTML>\n"
#define dash "-\n"
#define br1 "<br>\n"
#define url "<a href=\"/\">HOME</a>\n"
#define txt ".TXT"
#define comma '\t'
#define colon ":"
#define dot "/"
#define http " HTTP"
#define day1 "DAY"
#define get "GET /"
#define datafile "D" //"DATA____"
#define MY_SSID  "NikolaTesla"
#define MY_PASS  ""
RTC_DS1307 RTC;
int DS1307 = 0x68;
DateTime now;
int in0 = 0,cycle=0;
Sd2Card card;
SdVolume volume;
SdFile root ;
SdFile file ;
SdFile file1 ;
dir_t p ;
char filename[14] ;
char* dirname ;
String date;
int fasce[12];
FishinoServer server(80);
FishinoClient client ;
  
void setup() {
  pinMode(2, OUTPUT);
  Serial.begin(115200);
  if (!card.init(SPI_HALF_SPEED, 4)) ;
  if (!volume.init(&card)) ;
  if (!root.openRoot(&volume)) ;
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV2);
  while(!Fishino.reset())
  Fishino.setMode(STATION_MODE);
  while(!Fishino.begin(MY_SSID, MY_PASS))
  server.begin();
  client = server.available();
  Wire.begin();
  RTC.begin();
  root.rewind();
  client = server.available();
  IPAddress ip = Fishino.localIP();
  Serial.println((IPAddress)ip);
}

void loop()
{ delay(2000);
  ListFiles(LS_SIZE,root);
  now = RTC.now();
  char clientline[BUFSIZ];
  int index;
  client = server.available();
  if (client) {
    boolean current_line_is_blank = true;
    index = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c != '\n' && c != '\r') {
          clientline[index] = c;
          index++;
          if (index >= BUFSIZ)
            index = BUFSIZ -1;
          continue;
        }
        clientline[index] = 0;
        date = get; date += " " ;
        date.toCharArray(filename,14,0);
    if (strstr(clientline, filename) != 0) {
//Lista SD
          dirname = "/";
          HtmlHeader();
          root.rewind();
          ListFiles(LS_SIZE,root);
          break;
          }   
          date = get; date += "D" ;
          date.toCharArray(filename,14,0);
    if (strstr(clientline, filename) != 0) {
//D command read subdir 
          dirname = clientline + 6; // look after the "GET />" (6 chars)
          (strstr(clientline, http))[0] = 0;
          if(file.open(&root,dirname, O_READ)); 
          {     HtmlHeader();
                ListFiles(LS_SIZE,file);
          }
          file.close();
          break;
          }
//H command set time
          date = get; date += "H" ;
          date.toCharArray(filename,14,0);
          if (strstr(clientline, filename) != 0) {
          //set date
          date = clientline + 6; // look after the "GET />" (6 chars)
          (strstr(clientline, http))[0] = 0;
          setTime(date.substring(0,4).toInt(), date.substring(4,6).toInt(), date.substring(6,8).toInt(),date.substring(8,10).toInt(), date.substring(10,12).toInt(), date.substring(12,14).toInt());
          wc(url); //back to home
          delay(3000);
          break;
          }
      }
    }
    delay(1000);
    client.stop();
  }

gestionevento(false); // true per simazione evento
if (now.hour() == 23 && now.minute() == 59)  finegiornata();
delay(2000);
}

void HtmlHeader()
  {       wc(header);
          wc(content);
          wc(head);
          client.print(getday());client.print(" ");client.print(getdate(true)); wc(" \n");client.print(gettime());
          wc(br1); 
  }

void ListFiles(uint8_t flags, SdFile current) {
  current.getFilename(filename);
  client.print(filename);
  wc("<ul>\n");
      while (current.readDir(p) > 0) {
        if (p.name[0] == DIR_NAME_FREE) break;
        if (p.name[0] == DIR_NAME_DELETED || p.name[0] == '.') continue;
        if (!DIR_IS_FILE_OR_SUBDIR(&p)) continue;
        wc("<li>"); 
        current.getFilename(filename);
        if (DIR_IS_SUBDIR(&p))
           { wc("<a href=\"D\n");
             client.write(filename);
           }
        date = getname(p);
        date.toCharArray(filename,14,0); 
        client.print(filename);
        if (DIR_IS_SUBDIR(&p)) { wc("\">\n"); client.print(filename); }
        if (DIR_IS_SUBDIR(&p)) wc("</a>\n");
        wc("</li>\n");
      }
    wc("</ul>\n\n");
}

void gestionevento(boolean sim) {
         in0 = analogRead(A0);
         Serial.print(++cycle);Serial.print("in=");Serial.println(in0);
         if (in0 > 50 || sim) {    //usare se quando la porta si apre A0 è alto >50
         //if (in0 < 50|| sim) {   //usare se quando la porta si apre A0 è basso <50
            digitalWrite(2, HIGH);   //abilita uscita
            now = RTC.now();
            date = getdate(false)+txt;
            date.toCharArray(filename,14,0); 
            writefile(filename,"G");
            wc(url); //back to home
            int ora = now.hour(); 
            if (ora>=8 && ora <=19) fasce[ora-8]++;
            delay(1000);
          }
        else digitalWrite(2, LOW);    //disabilita uscita  
}

void finegiornata() {
            String dirname1 = String ("GAAAAMMDD.TXT");
            char * dirname2 = "G";
            for(int i=0;i<12;i++) fasce[i]=0;
            int ora = now.hour(); 
            date = getdate(false)+txt;
            date.toCharArray(filename,14,0);
            dirname1 = String("G"); //+ String(filename);
            dirname1.toCharArray(dirname2,1,0);
            openfile(filename,dirname2);
            Serial.println("f"); 
            int16_t c; String hour = String("");
            boolean oranext = false; 
            while ((c = file1.read()) > 0) {
              if (c==13) 
                {oranext = true;}
              else
                {if(oranext && c!=58) 
                      { hour = hour + String((char)c) ;} 
                 else { 
                          ora = hour.toInt();
                          if (ora>=8 && ora <=19) fasce[ora-8]++;
                          oranext = false; hour = ""; ora= 0;
                       }
                }
            }
            file1.close();
            date = getdate(false).substring(2,8)+txt;
            date.toCharArray(filename,14,0); 
            writefile(filename,"M");
            for(int i=0;i<12;i++) fasce[i]=0;
            wc(url);
            delay(50000);
}

void writefile(char * filename1, char * dir) { 
  root.rewind();
  file.close();
    if(strstr(dir,"M"))
    {  if (!file.open(&root,dir, O_READ)) 
          {}
       else   
        {if (!file.exists(filename1))
          {
          if (!file1.open(&file,filename1, O_RDWR | O_CREAT | O_AT_END)) 
            {}
          else {
             fp(datafile);file1.print(comma);
             fp("M"); file1.print(comma);
             fp("G"); file1.print(comma);
             for(int i=0;i<12;i++)
                  {file1.print(getDigits(i+8,2));file1.print(comma);}
             fp("T"); file1.print(comma);
             fp(br1);
             file1.close();file.close();   
              }                
          }
      }
    }
    else
    {  if (!file.open(&root,dir, O_READ)) 
          {}
       else   
        {if (!file.exists(filename1))
          {
          if (!file1.open(&file,filename1, O_RDWR | O_CREAT | O_AT_END)) 
              file1.println("\n");file1.close();file.close();   
          }
      }
    }
  root.rewind();
  file.close();file1.close();
  if (!file.open(&root,dir, O_READ)) 
          {}
        if (!file1.open(&file,filename1, O_RDWR | O_CREAT | O_AT_END)) 
            {} 
        else {
            if (strstr(dir,"M"))
            {
                file1.print(getdate(true));file1.print(comma);
                file1.print(getmonth()); file1.print(comma);
                file1.print(getday());
                int tot=0; double med=0;
                for(int i=0;i<12;i++)
                  {file1.print(comma);file1.print(getDigits(fasce[i],2));tot+=fasce[i];}
                file1.print(comma);file1.print(getDigits(tot,3));
                Serial.println("OKWM\n"); Serial.println(filename1);   
              }
            if (strstr(dir,"G"))
            {
                file1.print(gettime());file1.print(comma);file1.print(getday());file1.print(comma);file1.println(getdate(true));
            }                  
            }
            file.close();file1.close();
            delay(100);
}

void openfile(char * filename1, char * dir) { 
                if (!file.open(&root,dir, O_READ)) 
                  {}
                if (!file1.open(&file,filename1, O_READ)) 
                  {} 
}
 
 void wc_p(const char p[]) {
    byte c;
    while (0 != (c = pgm_read_byte(p++))) {
      client.print((char)c);
    }
}

void fp_p(const char p[]) {
    byte c;
    while (0 != (c = pgm_read_byte(p++))) {
      file1.print((char)c);
    }
}

String getdate(boolean point){
  String time =getDigits(now.day(),2);
  if (point) time +=dot;
  time +=getDigits(now.month(),2);
  if (point) time +=dot;
  time += String(now.year());
  return time;
}

String gettime(){
  String time = String(getDigits(now.hour(),2));
  time += colon;
  time +=getDigits(now.minute(),2);
  time += colon;
  time +=getDigits(now.second(),2);
  return time;
}

String getday(){
  int day = now.dayOfWeek();
  String time = String("XXX");
  if (day==0) time="DOM";if (day==1) time="LUN";if (day==2) time="MAR";if (day==3) time="MER";if (day==4) time="GIO";if (day==5) time="VEN";if (day==6) time="SAB";
  return time;
}

String getmonth(){
  int day = now.month();
  String time = String("XXX");
  if (day==1) time="GEN";if (day==2) time="FEB";if (day==3) time="MAR";if (day==4) time="APR";if (day==5) time="MAG";if (day==6) time="GIU";
  if (day==7) time="LUG";if (day==8) time="AGO";if (day==9) time="SET";if (day==10) time="OTT";if (day==11) time="NOV";if (day==12) time="DIC";
  return time;
}

String getDigits(int num, int digits){
  String time  = String(); time=String("");
  if(num < 10 && digits==2) time += String('0');
  if(num < 10 && digits==3) time += String("00");
  if(num < 100 && num > 9 && digits==3) time += String('0');
  time += String(num);
  return time ;
}

String getname(dir_t p) {   
String namefile = String(); 
  for (uint8_t i = 0; i < 11; i++) {
      if (p.name[i] == ' ') continue;
      if (i == 8) { namefile += '.'; }
        namefile += String((char)p.name[i]);
      }
return namefile ;
}

void setTime(uint16_t ye,uint16_t mo,uint16_t da,uint16_t ho,uint16_t mi,uint16_t se) {
  RTC.adjust(DateTime(ye,mo,da,ho,mi,se));
}

Scarica il firmware completo

44 Commenti

  1. Alle 11:00 del 20 Luglio questo progetto aveva 33 voti, alle 11:00 del 21 Luglio ne ha 68, o l'autore ha trovato uno stock di 35 amici o ha trovato una falla nel sistema di voto. Nella seconda ipotesi, quanto tempo passerà prima che la trovino gli altri utenti e trasformino il contest in una barzelletta? Considerando che la redazione ha cambiato in corsa il regolamento per (cito testualmente) "rendere più trasparente e partecipativa la valutazione" che figura ci farebbe? Chiederei di verificare
    • Gentile Gaspare, non c'è alcuna falla nel sistema di votazione. I voti provengono tutti da utenti con registrazioni diverse. Il controllo viene fatto sull'indirizzo di posta elettronica e ciascun indirizzo di posta elettronica può votare solo una volta. È vero che in queste situazioni vale il passaparola tra amici, come è altrettanto vero che la stessa persona può registrarsi con tante email diverse e partecipare alla votazione più volte. Fare un controllo sull'IP non è possibile perché la maggior parte delle connessioni adsl private dispongono di IP dinamico e anche in caso di IP statico sarebbe facilmente aggirabile con un proxy o con un browser come Thor. Cordiali saluti
    • Sono completamente d'accordo con te Gaspare, e la Redazione ce l'ha confermato. Qui basta che ciascuno di noi si crei tutti gli account email che vuole, e si fa i voti che vuole. Perchè scomodare amici o parenti quando puoi fare tutto da solo ed in casa? Quando ho partecipato credevo che ci sarebbe stata una giuria composta dallo staff della rivista che avrebbe deciso, e non lasciare il voto a chi possiede più emails. Avessi saputo prima che finiva così non avrei nemmeno partecipato, e sicuramente questa sarà l'ultima volta che lo farò.
      • Buongiorno a tutti. Come spiegato in questo post http://blog.elettronicain.it/2016/05/14/fishino-contest-via-alle-votazioni/ abbiamo voluto cambiare il metodo della votazione per evitare che qualcuno possa lamentarsi della scelta. Tempo fa facemmo un contest sui progetti realizzati con una stampante 3D, in quel caso scegliemmo noi il vincitore e le polemiche non mancarono. Pertanto abbiamo pensato che sarebbe stato più bello e più democratico far partecipare tutti alla votazione. I voti sono tutti tracciabili e verranno verificati attentamente (per quanto possibile) prima di stabilire quale sarà il vincitore. In ogni caso facciamo affidamento al buon senso e soprattutto all'onestà di tutti.
        • Capisco benissimo le vostre difficoltà (o peggio la vostra impotenza) nel controllare i voti (ip, validità delle email ect...) e per le polemiche nel caso in cui siate voi a decidere, ma sono d'accordo con FAITHO sul fatto che se avessi saputo che cambiavate il regolamento a concorso scaduto e che non eravate voi a decidere ma quello che fa il furbo, non avrei partecipato, perché non mi va di essere preso per il c... da un'altro utente che non solo si vota da solo ma per questo si da anche del "fottuto genio" in barba agli altri fessi onesti che hanno una persona reale dietro ogni loro voto.
          • E comunque se la maggioranza dei concorrenti è d'accordo propongo di ritornare al regolamento originale, preferisco perdere perché la redazione, che dopo pubblicherà gli articoli vincenti, non giudica il mio articolo meritevole che perdere contro un progetto che ha lo schematico disegnato con carta e penna (capite di che stiamo parlando) perché l'autore fa il furbo votandosi e commentandosi da solo
          • Va bene allora. Manderemo a breve una comunicazione a TUTTI i partecipanti. Se la maggioranza risponderà positivamente, la scelta del VINCITORE verrà effettuata esclusivamente e insidacabilmente dalla nostra Redazione. Un saluto a tutti.
          • Posso già anticipare che sia io che Riccardo Berra (gli autori del progetto radarino) siamo disposti ad accettare di buon grado anche l'ultimo posto se sarà la redazione a decretarlo. Capisco che l'apertura ad una votazione più democratica sembrasse inizialmente una buona idea, ma purtroppo per via dei recenti sviluppi siamo caduti dalla padella alla brace. :)
          • Gaspare, Faitho sono Pier Aisa e ritengo molto offensivo, quanto avete iscritto dicendo che i voti sono auto generati da casa. Chi ha scritto "fottuto genio" è un mio collega... Pensate a volte quanto l'invidia possa fare scrivere cose brutte ... Vi informo che ho un canale youtube sul quale ho caricato il video del progetto ed ho condiviso la pagina su facebook e quindi molti voti vengono proprio da li. Solo questo mese ho oltre 800 minuti di visualizzazione sul video youtube e ovviamente ho incitato a votare il mio progetto. Commento anche chi si è lamentato dello schema elettrico a matita. Se guardate il mio canale vedrete che è la mia tecnica. Il progetto non è fatto con un CAD 3D, ma per questo non vuol dire che l'idea sia buona e furba. Saluti P A Aisa
          • Gaspare, le cose non stanno come lei dice. Ritengo molto offensivo quanto ha scritto. Possiamo discutere sulla modalità di voto che si basa anche sulla popolarità e lasciato alla rete. Io ho messo il mio progetto su youtube facendone vedere il funzionamento on-line, ed i voti sono tutti autentici. E' facile verificarlo.
          • Pier io invece ritengo che a far il furbo si offenda l'intelligenza degli altri. Il tuo progetto alle 11:00 del 20 Luglio aveva 33 voti mentre alle 11:00 del 21 Luglio ne aveva 68, ha raddoppiato i suoi voti in 24h, capisco che youtube sia frequentato, capisco che facebook richiami l'attenzione ma il dubbio mi resta e spero che il mio dubbio non offenda nessuno. Ad ogni modo visto e considerato che il tuo progetto è geniale, è sublime, è il progetto più bello degli ultimi 100 anni, non credo che avrà problemi a vincere anche se la classifica la stili la redazione, giusto? Quindi propongo di tagliare la polemica facendo decidere alla redazione, ripristinando il regolamento iniziale. Sei d'accordo? Dimostraci la tua buona fede. Infine voglio essere chiaro su una cosa, non si tratta di invidia perché non ho motivo di invidiare i commenti di "zorzino", "bilbo1972", "Fabius" (ne ho preso qualcuno a caso) ect... che sicuramente saranno i migliori esperti in questo campo, ma semplicemente la presa in giro mi irrita.
  2. Ottimo! Sublime! Immagino che tutti questi fantastici commenti si riferiscano alla "ottima" capacità di imbrogliare, dai.. Se la redazione accetta questo tipo di comportamento impossibile da non notare (50 voti in 1 giorni tutti da 5 stelle) benissmo, però non si lamenti che la credibilità coli a picco. Con questo tipo di votazione era chiaro che qualcuno cercasse di fare in modo di imbrogliare, anche perchè il premio è piuttosto consistente.. Detto questo mi auguro che la redazione sia sicura di quel che faccia e che vinca il progetto più bello. Saluti
    • Buongiorno a tutti. Come spiegato in questo post http://blog.elettronicain.it/2016/05/14/fishino-contest-via-alle-votazioni/ abbiamo voluto cambiare il metodo della votazione per evitare che qualcuno possa lamentarsi della scelta. Tempo fa facemmo un contest sui progetti realizzati con una stampante 3D, in quel caso scegliemmo noi il vincitore e le polemiche non mancarono. Pertanto abbiamo pensato che sarebbe stato più bello e più democratico far partecipare tutti alla votazione. I voti sono tutti tracciabili e verranno verificati attentamente (per quanto possibile) prima di stabilire quale sarà il vincitore. In ogni caso facciamo affidamento al buon senso e soprattutto all'onestà di tutti.
  3. Ormai il 100° potevi dartelo, te ne sei dato 60 in 2 gg?!? Per il commento ti aiuto io: "Questo è il progetto più bello degli ultimi 150 anni".
  4. oooooOOOOOOLLLLLLLEEEEEEEEEE'. Alla fine sei riuscito a darti anche il 100esimo voto, dai che adesso aspettiamo anche l'ennesimo commento autocelebrativo e poi via si continua con i voti. Dai che ce la fai, contiamo tutti su di te. Sei il migliore.
  5. Buongiorno a tutti, come promesso ho mandato ai partecipanti una mail. In ogni caso invito tutti a mantenere i toni ad un livello consono. Ben vengano commenti e critiche tecniche, ma evitate frasi offensive o sarcastiche fuori luogo. Boris
  6. Questo è il mio commento conclusivo, perché sono deluso e stanco di questa sterile polemica che ha lo scopo di screditarmi e di mettere in cattiva luce il mio progetto. Io non devo dimostrare niente a nessuno: la valutazione dei progetti è affidata alla rete, come stabilito dal regolamento. L’arrivo concentrato di voti in così breve tempo potrebbe essere ricondotto al fatto che, negli ultimi giorni, ho chiesto a diversi conoscenti e colleghi di sponsorizzarmi, come immagino avranno fatto anche gli altri concorrenti. Lavoro da oltre 20 anni come progettista elettronico e mi rattrista molto vedere che, invece di interessanti spunti tecnici di discussione, appaiano insinuazioni e commenti offensivi. E’ compito della redazione, e non dei concorrenti, decidere come finalizzare il concorso nel rispetto del regolamento, che prevede un giudizio basato sulla popolarità e più democratico, anche per fare conoscere e diffondere il nome della rivista e le iniziative proposte. Il metodo usato in un precedente concorso, che lasciava interamente il giudizio finale alla redazione, ha ricevuto molte polemiche per mancanza di trasparenza, come spiegato dalla redazione stessa. Concludo sottolineando che non mi permetterei mai di screditare un progetto altrui o di mettere in discussione l’onestà di persone che amano questo lavoro e che si applicano con passione, come ho fatto io negli ultimi mesi per questo progetto.
    • Credo che la polemica non sia affatto sterile, come già detto personalmente ho partecipato al concorso perché sapevo da regolamento doveva essere la redazione a decidere altrimenti non avrei partecipato, perché partecipo ai concorsi da anni e so benissimo cosa accade quando si fa scegliere ad altre persone. Credo che come me tu prima di decidere se partecipare o meno abbia letto il regolamento, quindi mentre preparavi il progetto sapevi che avrebbe scelto la redazione e partecipando hai accettato questa condizione. Se vogliamo discutere di cose tecniche, allora dobbiamo far decidere a chi ha le competenze tecniche non alla mamma, alla nonna o la vicina di casa, io leggo Elettronica In da 10 anni e non ho mai visto pubblicato uno schematico fatto a matita e dispiace sentirmi dire "faccio il progettista elettronico da 20" perché io questo mestiere lo faccio da 10 di anni e so benissimo che se presento uno schema a matita il resto del mondo (ovviamente tecnici, non la mamma) poi mi prende in giro, ma forse parliamo di due elettroniche diverse. Non voglio e non volevo screditare il progetto di nessuno ma soltanto l'ondata, a mio parere, anomala di voti, che guardacaso oggi si è fermata (forse youtube è offline), l'unica cosa tecnica che ho commentato (la questione dello schematico appunto) l'ho tirata fuori proprio perché da regolamento il progetto vincitore dovrebbe venir pubblicato sulla rivista ed a quel punto immagino a cosa possa pensare il generico lettore mentre scopre che qualcuno ha vinto un concorso con uno schematico fatto a matita. Infine non metto in dubbio l'impegno con il quale ti sei applicato al progetto, ma ti faccio notare che gli altri non l'hanno trovato per strada, ma come te, ci hanno lavorato e vedersi annullati mesi di lavoro perché è cambiato il regolamento (in modo da far votare anche le nonne) ed un altro utente hai dei voti, a mio personalissimo parere, sospetti, non crea delusione ma ben altro. La delusione la crea il fatto che non accetti il fatto di metterti in gioco facendo scegliere la redazione. Ad ogni modo in bocca al lupo
  7. Ho votato per Fishino Joypad (essendo un'amica di Mattia) e anch'io ho chiesto ai miei contatti di votare il suo progetto. Ho seguito con entusiasmo le votazioni e poi vengo a scoprire che in meno di 24 h si passa da 33 voti a più di 60. Ma che bella figura di legno ho fatto con tutti i miei contatti ai quali ho chiesto di votare. P.S. I voti di accesscontrol si sono fermati nel momento in cui avete fatto notare il picco improvviso dei voti. Il canale youtube si è rotto?!?
  8. Sono un collega e un amico di Pier Aisa e ne conosco la assoluta corretteza. L'incremento repentino dei voti a favore di Pier è dovuto unicamente al fatto che Pier è conosciuto e stimato da un gran numero di persone e ovviamente il passa-parola ha funzionato bene. Probabilmente chi non riesce a ottenere così tanti consensi, non ha altrettanti conoscenti, amici, addirittura parenti, ma soprattutto estimatori. E preferisce rosicare che farsi un po' di propaganda.
    • O forse preferisce lasciar decidere a chi ha esperienza e competenza, come da regolamento, piuttosto che farsi propaganda con la zia o la nonna (ogni scarrafone è bell'a mamma soja). Non ritorno sulle anomalie dei voti perché ora che la maggioranza dei votanti ha deciso di lasciar decidere alla redazione, credo che sia annullata definitivamente ogni polemica sui voti e sulla correttezza dei concorrenti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu