including cpp-filer MPIDE (Uno32) "LÖST"

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

including cpp-filer MPIDE (Uno32) "LÖST"

Inlägg av SeniorLemuren »

Jag har en sketch där jag kan välja olika händelser ifrån- t.ex visa en sida med temperaturer eller en annan sida med tanknivåer. osv.

Jag har googlat runt men hittar ingen bra beskrivning om hur man skall tillverka C och H filen utifrån de 2 programmen som jag visar. Jag tyckte det var enkelt i MPASM men här hittar jag bara röriga beskrivnigar av folk som inte verkar veta så bra själva. Det är väl det som är det största problemet i Arduino-världen kan jag tänka.

Det är för mycket amatörprogrammerare (som jag) som gärna vill visa vad de kan (inte kan). Här på forumet vet jag att det finns bra kunskap så i stället för att googla runt i sophögen så frågar jag om hjälp här. :)

Hur jag skriver programmet som en enda sammansatt sketch är inga problem. Men jag skulle vilja ha alla olika valen i separata program som man ropar på i menydelen.

Menyvals-sketchen ser ut så här och det är i loopen i slutet på programmet jag vill ropa på de andra delprogrammen:

Kod: Markera allt

#include <UTouch.h>
#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];

// Set the pins to the correct ones for your development shield
UTFT myGLCD(ITDB32S,38,39,40,41);
UTouch myTouch(20,21,22,23,24);

int x, y;

// Setup the LCD
void setup()
{
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);  
  
  
  drawButtons();  
}

void drawButtons()
{
  myGLCD.fillScr(VGA_BLACK);
  // Draw the upper row of buttons
  y = 0;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("WATER TEMP",45,39+y);
  myGLCD.print("OIL TEMP",202,39+y);
  // Draw the second row of buttons
  y = 75 ;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("DIESELFUEL",44,39+y);
  myGLCD.print("FRESH WATER",192,39+y);
  // Draw the last row of buttons
  y = 150 ;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("RUDDER IND:",44,39+y);
  myGLCD.print("NEXT PAGE",200,39+y);
  
}

