Article View: nl.comp.programmeren
Article #705GTK programming en parallelle poort sturing
From: Bart Vandewoestyne
Date: Thu, 18 Nov 1999 00:00
Date: Thu, 18 Nov 1999 00:00
390 lines
12084 bytes
12084 bytes
Ik zit met volgend probleem:
Ik wil een stappenmotorsturing schrijven met GTK en heb momenteel al een
'basis-grafische omgeving' met menu's en submenus. Aan ��n van die
submenu's wil ik volgende functie toekennen:
void turn_left_half_step(int *status)
{
set_left_half_step(status);
turn(status);
unset_left_half_step(status);
}
*status is een pointer naar een integer waarde die de status van de
parallelle poort bijhoudt. In de functie set_left_half_step(status) zet
ik de nodige bits om de motor te doen draaien in half step mode in de
linker draaizin. Daarna via turn(status) laat ik de clock een paar
clockpulsen genereren zodat de motor een aantal clockpulsen 'draait' en
daarna ga maak ik de parallelle poort weer 'proper' via
unset_left_half_step(status).
Nu wil ik deze functie toekennen aan een submenu dat ik via GTK al heb
gecre�eerd. Dit gebeurt normaal via gtk_signal_connect:
gtk_signal_connect (GTK_OBJECT (menuMotorTurnLeftFull), "activate",
GTK_SIGNAL_FUNC (turn_left_full_step), ????);
Mijn probleem is nu het volgende: hoe geef ik hier nu in godsnaam de
variabelen (int *status) mee aan de functie turn_left_full_step? Mijn
functie heeft variabelen nodig en als ik schrijf:
gtk_signal_connect (GTK_OBJECT (menuMotorTurnLeftFull), "activate",
GTK_SIGNAL_FUNC (turn_left_full_step), portstatus);
dan lukt dit al geen kanten :-(
portstatus is in het main programma als volgt gedefinieerd:
int *portstatus; // Can I use an int here or does it have to be gint
???
Hoe geef ik nu in godsnaam deze pointer mee aan de functie
turn_left_full_step(int *status) die ge-gtk_signal_connected is aan een
submenu ???
Ben je verplicht om je in GTK aan de types van GTK te houden (zoals
gint, gpointer etc...) of zou mijn
gewone int ook moeten lukken ? Of moet ik proberen te werken met
functies die geen argumenten vereisen (void) dus... ?
I definately need help here...
Hieronder volgt de source van mijn programma tot nu toe (alle commentaar
wat betreft programmeerstijl is welkom! Zie jij betere algoritmes of
kan ik zaken verkorten door via functies zaken te veralgemenen, zeg het
dan!:
de file motor.h:
#include <gtk/gtk.h>
#include <asm/io.h>
#include <unistd.h>
#include <stdio.h>
#define BASEPORT 0x378
#define PULSE_WIDTH 100000 // in microseconds ???
#define LEFT 1
#define RIGHT 0
#define CLOCK 2
#define HALF_STEP 4
#define FULL_STEP 0
#define RESET 8
#define ENABLE 16
#define CONTROL 32
void initialize(int *status);
void set_left_half_step(int *status);
void unset_left_half_step(int *status);
void set_right_half_step(int *status);
void unset_right_half_step(int *status);
void set_left_full_step(int *status);
void unset_left_full_step(int *status);
void set_right_full_step(int *status);
void unset_right_full_step(int *status);
void turn(int *status);
void turn_left_half_step(int *status);
void turn_left_full_step(int *status);
void turn_right_half_step(int *status);
void turn_right_full_step(int *status);
gint CloseAppWindow (GtkWidget *widget, int *data);
void NewFile (void);
-->>> de file motor.c:
#include "motor.h"
/*
* motor.c
*
* Program to control steppermotor by Bart Vandewoestyne
* Compile as user with:
* gcc -Wall -O1 -g motor.c control.c -o motor `gtk-config --cflags`
`gtk-config --libs`
*
* To be able to run as user do as root:
* # chown root ~user/place_to_be/motor
* # chmod ug+s ~user/place_to_be/motor
*/
gint CloseAppWindow (GtkWidget *widget, int *data)
{
gtk_main_quit();
/* --- Ok to close --- */
return (FALSE);
}
void NewFile (void)
{
g_print("New File\n");
}
int main (int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox_main;
GtkWidget *menubar;
GtkWidget *menuFile;
GtkWidget *menuFileSub;
GtkWidget *menuFileOpen;
GtkWidget *menuFileNew;
GtkWidget *menuFileSave;
GtkWidget *menuFileSaveAs;
GtkWidget *menuL297;
GtkWidget *menuMotor;
GtkWidget *menuMotorSub;
GtkWidget *menuMotorTurnLeftHalf;
GtkWidget *menuMotorTurnLeftFull;
GtkWidget *menuMotorTurnRightHalf;
GtkWidget *menuMotorTurnRightFull;
GtkWidget *menuHelp;
int *portstatus; // Can I use an int here or does it have to be gint
???
if (ioperm(BASEPORT, 3, 1)) { perror("ioperm"); exit(1);}
initialize(portstatus);
g_print("%d\n", *portstatus); // to be able to see the portstatus
after
// initializing
/* --- GTK initialization --- */
gtk_init (&argc, &argv);
/* Create the top-level window --- */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* --- Set the title --- */
gtk_window_set_title (GTK_WINDOW (window), "Steppermotorcontroller by
Bart Vandewoestyne");
/* --- Set the size --- */
gtk_widget_set_usize (window, 400, 300);
/* --- Connect the delete_event to the main window */
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
GTK_SIGNAL_FUNC (CloseAppWindow), NULL);
/* --- Give the window a border --- */
gtk_container_border_width (GTK_CONTAINER (window), 0);
/* --- Create the application_s vertical packing box --- */
vbox_main = gtk_vbox_new (FALSE, 0);
/* --- Add the packing box to the main window --- */
gtk_container_add (GTK_CONTAINER (window), vbox_main);
/* --- Create a menu bar for the application --- */
menubar = gtk_menu_bar_new();
/* --- Put the menu bar in the application packing box --- */
gtk_box_pack_start (GTK_BOX(vbox_main), menubar, FALSE, TRUE, 0);
/* --- Create a menu item for "File" --- */
menuFile = gtk_menu_item_new_with_label ("File");
/* --- Add File to the menu bar --- */
gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuFile);
/* --- Create Submenu for menuFile --- */
menuFileSub = gtk_menu_new ();
/* --- Mark the submenu under the "File" menuitem --- */
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuFile), menuFileSub);
menuFileNew = gtk_menu_item_new_with_label ("New");
gtk_menu_append (GTK_MENU (menuFileSub), menuFileNew);
gtk_signal_connect (GTK_OBJECT (menuFileNew), "activate",
GTK_SIGNAL_FUNC(NewFile), NULL);
gtk_widget_show (menuFileNew);
menuFileOpen = gtk_menu_item_new_with_label ("Open");
gtk_menu_append (GTK_MENU (menuFileSub), menuFileOpen);
gtk_widget_show (menuFileOpen);
menuFileSave = gtk_menu_item_new_with_label ("Save");
gtk_menu_append (GTK_MENU (menuFileSub), menuFileSave);
gtk_widget_show (menuFileSave);
menuFileSaveAs = gtk_menu_item_new_with_label ("Save As...");
gtk_menu_append (GTK_MENU (menuFileSub), menuFileSaveAs);
gtk_widget_show (menuFileSaveAs);
/* -- Create a menu item for "L297 settings" --- */
menuL297 = gtk_menu_item_new_with_label ("L297 Settings");
/* --- Add L297 to the menu bar --- */
gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuL297);
menuMotor = gtk_menu_item_new_with_label ("Motor");
gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuMotor);
menuMotorSub = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuMotor), menuMotorSub);
menuMotorTurnLeftHalf = gtk_menu_item_new_with_label ("Turn Left Half
Step");
gtk_menu_append (GTK_MENU (menuMotorSub),menuMotorTurnLeftHalf);
gtk_signal_connect (GTK_OBJECT (menuMotorTurnLeftHalf), "activate",
GTK_SIGNAL_FUNC (turn_left_half_step), portstatus);
gtk_widget_show (menuMotorTurnLeftHalf);
menuMotorTurnLeftFull = gtk_menu_item_new_with_label ("Turn Left Full
Step");
gtk_menu_append (GTK_MENU (menuMotorSub),menuMotorTurnLeftFull);
gtk_signal_connect (GTK_OBJECT (menuMotorTurnLeftFull), "activate",
GTK_SIGNAL_FUNC (turn_left_full_step), portstatus);
gtk_widget_show (menuMotorTurnLeftFull);
menuMotorTurnRightHalf = gtk_menu_item_new_with_label ("Turn Right Half
Step");
gtk_menu_append (GTK_MENU (menuMotorSub),menuMotorTurnRightHalf);
gtk_signal_connect (GTK_OBJECT (menuMotorTurnRightHalf), "activate",
GTK_SIGNAL_FUNC (turn_right_half_step), portstatus);
gtk_widget_show (menuMotorTurnRightHalf);
menuMotorTurnRightFull = gtk_menu_item_new_with_label ("Turn Right Full
Step");
gtk_menu_append (GTK_MENU (menuMotorSub),menuMotorTurnRightFull);
gtk_signal_connect (GTK_OBJECT (menuMotorTurnRightFull), "activate",
GTK_SIGNAL_FUNC (turn_right_full_step), portstatus);
gtk_widget_show (menuMotorTurnRightFull);
menuHelp = gtk_menu_item_new_with_label ("Help");
gtk_menu_bar_append (GTK_MENU_BAR (menubar), menuHelp);
/* --- Make the widget visible --- */
gtk_widget_show (menuFile);
gtk_widget_show (menuL297);
gtk_widget_show (menuMotor);
gtk_widget_show (menuHelp);
/* --- Make the menu bar visible --- */
gtk_widget_show (menubar);
/* --- Make the packing box visible --- */
gtk_widget_show (vbox_main);
/* --- Make the main window visible, now the button
* will be made visible.
*/
gtk_widget_show (window);
gtk_main();
return(0);
}
--->>> de file control.c:
#include "motor.h"
void initialize(int *status)
{
outb(0, BASEPORT);
outb(0x0B, BASEPORT+2);
*status=0;
}
void set_left_half_step(int *status)
{
*status=*status+LEFT+HALF_STEP+ENABLE+RESET;
}
void unset_left_half_step(int *status)
{
*status=*status-LEFT-HALF_STEP-ENABLE-RESET;
}
void set_right_half_step(int *status)
{
*status=*status+RIGHT+HALF_STEP+ENABLE+RESET;
}
void unset_right_half_step(int *status)
{
*status=*status-RIGHT-HALF_STEP-ENABLE-RESET;
}
void set_left_full_step(int *status)
{
*status=*status+LEFT+FULL_STEP+ENABLE+RESET;
}
void unset_left_full_step(int *status)
{
*status=*status-LEFT-FULL_STEP-ENABLE-RESET;
}
void set_right_full_step(int *status)
{
*status=*status+RIGHT+FULL_STEP+ENABLE+RESET;
}
void unset_right_full_step(int *status)
{
*status=*status-RIGHT-FULL_STEP-ENABLE-RESET;
}
void turn(int *status)
{
int i=0;
g_print("%d\n", *status);
for (i=0; i<10; i++) {
*status = *status+CLOCK;
outb(*status, BASEPORT);
usleep(PULSE_WIDTH);
*status = *status-CLOCK;
outb(*status, BASEPORT);
usleep(PULSE_WIDTH); }
}
void turn_left_half_step(int *status)
{
set_left_half_step(status);
turn(status);
unset_left_half_step(status);
}
void turn_left_full_step(int *status)
{
set_left_full_step(status);
turn(status);
unset_left_full_step(status);
}
void turn_right_half_step(int *status)
{
set_right_half_step(status);
turn(status);
unset_right_half_step(status);
}
void turn_right_full_step(int *status)
{
set_right_full_step(status);
turn(status);
unset_right_full_step(status);
}
--
Bart Vandewoestyne http://hello.to/MC303
Hugo Verrieststraat 48 Bart.Vandewoestyne@skynet.be
8550 ZWEVEGEM ICQ# 21275340
BELGIUM - EUROPE nick: MC303
Phone: +32(0)56/75.48.11
-------------------------------------------------------------------
If carpenters made buildings the way programmers make programs, the
first woodpecker to come along would destroy all of civilization.
- Weinberg's Second Law -
Technical Details
Message-ID:
<38346CD5.4FB482B2@skynet.be>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII X-Google-Thread: 107324,10906ecdbe863be8,start X-Google-Attributes: gid107324,public X-Google-Thread: 100a19,10906ecdbe863be8,start X-Google-Attributes: gid100a19,public X-Google-Thread: fcea4,10906ecdbe863be8,start X-Google-Attributes: gidfcea4,public X-Google-Thread: fb7d6,10906ecdbe863be8,start X-Google-Attributes: gidfb7d6,public From: Bart Vandewoestyne <Bart.Vandewoestyne@skynet.be> Subject: GTK programming en parallelle poort sturing Date: 1999/11/18 Message-ID: <38346CD5.4FB482B2@skynet.be> X-Deja-AN: 550275538 Content-Transfer-Encoding: 8bit X-Accept-Language: nl-BE, nl, en, de Content-Type: text/plain; charset=iso-8859-1 X-Complaints-To: abuse@skynet.be X-Trace: news0.skynet.be 942960033 15572 194.78.231.7 (18 Nov 1999 21:20:33 GMT) Organization: MyHome Mime-Version: 1.0 NNTP-Posting-Date: 18 Nov 1999 21:20:33 GMT Newsgroups: nl.comp.programmeren,be.comp.os.linux,nl.comp.os.linux,be.comp.programming