Well, its only been a year since I said I was going to do this, but hey, better late than never, right?
Anyways, it’s finally here (in at least pre-beta form): RoboEmu2 – now with C! I’ve tested it with the default code and everything seems to work fine, but given that I haven’t been involved with a team for 2 years now, that’s about the only code I’ve tested it with.
Thus, as always, I’m asking for everybody’s help: please download RoboEmu2 and try it with your code. If it doesn’t work, please email me your code and any warnings/errors you get.
Edit: for those of you who don’t know, RoboEmu is an emulator for the control system. Back in the days of PBASIC it was used as a way to quickly test new code and algorithms without needing an actual robot to play with. This new version marks the transition from PBASIC to C, thus supporting the new controllers.
I compiled it from source on Fedora Core 3 against whatever version of kdelibs-devel (read: qt-devel) I happen to have, and it works just fine with the default code provided in the tarball.
When I get a moment or two, I’ll make the necessary changes to our existing code and see what happens then.
MiniGW doesn’t understand the “short long” type that C18 accepts (24 bit signed integer). I will use long’s temporarily, but I wonder if you could add something to the batch file that will convert types because incorrect variable sizes can definitley screw up code.
Yes exactly how in depth is the emulation? What are known things that will not work? Is it strictly a C VM or are you doing any emulation at the processor level? I suppose you would have to to run the .lib files.
C:\mcc18\EduCode>C:\mingw\bin\mingw32-make.exe re2_win
gcc -o recore.dll -D_ROBOEMU -shared user_routines.c user_routines_fast.c re_hac
k.c re_core.c
In file included from user_routines.c:18:
printf_lib.h:15: warning: conflicting types for built-in function `printf'
user_routines.c: In function `User_Initialization':
user_routines.c:84: `TRISAbits' undeclared (first use in this function)
user_routines.c:84: (Each undeclared identifier is reported only once
user_routines.c:84: for each function it appears in.)
user_routines.c:96: `ADC_2ANA' undeclared (first use in this function)
user_routines.c:102: `TRISFbits' undeclared (first use in this function)
user_routines.c:111: `LATAbits' undeclared (first use in this function)
user_routines.c:112: `LATFbits' undeclared (first use in this function)
user_routines.c:113: `LATHbits' undeclared (first use in this function)
re_core.c: In function `update_outputs':
re_core.c:35: `pwm09' undeclared (first use in this function)
re_core.c:35: (Each undeclared identifier is reported only once
re_core.c:35: for each function it appears in.)
re_core.c:36: `pwm10' undeclared (first use in this function)
re_core.c:37: `pwm11' undeclared (first use in this function)
re_core.c:38: `pwm12' undeclared (first use in this function)
re_core.c:39: `pwm13' undeclared (first use in this function)
re_core.c:40: `pwm14' undeclared (first use in this function)
re_core.c:41: `pwm15' undeclared (first use in this function)
re_core.c:42: `pwm16' undeclared (first use in this function)
re_core.c:44: `relay1_fwd' undeclared (first use in this function)
re_core.c:45: `relay1_rev' undeclared (first use in this function)
re_core.c:46: `relay2_fwd' undeclared (first use in this function)
re_core.c:47: `relay2_rev' undeclared (first use in this function)
re_core.c:48: `relay3_fwd' undeclared (first use in this function)
re_core.c:49: `relay3_rev' undeclared (first use in this function)
re_core.c:50: `relay4_fwd' undeclared (first use in this function)
re_core.c:51: `relay4_rev' undeclared (first use in this function)
re_core.c:52: `relay5_fwd' undeclared (first use in this function)
re_core.c:53: `relay5_rev' undeclared (first use in this function)
re_core.c:54: `relay6_fwd' undeclared (first use in this function)
re_core.c:55: `relay6_rev' undeclared (first use in this function)
re_core.c:56: `relay7_fwd' undeclared (first use in this function)
re_core.c:57: `relay7_rev' undeclared (first use in this function)
re_core.c:58: `relay8_fwd' undeclared (first use in this function)
re_core.c:59: `relay8_rev' undeclared (first use in this function)
re_core.c: In function `update_inputs':
re_core.c:77: `p1_x' undeclared (first use in this function)
re_core.c:78: `p1_y' undeclared (first use in this function)
re_core.c:79: `p1_wheel' undeclared (first use in this function)
re_core.c:80: `p1_aux' undeclared (first use in this function)
re_core.c:81: `p1_sw_trig' undeclared (first use in this function)
re_core.c:82: `p1_sw_top' undeclared (first use in this function)
re_core.c:83: `p1_sw_aux1' undeclared (first use in this function)
re_core.c:84: `p1_sw_aux2' undeclared (first use in this function)
re_core.c:85: `p2_x' undeclared (first use in this function)
re_core.c:86: `p2_y' undeclared (first use in this function)
re_core.c:87: `p2_wheel' undeclared (first use in this function)
re_core.c:88: `p2_aux' undeclared (first use in this function)
re_core.c:89: `p2_sw_trig' undeclared (first use in this function)
re_core.c:90: `p2_sw_top' undeclared (first use in this function)
re_core.c:91: `p2_sw_aux1' undeclared (first use in this function)
re_core.c:92: `p2_sw_aux2' undeclared (first use in this function)
re_core.c:93: `p3_x' undeclared (first use in this function)
re_core.c:94: `p3_y' undeclared (first use in this function)
re_core.c:95: `p3_wheel' undeclared (first use in this function)
re_core.c:96: `p3_aux' undeclared (first use in this function)
re_core.c:97: `p3_sw_trig' undeclared (first use in this function)
re_core.c:98: `p3_sw_top' undeclared (first use in this function)
re_core.c:99: `p3_sw_aux1' undeclared (first use in this function)
re_core.c:100: `p3_sw_aux2' undeclared (first use in this function)
re_core.c:101: `p4_x' undeclared (first use in this function)
re_core.c:102: `p4_y' undeclared (first use in this function)
re_core.c:103: `p4_wheel' undeclared (first use in this function)
re_core.c:104: `p4_aux' undeclared (first use in this function)
re_core.c:105: `p4_sw_trig' undeclared (first use in this function)
re_core.c:106: `p4_sw_top' undeclared (first use in this function)
re_core.c:107: `p4_sw_aux1' undeclared (first use in this function)
re_core.c:108: `p4_sw_aux2' undeclared (first use in this function)
re_core.c:110: `PORTAbits' undeclared (first use in this function)
re_core.c:115: `PORTFbits' undeclared (first use in this function)
re_core.c:126: `rc_dig_in17' undeclared (first use in this function)
re_core.c:127: `rc_dig_in18' undeclared (first use in this function)
re_core.c:133: `competition_mode' undeclared (first use in this function)
C:\mingw\bin\mingw32-make.exe: *** [re2_win] Error 1
C:\mcc18\EduCode>pause
Press any key to continue . . .
As of right now, timers and interrupts don’t work and variables of type “short long” won’t work. The timers and interrupts thing will be fixed at some point, but I’m really not sure about how to do 3-byte variables on x86.
As for how this thing works, it’s actually quite simple. You compile your code into native Windows/Linux/etc as a dynamically loadable module (DLL’s in Windows speak). This library file contains a few RE2-specific functions (from recore.c) that the main program uses to interface with your code. The driver program simply calls these functions once ever 26ms (for the slow-loop function) or whenever your computer has free cycles (for the fast-loop function). The majority of the work here is being done by gcc, so anything that’s ANSI-C should compile. Whether or not it works as expected depends on whether you’re using a PIC-specific feature (timers, interrupts, etc).
I need a new copy of the MinGW compiler because the one i downloaded didn’t work. So if you could, give me a link to get the compiler. Other than that the RoboEmu2 worked fine with the default and it should come in handy so i can work from home because the other person programming on the team won’t let me in on anything, but when he makes a mistake he looks at me like “ok find my mistake because you know all the syntax because you learned C and i only know bits and pieces.” Yeah, my teams a real bunch of great guys aren’t they. you should ask me about last year how they screwed me over and you’ll see what kind of people my teammates are.
I’m having trouble with the top buttons. The functions I have for them work fine when they are set to the triggers instead of the top buttons. Anybody else have this problem or just me? Maybe I just missed the latest update, I do that a lot. Thanks.
Does this question have to do with RoboEmu2, or the real robot? It sounds like you’re talking about the real robot with real joysticks. And if you are talking about your real robot with the new joysticks we have received the last two years, you need to realize that the joystick button called pX_sw_top is the little round button located under your thumb when you wrap your right hand around the joystick handle, and NOT the 1/2 inch round button sticking up from the top of the handle.
I hope this helps. But if I misinterpreted, and you really are talking about RoboEmu2, I apologize for taking up bandwidth.
should’ve clarified, talking about the roboemu2 program. Just wanted to know if anybody else is having trouble with the top buttons. I’d appreciate knowing wether its me or the program. Distinct possibility its me.