#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

#define fszam 6 // Funkciok szama
#define nev_ 0
#define inc_ 1
#define iut_ 2
#define set_ 3
#define se2_ 4
#define lop_ 5
#define fajlnev "d://sablon.ino"

//Tipusdefiniciok
typedef char nev_type[40];
typedef struct
  {
      char azo[4];
      nev_type nev[6];
  }funksor;

// Globalis altozok
int i; //altalanosan hasznalt szamlalo
char * pch; // altalanosan hasznalt mutato
FILE * fp; //fajl mutato
funksor funk[fszam] =
  {
      {"lcd",{"folyadekkristalyos kijelzo","LiquidCrystal.h","LiquidCrystal lcd(8, 9, 4, 5, 6, 7)","lcd.begin(16, 2)","",""}},
      {"twi",{"I2C/TWI interfesz","Wire.h","","Wire.begin()","","Wire.beginTransmission(cim)"}},
      {"sor",{"Soros interfesz","","","Serial.begin(9600)","",""}},
      {"bil",{"Billentyuzet emulacio","","","Keyboard.begin()","",""}},
      {"ege",{"Eger emulacio","","","Mouse.begin()","",""}},
      {"mag",{"HMC5883L magneses erzekelo","I2Cdev.h> \ninclude <HMC5883L.h","HMC5883L mag","mag.initialize()","","mag.getHeading(&mx, &my, &mz)"}}
  };
  char parlista[100]; // Parameterlista

void beir(int, nev_type);
void beirsz(nev_type);

void main()
{
    printf("Arduino sablonkeszito \n\nHasznalhato parameterek: \n\n");
    for (i=0; i<=(fszam-1); i++)
    {
      printf("%s: %s\n", funk[i].azo, funk[i].nev[nev_]);
    };
    printf("\nKerem a parameterlistat: ");
    scanf("%s",&parlista);
    printf("\n\n");
    //printf("%s\n\n", parlista);

    // program automatikus irasa

    fp=fopen(fajlnev,"w");
    beir(nev_,"// %s\n");
    beirsz("\n");
    beir(inc_,"include <%s>\n");
    beirsz("\n");
    beir(iut_,"%s;\n");
    beirsz("\n");
    beirsz("void setup() \n{\n");
    beir(set_,"  %s;\n");
    beir(se2_,"  %s;\n");
    beirsz("}\n\n");
    beirsz("void loop() \n{\n");
    beir(lop_,"  %s;\n");
    beirsz("}\n\n");
    fflush(fp);
    fclose(fp);
    printf("Arduino sablon letrehozva, %s helyen megtalalhato.\n\n",fajlnev);

    return;
}

void beir(int mit, nev_type hogyan) // Ha a parameterlistaban szerepel az adott parameter beirja a megfelelo sort.
{
  for (i=0; i<=(fszam-1); i++)
  {
      pch=strstr(parlista, funk[i].azo);
      if (pch && funk[i].nev[mit][0])
      {
          printf(hogyan,funk[i].nev[mit]);
          fprintf(fp,hogyan,funk[i].nev[mit]);
      }
  }

  return;
}

void beirsz(nev_type szoveg) // Szoveget ir be a fajlba, es ir ki a kepernyore.
{
    printf(szoveg);
    fprintf(fp,szoveg);
    return;
}