Community
cancel
Showing results for 
Search instead for 
Did you mean: 
AGUIM2
New Contributor I
2,165 Views

C++ library of touch display (4D systems) for edison

Hello guys,

I'm trying to write a library to drive 4D systems touch display in c++ eclipse with intel Edison board Arduino. But after written my code and exacuted mu program, nothing happens on the screen. Some one can tell me what is the problem in my code and how to resolve it, please? Here is my code below:

***********************GenieEdison.hpp**************************

/*

* GenieEdison.hpp

*

* Created on: 28 avr. 2016

* Author: Utilisateur

*/

# ifndef GENIEEDISON_HPP_

# define GENIEEDISON_HPP_

# include

# include "mraa.hpp"

# include

# include "stdio.h"

# include

# include

# include

# undef GENIE_DEBUG

# define GENIE_VERSION "GenieEdison 27-April-2016"

// Genie commands & replys:

# define GENIE_ACK 0x06

# define GENIE_NAK 0x15

# define TIMEOUT_PERIOD 500

# define RESYNC_PERIOD 100

# define GENIE_READ_OBJ 0

# define GENIE_WRITE_OBJ 1

# define GENIE_WRITE_STR 2

# define GENIE_WRITE_STRU 3

# define GENIE_WRITE_CONTRAST 4

# define GENIE_REPORT_OBJ 5

# define GENIE_REPORT_EVENT 7

// Objects

// the manual says:

// Note: Object IDs may change with future releases; it is not

// advisable to code their values as constants.

# define GENIE_OBJ_DIPSW 0

# define GENIE_OBJ_KNOB 1

# define GENIE_OBJ_ROCKERSW 2

# define GENIE_OBJ_ROTARYSW 3

# define GENIE_OBJ_SLIDER 4

# define GENIE_OBJ_TRACKBAR 5

# define GENIE_OBJ_WINBUTTON 6

# define GENIE_OBJ_ANGULAR_METER 7

# define GENIE_OBJ_COOL_GAUGE 8

# define GENIE_OBJ_CUSTOM_DIGITS 9

# define GENIE_OBJ_FORM 10

# define GENIE_OBJ_GAUGE 11

# define GENIE_OBJ_IMAGE 12

# define GENIE_OBJ_KEYBOARD 13

# define GENIE_OBJ_LED 14

# define GENIE_OBJ_LED_DIGITS 15

# define GENIE_OBJ_METER 16

# define GENIE_OBJ_STRINGS 17

# define GENIE_OBJ_THERMOMETER 18

# define GENIE_OBJ_USER_LED 19

# define GENIE_OBJ_VIDEO 20

# define GENIE_OBJ_STATIC_TEXT 21

# define GENIE_OBJ_SOUND 22

# define GENIE_OBJ_TIMER 23

# define GENIE_OBJ_SPECTRUM 24

# define GENIE_OBJ_SCOPE 25

# define GENIE_OBJ_TANK 26

# define GENIE_OBJ_USERIMAGES 27

# define GENIE_OBJ_PINOUTPUT 28

# define GENIE_OBJ_PININPUT 29

# define GENIE_OBJ_4DBUTTON 30

# define GENIE_OBJ_ANIBUTTON 31

# define GENIE_OBJ_COLORPICKER 32

# define GENIE_OBJ_USERBUTTON 33

// Structure to store replys returned from a display

# define GENIE_FRAME_SIZE 6

struct genieFrameReportObj {

uint8_t cmd;

uint8_t object;

uint8_t index;

uint8_t data_msb;

uint8_t data_lsb;

};

/////////////////////////////////////////////////////////////////////

// The Genie frame definition

//

// The union allows the data to be referenced as an array of uint8_t

// or a structure of type genieFrameReportObj, eg

//

// genieFrame f;

// f.bytes[4];

// f.reportObject.data_lsb

//

// both methods get the same byte

//

union genieFrame {

uint8_t bytes[GENIE_FRAME_SIZE];

genieFrameReportObj reportObject;

};

# define MAX_GENIE_EVENTS 16 // MUST be a power of 2

# define MAX_GENIE_FATALS 10

struct genieEventQueueStruct {

genieFrame frames[MAX_GENIE_EVENTS];

uint8_t rd_index;

uint8_t wr_index;

uint8_t n_events;

};

typedef void (*geniePutCharFuncPtr) (uint8_t c, uint32_t baud);

typedef uint16_t (*genieGetCharFuncPtr) (void);

typedef void (*genieUserEventHandlerPtr) (void);

# define ERROR_NONE 0

# define ERROR_TIMEOUT -1 // 255 0xFF