void loop()
{
  int y = 0;
  if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
    }
    if ((y>=20) && (y<=70)){  // Upper row
        UTFT_visa_sidan_1();
    }
    if ((y>=80) && (y<=160)){  // midle row
        UTFT_visa_sidan_2();
    }
    if ((y>=160) && (y<=210)){  // last row
        UTFT_visa_sidan_3();
    }
    
 
  
}
Där är tre olika händelser beroende på vilken area på displayen man pekar på. (UTFT_visa_sidan_1();UTFT_visa_sidan_2();(UTFT_visa_sidan_3;) De tre är sketcher som visar olika sidor. En sådan sida kan se ut så här när den 'är en körbar självständig sketch:
/* Ritar en pil 60 x 150 med centrum 30 x 125
* på en färgdiplay 240 x 320
*/
#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];


UTFT myGLCD(ITDB32S,38,39,40,41);
extern unsigned short roderpil[0x2328];

void setup()
{
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
myGLCD.fillScr(VGA_WHITE);
myGLCD.setColor(VGA_WHITE);
myGLCD.drawBitmap (130, 80, 60, 150, roderpil,90,30,125);


}

void loop()
{
Senast redigerad av SeniorLemuren 23 mars 2015, 12:25:08, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46823
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: including cpp-filer MPIDE (Uno32)

Inlägg av TomasL »

Tja du skriver de olika funktionerna i olika C-filer med lämplig texeditor, dessa filer sparar du i projektets sökväg.
Sedan skriver du ett antal H-filer, en för varje C-fil, dessa innehåller då prototyperna iför funktionerna i resp C-fil, samt de variabler som kan tänkas vara globala.
Sedan inkluderar du dessa H-filer i de C-filer som skall använda dess funktioner (samt i den egna C-filen också).
Viktigt är att både c och h-filer är inkluderade i projektet samt att sökvägar är korrekt satta.
Till exempel:
Main.c och Main.h
GLCD.c och GLCD.h
func1.c och func1.h
func2.c och func2.h

Ponera att main anropar funtioner i func1, func2 och GLCD
func1 anropar funktioner i func2

då skall du i main.c ha

Kod: Markera allt

#include "main.h"
#include "GLCD.H"
#include "func1.h
#include "func2.h"
I func1.c skall du ha

Kod: Markera allt

#include "func1.h"
#include "func2.h"
I func2.c skall du ha

Kod: Markera allt

#include "func2.h"
I GLCD.c skall du ha

Kod: Markera allt

#include "GLCD.h"
I varja .h fil skall du ha

Kod: Markera allt

#ifndef FILNAMN
#define FILNAMN
dina prototyper osv

#endif
/*************E.O.F**************/
Varför använder du inte MPLAB istället.
nifelheim
Den första
Inlägg: 2474
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: including cpp-filer MPIDE (Uno32)

Inlägg av nifelheim »

du lägger dom i separata flikar, klicka på pilen till höger

se även:
http://arduino.cc/en/Hacking/BuildProcess
A sketch can contain multiple files (tabs). To manage them, click on the right-facing arrow just above the scroll bar near the top of the environment. Tabs have one of four extensions: no extension, .c, .cpp, or .h (if you provide any other extension, the period will be converted to an underscore). When your sketch is compiled, all tabs with no extension are concatenated together to form the "main sketch file". Tabs with .c or .cpp extensions are compiled separately. To use tabs with a .h extension, you need to #include it (using "double quotes" not <angle brackets>).
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Får det inte att fungera. Kompileringen går igenom utan anmärkning. Menyn kommer upp på skärmen och menyval 2 och 3 funkar som dom skall men inte menyval 1 som skall visa roderpilen i separat CPP-fil. Om jag kör CPP-filen som en sketch så fungerar den separat. Så det borde vara något fel i hur jag skrivit Headerfilen eller hur jag anropar CPP-rutinen i från Menyprogrammet.

Bifoga Menyprogrammet, Headerfilen och CPP-filen. Hoppas någon som kan Arduinos MPIDE kan se vad som går fel.

Att jag inte använder MPLAB X beror på att det library jag använder för Display, pekskärm och SD-minne är gjort för CHIPkit Uno32 och fungerar bra. Jag vet i och för sig inte om det finns något liknande som är lika lätt att hantera i MPLAB x men jag tvivlar starkt på det.

Kod: Markera allt

//**********Menyprogrammet**********
//************* UTFT_huvudmeny **********
// ******I slutet på programmet finns de anrop som görs***** 
#include <UTouch.h>
#include <UTFT.h>
#include "UTFT_visa_roder.h"

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t BigFont[];

// Set the pins to the correct ones for your development shield
UTFT myGLCD(ITDB32S,38,39,40,41);
UTouch myTouch(20,21,22,23,24);

int x, y;

// Setup the LCD
void setup()
{
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);  
  
  
  drawButtons();  
}

void drawButtons()
{
  myGLCD.fillScr(VGA_BLACK);
  // Draw the upper row of buttons
  y = 0;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("WATER TEMP",45,39+y);
  myGLCD.print("OIL TEMP",202,39+y);
  // Draw the second row of buttons
  y = 75 ;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("DIESELFUEL",44,39+y);
  myGLCD.print("FRESH WATER",192,39+y);
  // Draw the last row of buttons
  y = 150 ;
  for (x=0; x<2; x++)
  {
    myGLCD.setColor(VGA_RED);
    myGLCD.fillRoundRect (15+(x*150), 17+y, 153+(x*150), 73+y);
    myGLCD.setColor(VGA_BLUE);
    myGLCD.fillRoundRect (18+(x*150), 20+y, 150+(x*150), 70+y);
    
    myGLCD.setBackColor(VGA_BLUE);
    myGLCD.setColor(VGA_YELLOW);    
  } 
  myGLCD.print("RUDDER IND:",44,39+y);
  myGLCD.print("NEXT PAGE",200,39+y);
  
}

void loop()
{
  int y = 0;
  if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
    }
    if ((y>=20) && (y<=70)){  // Visa roderpilen (funkar inte)
       void draw_arrow();
    }
    if ((y>=80) && (y<=160)){  // visa bara röd skärm (funkar)
        myGLCD.fillScr(VGA_RED);
    }
    if ((y>=160) && (y<=210)){  // tillbaka till menyknapparna (funkar) 
        drawButtons();
    } 
}

