EV3 C-code for third party devices (I2C)
Re: EV3 C-code for third party devices (I2C)
Yes, I want to figure why the compiler is trying to use or generate lms2012.o. In a C program you end up including many files (.h) that only have function/constant definitions (as lms2012.h). But, it does not mean that there will be a need to generate an object file (.o). My guess is that there is something that you set (or added) that is directing the compiler to want lms2012.o
Lauro
http://www.robotnav.com
http://www.robotnav.com
Re: EV3 C-code for third party devices (I2C)
hi,
now the reason is both incomprehensible and embarrassing:
in the beginning I had copied all ev3_*.c files to the project manager window by mouse (mark + copy), and by mistake I accidentally had also copied the lms2012.h file although I know that it must not.
I had observed this very quickly already some days ago, clicked at lms2012.h and then chose "remove". It dissappeared from that window, and I closed it.
But the error remained the same all the time.
Now checking the project manager window again, the lms2012.h file appeared again - I removed it again, closed the window, compiled,...: still the same error.
Again checking the project manager window now, the lms2012.h file again was listed - I removed it again, closed the window, compiled - and now it's fine.
So the lms2012.h file seems to have not been removed permanently, although initially it had disappeared out of the window, that is the incomprehensible part.
The embarrassing part is that I didn't have checked it before by myself, but I didn't I come up with the idea that my file remove action may had failed.
I realy hope that this project manager thing could be sacrificed one day completely for the pure API header functions, that's way too intransparent IMO...
I then exchanged sleep by msleep for having quick 5ms loops
now also this thing is fine.
so this is the current version:
But I'm looking forward now to try to use the NXT US sensors for some experiments.
now the reason is both incomprehensible and embarrassing:
in the beginning I had copied all ev3_*.c files to the project manager window by mouse (mark + copy), and by mistake I accidentally had also copied the lms2012.h file although I know that it must not.
I had observed this very quickly already some days ago, clicked at lms2012.h and then chose "remove". It dissappeared from that window, and I closed it.
But the error remained the same all the time.
Now checking the project manager window again, the lms2012.h file appeared again - I removed it again, closed the window, compiled,...: still the same error.
Again checking the project manager window now, the lms2012.h file again was listed - I removed it again, closed the window, compiled - and now it's fine.
So the lms2012.h file seems to have not been removed permanently, although initially it had disappeared out of the window, that is the incomprehensible part.
The embarrassing part is that I didn't have checked it before by myself, but I didn't I come up with the idea that my file remove action may had failed.
I realy hope that this project manager thing could be sacrificed one day completely for the pure API header functions, that's way too intransparent IMO...
I then exchanged sleep by msleep for having quick 5ms loops
Code: Select all
inline void msleep(unsigned int msec) {usleep(msec*1000);}
so this is the current version:
Code: Select all
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include "lms2012.h"
#include "ev3_button.h"
#include "ev3_lcd.h"
//Runtime constants
//Global variables and constants used by the sensor handling functions
inline void msleep(unsigned int msec) {usleep(msec*1000);}
IIC *pXgl;
//***************************************************************************************
// Microinfinity XG1300L IMU settings
const int XGL_PACKET_SIZE = 10; // 2(gyyro angle)+2(gyro rate)+2(acc x)+2(acc y)+2(acc z)
const char XGL_PORT = 0x3; // The ports are designated as XGL_PORT_NUMBER-1
int xgl_device_file;
//***************************************************************************************
int init_xg1300l_gyro()
{
IICDAT IicDat;
char buf[120];
//Open the device xgl_device_file
if((xgl_device_file = open(IIC_DEVICE_NAME, O_RDWR | O_SYNC)) == -1) {
sprintf(buf, "Failed to open device");
LcdText(1, 0, 60, buf);
return 0;
}
pXgl = (IIC*)mmap(0, sizeof(IIC), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, xgl_device_file, 0);
if (pXgl == MAP_FAILED) {
sprintf(buf, "Map failed");
LcdText(1, 0, 60, buf);
return 0;
}
//Setup IIC to read 2 packets
IicDat.Port = XGL_PORT;
IicDat.Time = 0;
IicDat.Repeat = 0;
IicDat.RdLng = XGL_PACKET_SIZE;
IicDat.WrLng = 2;
// Set the device I2C address
IicDat.WrData[0] = 0x01;
// Specify the register that will be read (0x42 = angle)
IicDat.WrData[1] = 0x42;
// Setup I2C comunication
ioctl(xgl_device_file,IIC_SETUP,&IicDat);
sprintf(buf,"Device is ready");
LcdText(1, 0, 60, buf);
return 1;
}
void get_xg1300l_gyro(float *angle, float *rate, float *acc_x, float *acc_y, float *acc_z)
{
//Compute angle, angular rate and accelerations
*acc_z = (pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][0]*256+pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][1])/100.0;
*acc_y = (pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][2]*256+pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][3])/100.0;
*acc_x = (pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][4]*256+pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][5])/100.0;
*rate = (pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][6]*256+pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][7])/100.0;
*angle = (pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][8]*256+pXgl->Raw[XGL_PORT][pXgl->Actual[XGL_PORT]][9])/100.0;
}
void close_xg1300l_gyro() //Close the device xgl_device_file
{
char buf[120];
sprintf(buf,"Closing device\n");
LcdText(1, 0, 60, buf);
close(xgl_device_file);
}
int main()
{
char buf[120];
float angle;
float rate;
float acc_x;
float acc_y;
float acc_z;
ButtonLedInit();
LcdInit();
LcdClean();
if(!init_xg1300l_gyro())
return -1;
LcdClean();
while(1)
{
get_xg1300l_gyro(&angle, &rate, &acc_x, &acc_y, &acc_z);
sprintf(buf,"Angle= %6.2f deg ", angle);
LcdText(1, 0, 10, buf);
sprintf(buf,"Rate = %6.2f deg/sec ", rate);
LcdText(1, 0, 20, buf);
sprintf(buf,"AccX = %6.2f G ", acc_x);
LcdText(1, 0, 40, buf);
sprintf(buf,"AccY = %6.2f G ", acc_y);
LcdText(1, 0, 50, buf);
sprintf(buf,"AccZ = %6.2f G ", acc_z);
LcdText(1, 0, 60, buf);
if(ButtonWaitForAnyPress(100) == BUTTON_ID_ESCAPE)
break;
msleep(5);
}
close_xg1300l_gyro();
LcdExit();
ButtonLedExit();
return 1;
}
Re: EV3 C-code for third party devices (I2C)
There seems to be a glitch in the project manager, sometimes it looks like it removes things but actually doesn't. Also, it has weird highlighting issues, if you right click on an item it doesn't actually highlight it, so it works differently from what one would expect.
Re: EV3 C-code for third party devices (I2C)
strange -
after a while I tried to compile this code from above again and now get lots of errors - what's possibly wrong?
ev3_timer.c / button.c / command.c / lcd.c / output.c / sound.c
after a while I tried to compile this code from above again and now get lots of errors - what's possibly wrong?
the project manager lists:In file included from ev3_button.h:46,
from XG1300L.c:8:
ev3_constants.h:52:1: warning: "LCD_WIDTH" redefined
In file included from XG1300L.c:7:
lms2012.h:196:1: warning: this is the location of the previous definition
In file included from ev3_button.h:46,
from XG1300L.c:8:
ev3_constants.h:53:1: warning: "LCD_HEIGHT" redefined
In file included from XG1300L.c:7:
lms2012.h:197:1: warning: this is the location of the previous definition
In file included from ev3_button.h:46,
from XG1300L.c:8:
ev3_constants.h:54:1: warning: "TOPLINE_HEIGHT" redefined
In file included from XG1300L.c:7:
lms2012.h:198:1: warning: this is the location of the previous definition
In file included from ev3_button.h:46,
from XG1300L.c:8:
ev3_constants.h:330:1: warning: "FILENAME_SIZE" redefined
In file included from XG1300L.c:7:
lms2012.h:367:1: warning: this is the location of the previous definition
In file included from XG1300L.c:9:
ev3_lcd.h:52:1: warning: "LCD_BUFFER_SIZE" redefined
In file included from XG1300L.c:7:
lms2012.h:1237:1: warning: this is the location of the previous definition
In file included from XG1300L.c:9:
ev3_lcd.h:54: error: redefinition of typedef 'IMGDATA'
lmstypes.h:69: error: previous declaration of 'IMGDATA' was here
ev3_lcd.h:55: error: redefinition of typedef 'IP'
lmstypes.h:74: error: previous declaration of 'IP' was here
make: *** [XG1300L] Error 1
ev3_timer.c / button.c / command.c / lcd.c / output.c / sound.c
Re: EV3 C-code for third party devices (I2C)
I'll take a look and see. A bit busy this week, hopefully will get a shot by the weekend...
Re: EV3 C-code for third party devices (I2C)
I'm guessing you're still including both "lms2012.h" and "ev3_*.h" as seen in the code snippet above. The compiler doesn't like that some #defines are defined twice, like for example LCD_WIDTH, which gives warnings. The errors are very similar, but are for typedefs instead of defines.doc-helmut wrote:strange -
after a while I tried to compile this code from above again and now get lots of errors - what's possibly wrong?
If you need to include all of lms2012.h and lmstypes.h, you have a few options - the absolute easiest and fastest option is to just comment out the offending typedefs from lmstypes.h (IMGDATA and IP), as they're basically the same in ev3_lcd.h. Or you could rename them in ev3_lcd.h and ev3_lcd.c.
Re: EV3 C-code for third party devices (I2C)
I have some hacks of the ev3_* files by Lauro which once have worked with lms2012 but don't do any longer though, strangely,
and I also tried the original ev3_* files from BCC/C with a hack of the lms2012.h by totokan, but they also don't compile and are showing lots of errors
Also the redefinitions just gave compiler warnings so far but always could be compiled nevertheless, but now there must be a real (obscured) fatal error somewhere...
and I also tried the original ev3_* files from BCC/C with a hack of the lms2012.h by totokan, but they also don't compile and are showing lots of errors
Also the redefinitions just gave compiler warnings so far but always could be compiled nevertheless, but now there must be a real (obscured) fatal error somewhere...
Re: EV3 C-code for third party devices (I2C)
A little while ago I wrote a program that reads data from the gyro and displays it in the LCD. This program could be used as starting point. This program uses a slightly modified LVM library for handling the LCD. You can find the program at:
http://www.robotnav.com/sensor-and-lcd/
When working with the LCD, you will need to compile a few other files as explained here:
http://www.robotnav.com/lcd/
http://www.robotnav.com/sensor-and-lcd/
When working with the LCD, you will need to compile a few other files as explained here:
http://www.robotnav.com/lcd/
Lauro
http://www.robotnav.com
http://www.robotnav.com
Re: EV3 C-code for third party devices (I2C)
Can you pls help me where to find this tutorial?RobotNavigation@http://www.robotnav.com/lcd/ wrote:For windows users, I recommend reading our tutorial on creating and compiling projects with Bricxcc.
Re: EV3 C-code for third party devices (I2C)
The instructions are the same used to compile programs that use several source files. You can find them at:
http://www.robotnav.com/download_instructions/#windows
http://www.robotnav.com/download_instructions/#windows
Lauro
http://www.robotnav.com
http://www.robotnav.com
Who is online
Users browsing this forum: No registered users and 2 guests