# define ERROR_NOHANDLER -2 // 254 0xFE

# define ERROR_NOCHAR -3 // 253 0xFD

# define ERROR_NAK -4 // 252 0xFC

# define ERROR_REPLY_OVR -5 // 251 0xFB

# define ERROR_RESYNC -6 // 250 0xFA

# define ERROR_NODISPLAY -7 // 249 0xF9

# define ERROR_BAD_CS -8 // 248 0xF8

# define GENIE_LINK_IDLE 0

# define GENIE_LINK_WFAN 1 // waiting for Ack or Nak

# define GENIE_LINK_WF_RXREPORT 2 // waiting for a report frame

# define GENIE_LINK_RXREPORT 3 // receiving a report frame

# define GENIE_LINK_RXEVENT 4 // receiving an event frame

# define GENIE_LINK_SHDN 5

# define GENIE_EVENT_NONE 0

# define GENIE_EVENT_RXCHAR 1

# ifndef TRUE

# define TRUE (1==1)

# define FALSE (!TRUE)

# endif

void SetupGenie(void);

void genieAttachEventHandler (genieUserEventHandlerPtr handler);

extern bool genieDequeueEvent (genieFrame * buff);

extern bool genieEventIs (genieFrame * e, uint8_t cmd, uint8_t object, uint8_t index);

extern uint16_t genieGetEventData (genieFrame * e);

extern void genieWriteObject (uint16_t object, uint16_t index, uint16_t data);

extern uint16_t genieWriteStr (uint16_t index, char *string);

extern void genieWriteContrast (uint16_t value);

# endif /* GENIEEDISON_HPP_ */

*********************************GenieEdison.cpp**************************************************

/*

* GenieEdison.cpp

*

* Created on: 28 avr. 2016

* Author: Utilisateur

*/

# include "GenieEdison.hpp"

using namespace std;

mraa_uart_context Screen;

void _genieFlushEventQueue ...

6 Replies
KEckh
Valued Contributor III
229 Views

Sorry, not sure I can help much here as I have not done much with Edison for maybe a year, hoping the the SPI issues were resolved. Hopefully some others might be able to give you a hand,

It would probably help to have additional information, like: What display you have, how do you have it hooked up.

Also would help to know what have you tried? Is this all brand new code or is it adapted from some other code base?

If other code base, do they have a simple test program, that maybe just clears the screen and if color maybe fills screen with different colors?

Is nothing being displayed or is the program hanging? May want to add some debug outputs to see where the code goes.

For example maybe you are calling the flush the input queue function, which calls read on the input stream and your code is assuming that the read is non blocking, but maybe the stream is blocking and as such you just hang there...

Again sorry I can not help more.

Good luck

idata
Community Manager
229 Views

Hi Guimficus,

 

 

As Kurt said, could you provide us more information regarding to your library, project, environment, sources and others? Let us know if you have been able to work on this and the outcome of it.

 

 

Regads,

 

Charlie

 

AGUIM2
New Contributor I
229 Views

Hello Guys, sorry for my absence.

The display I have is the uLCD 35-DT for 4D Systems. I controlled it by the serial communication using 5 wires (+5V, RX, TX, GND, RESET). With this touch screen, there are 4 maners to provide the objects and informations you want to display. I choose the Visie-Genie which I have to drag and drop the pre-coded objects and layout the screen as required. Il is similar to a visual development environment.

Before I was using the Arduino card with his environment of programmation. But, in fact of lack of ressources and dimensions, I changed to the edison module and also the IDE to able to use the MRAA library. But I did not want to change the display. So I was looking for another library in C++ to control the display with Eclipse C++, but I did not find. I decided to adapt to my case, the library (for Arduino IDE) writen by the 4D system members. But I can just display the first window with is displayed by default when the screen is power supplied.This is an example on Arduino where some strings is displayed:

 

/**********************************************************************************

* Write String Test - Demo application

* This demo simply illustrates the various ways you can now send data to a String

* object in ViSi-Genie, from an Arduino.

*

* Demo uses Hardware Serial0 to communicate with the 4D Systems display module.

* Simply create a Workshop4 Genie application for your 4D Systems display module,

* and place a 'Strings' object on the display, and download it to your module.

*

* PLEASE NOTE: If you are using a non-AVR Arduino, such as a Due, or other variants

* such as a Chipkit or Teensy, then you will need to comment out the Flash String

* line below - Line 60, as it will prevent the demo from compiling.

*/

# include

Genie genie;

# define RESETLINE 4 // Change this if you are not using an Arduino Adaptor Shield Version 2 (see code below)

// Setup function

void setup()