Kod: Markera allt


/****** UTFT_visa_roder.CPP ******************************
/***** program som visar en bild på en pil. 
(fungerar som självständig sketch) ***************************/
#include <UTFT.h>
#include "UTFT_visa_roder.h"

// Declare which fonts we will be using
extern uint8_t SmallFont[];


UTFT myGLCD(ITDB32S,38,39,40,41);
extern unsigned short roderpil[0x2328];

void setup()
{
  myGLCD.InitLCD();
  myGLCD.setFont(SmallFont);
  myGLCD.fillScr(VGA_WHITE);
  myGLCD.setColor(VGA_WHITE);  
}

void draw_arrow(){     
    myGLCD.drawBitmap (130, 80, 60, 150, roderpil,90,30,125);   
}

void loop()
  {
   //draw_arrow();// Detta använde jag bara när jag testade som fristående sketch.
  }  

Kod: Markera allt

/*** headerfilen UTFT_visa_roder.h *****
#ifndef UTFT_visa_roder_h
#define UTFT_visa_roder_h

void draw_arrow();

#endif 

mpide_menyprog.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: including cpp-filer MPIDE (Uno32)

Inlägg av mri »

Du har definierat setup() och loop() flera gånger i samma projekt. Det är ju som att definiera flera main(). Feltänk!
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Ok. För att göra frågan väääldigt mycket enklare att svara på då. Hur skall CPP-filen och Headerfilen se ut för att det skall ritas en pil på displayen när man pekar på första pek_arean i Menyprogrammet. Att få reda på att det är felprogrammerat är jag inte hjälpt av. Det vore bättre att få ett förslag på hur det skall se ut.

Eftersom menyprogrammet fungerar så antar jag att det inte behöver ändras. Det vore då förträffligt att få någon som kan detta, tala om hur CPP och H filerna skall se ut. (Som kan Arduino).

Jag har nu tagit bort setup() och loop() från CPP-filen, den ser nu ut så här:

Kod: Markera allt

#include "UTFT_visa_roder.h"

void draw_arrow(){     
    myGLCD.drawBitmap (130, 80, 60, 150, roderpil,90,30,125);   
}
och H-filen så här:

Kod: Markera allt

#ifndef UTFT_visa_roder_h
#define UTFT_visa_roder_h

void draw_arrow();

#endif
Jag får inga fel i kompileringen men fortfarande händer inget bär ja pekar på menyval ett. De andra menyvalen funkar.

Själva valet i menyprorammet set ut så här

Kod: Markera allt

void loop()
{
  int y = 0;
  if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
    }
    if ((y>=20) && (y<=70)){  // Visa roderpilen (funkar inte)
       void draw_arrow();
    }
    if ((y>=80) && (y<=160)){  // visa bara röd skärm (funkar)
        myGLCD.fillScr(VGA_RED);
    }
    if ((y>=160) && (y<=210)){  // tillbaka till menyknapparna (funka 
        drawButtons();
    }
  
}
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: including cpp-filer MPIDE (Uno32)

Inlägg av Icecap »

När du skriver "void draw_arrow();" deklarerar du en rutin, du kallar den inte.

Ta bort void.
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Har testat både med och utan, inget alternativ funkar. Det är därför jag efterlyser en lösning från någon som VERKLIGEN kan programmera Arduino via MPIDE men de som kan växer tydligen inte på träd eller så har de inte vaknat ännu. :)
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: including cpp-filer MPIDE (Uno32)

Inlägg av Icecap »

Har du kollat att den verkligen kommer till rutinen?
Och stannar där länga nog till att rita klart och inte hoppar tillbaka efter en snabb ritning och sedan visande av menyn igen?
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Ingen reaktion när man pekar på menyval1 kan märkas.

Anyway. Jag har hittat en beskrivning på nätet som ser ut så här.

CPP-filen:

Kod: Markera allt

#include "UTFT_visa_roder.h"

rclass::rclass(){
}

void rclass::draw_arrow(){
    myGLCD.InitLCD();
    myGLCD.setFont(SmallFont);
    myGLCD.fillScr(VGA_WHITE);
    myGLCD.setColor(VGA_WHITE);   
    myGLCD.drawBitmap (130, 80, 60, 150, roderpil,90,30,125);   
}
rclass pil = rclass();
Header-filen:

Kod: Markera allt

#ifndef UTFT_visa_roder_h
#define UTFT_visa_roder_h

class rclass{
  public:
    rclass();
    void draw_arrow();
};
extern rclass pil;

#endif 
Jag anropar med: << pil.draw_arrow();>> i huvudprogrammet.

får felmeddelande:
C:\Documents and Settings\Owner\My Documents\mpide\libraries\UTFT\UTFT.cpp:63:68: note: #pragma message: Compiling for chipKIT UNO32 (PIC32MX320F128H)
UTFT_Huvudmeny.cpp.o: In function `loop':
C:/Documents and Settings/Owner/Local Settings/Temp/build4957946601316505415.tmp/UTFT_Huvudmeny.cpp:90: undefined reference to `rclass::draw_arrow()'
C:/Documents and Settings/Owner/Local Settings/Temp/build4957946601316505415.tmp/UTFT_Huvudmeny.cpp:90: undefined reference to `pil'
collect2: ld returned 1 exit status
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: including cpp-filer MPIDE (Uno32)

Inlägg av Icecap »

Du skapar en klass av typen rclass. I den finns det funktioner som verkar vara en sekvens som initierar skärmen (är inte det redan gjort?), därnäst sätter fond (det borde väl vara klart redan), sedan fylls skärmen med vitt, ritfärgen sätts till vit och sedan ska pilen ritas.

MEN - vad gör den sedan?

Om programmet når att göra allt detta och sedan komma tillbaka till menyn innan skärmen hinner med ser du knappast annat än ett litet blink på skärmen eller hur?
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Ja det spelar ju inte så stor roll vad den gör sedan eftersom den inte ens går att kompilera. Om den hade gjort det så hade det ingen betydelse i fall jag gjorde om initieringen även om det inte behövdes. Sedan när den kommer tillbaka till huvudrutinen så gör den ingenting antar jag. Förrän det kommer in ett nytt pekvärde i vänteloopen i menyprogrammet som talar om vad dcen skall gör. Men så långt har jag altså inte kommit.

Den enda gången kompileringen gick igenom var när jag skrivit void framför anropet. Vilket ju var fel.

Jag får väl vänta med detta tills någon kunnig på MPIDE för Arduino vaknar. Fram till nu har det bara blivit mer frågor än svar tyvärr.

Det är i och för sig lite konstigt att ingen Arduinofreak har vaknat. Om det kommer upp frågor om vilket som är bäst Ardino eller PIC så blir man nertrampad av alla Arduinoexperter på forumet på kort tid. Men nu är det dödstyst. :)
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: including cpp-filer MPIDE (Uno32)

Inlägg av johano »

Hur initieras variabeln "roderpil"? Är det något som ska länkas in?

/johan
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: including cpp-filer MPIDE (Uno32)

Inlägg av mri »

Jag tror du borde lära dig grunderna i c först före du ger dig på svårare saker. Börja med att blinka diod, och då menar jag att du faktiskt förstår vad som händer i hela ditt arduino program. Sen blinka dioden från en annan funktion än loop(). Sen flytta den funktionen till en annan fil, osv...
Som det är nu gissar du dig fram...
Användarvisningsbild
SeniorLemuren
Inlägg: 8335
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: including cpp-filer MPIDE (Uno32)

Inlägg av SeniorLemuren »

Det är en inlänkad C_fil som innehåller kordinaterna till den grafiska pil som skall ritas på displayen. Om du tittar på bilden av MPIDE så ser du att den finna med. Hur har den med det som går fel att göra.
Skriv svar