{

// NOTE, the genieBegin function (e.g. genieBegin(GENIE_SERIAL_0, 115200)) no longer exists.

// Use a Serial Begin and serial port of your choice in your code and use the genie.Begin function to send

// it to the Genie library (see this example below)

// max of 200K Baud is good for most Arduinos. Galileo should use 115200 or below.

Serial.begin(9600); // Serial0 @ 9600 Baud

genie.Begin(Serial); // Use Serial0 for talking to the Genie Library, and to the 4D Systems display

// Reset the Display (change D4 to D2 if you have original 4D Arduino Adaptor)

// THIS IS IMPORTANT AND CAN PREVENT OUT OF SYNC ISSUES, SLOW SPEED RESPONSE ETC

// If NOT using a 4D Arduino Adaptor, digitalWrites must be reversed as Display Reset is Active Low, and

// the 4D Arduino Adaptors invert this signal so must be Active High.

pinMode(RESETLINE, OUTPUT); // Set D4 on Arduino to Output (4D Arduino Adaptor V2 - Display Reset)

digitalWrite(RESETLINE, 1); // Reset the Display via D4

delay(100);

digitalWrite(RESETLINE, 0); // unReset the Display via D4

delay (3500); //let the display start up after the reset (This is important)

}

// Main loop

void loop()

{

//An optional third parameter specifies the base (format) to use; permitted values are BIN (binary, or base 2), OCT (octal, or base 8), DEC (decimal, or base 10), HEX (hexadecimal, or base 16).

//For floating point numbers, this parameter specifies the number of decimal places to use.

int x = -78;

long y = 171;

double z = 175.3456;

int digits = 3;

String Str = "This is string class";

genie.WriteStr(0, "TEST");

delay(1000);

genie.WriteStr(0, z, digits); //3 decimal places

delay(1000);

genie.WriteStr(0, 123.45678, 5); // 5 decimal places

delay(1000);

genie.WriteStr(0, 123.45678); // 2 decimal places by default if no value is given to decimal place.

delay(1000);

genie.WriteStr(0, F("This string will be \n stored in flash memory")); // For AVR Arduinos only - Needs to be commented out for Due, Chipkit, Teensy etc.

delay(1000);

genie.WriteStr(0, " "); // Clear

delay(10);

genie.WriteStr(0, x); //prints negative integer

delay(1000);

genie.WriteStr(0, y);

delay(1000);

genie.WriteStr(0, -x, BIN); //base 2 of 78

delay(1000);

genie.WriteStr(0, y,16); //base 16

delay(1000);

genie.WriteStr(0, 10); //base 10 by default

delay(1000);

genie.WriteStr(0, 10,8); //base 8

delay(1000);

genie.WriteStr(0, Str); //prints String Class

delay(1000);

unsigned int zc = 123 ;

genie.WriteStr(0, zc); //prints unsigned ints

delay(1000);

unsigned long e = 1234 ;

genie.WriteStr(0, e); //prints unsigned long

delay(1000);

}

For more examples you can look on the page: https://github.com/4dsystems/ViSi-Genie-Arduino-Library GitHub - 4dsystems/ViSi-Genie-Arduino-Library: ViSi-Genie - Arduino Library

I think that my problem is coming on the setup of serial communication but I could be wrong. Tell me what you thing and if you have some ideas please.

AGUIM2
New Contributor I
229 Views

This is a picture of my installation with the first window displayed by defauft when the screen is power supplied.

KEckh
Valued Contributor III
229 Views

Again I don't have any of the hardware to hook this up... As I mentioned my Edison Arduino board smoked...

Again I would probably scatter some debug prints in key points in the code... I would also hook up logic Analyzer to see what is being output to the UART and if anything is coming back and the state of the reset line... (But that is cheating :lol: - I always keep a Saleae Logic analyzer handy for things like this ).

Have you tried running this using the debugger with Eclipse?

Like set a breakpoint at Main, do you hit this breakpoint?

Set a breakpoint after your call to SetupGenie. Did you hit this one? ... Can probably also try debug step functions to see if the code is being executed or are you hanging somewhere.

Good Luck

Edit: Forgot to mention that MRAA with Uart has changed a lot since I last looked. Back then it was more or less an empty class. So I mostly did stuff using termios code.

If you are getting a hang, one of the things I would look at trying in your init code is to make sure the uart is not set to blocking...

SetNonBlocking(bool nonblock);

AGUIM2
New Contributor I
229 Views

Hello KurtE, thks for reply.

What you advice me is exactly what I intended to do when I will receive my order of the Logic analyzer. I don't have it for the moment.

Reply