je n'ai pas essayé avec lpt1,mais j'ai essayé d'envoyer des boucles avec outp à la fin de mon programme principale de projection,et à la sortie mes scanners ne bougent pas,voila l'allure de mon programme:
#pragma once
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Xml;
using namespace System::Threading;
using namespace System::Timers;
#include "forme.h"
#include "gestionXML.h"
#include <conio.h>
namespace projection
{
/// <summary>
/// Description résumée de projeter
///
/// AVERTISSEMENT : Si vous modifiez le nom de cette classe, vous devrez également modifier la
/// propriété 'Nom du fichier de ressources' de l'outil de compilation de ressource managée
/// pour tous les fichiers .resx dont dépend cette classe. Dans le cas contraire,
/// les concepteurs ne pourront pas interagir correctement avec les ressources
/// localisées associées à ce formulaire.
/// </summary>
public __gc class projeter : public System::Windows::Forms::Form
{
public:
projeter(String *fichier)
{
InitializeComponent();
images=new ArrayList() ;
if (!chargerImages(fichier))
Close() ;
int duree[]=DUREES_PREVISUALISATION ;
int i ;
int max=0 ;
for (i=0; duree[i]; i++)
max=Math::Max(duree[i].ToString()->Length, max) ;
for (i=0; duree[i]; i++)
this->dudDuree->Items->Add(String::Concat(new String(32, max+1-duree[i].ToString()->Length), duree[i].ToString(), S" ms" )) ;
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::GroupBox * groupBox1;
private: System::Windows::Forms::Button * btstart;
private: System::Windows::Forms::RadioButton * rbanimation;
private: System::Windows::Forms::RadioButton * rbimage;
private: System::Windows::Forms::PictureBox * zoneGraphique;
private: System::Windows::Forms::ListBox * lbImages;
private: System::Windows::Forms::DomainUpDown * dudDuree;
private: System::Windows::Forms::NumericUpDown * numericUpDown1;
private: System::Windows::Forms::CheckBox * checkBox1;
private: System::Windows::Forms::Button * btAllumer;
private: System::Windows::Forms::Button * btEteindre;
private:
//
// <summary>
// Variable nécessaire au concepteur.
// </summary>
System::ComponentModel::Container* components;
//
// <summary>
// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
// le contenu de cette méthode avec l'éditeur de code.
// </summary>
void InitializeComponent(void)
{
System::Resources::ResourceManager * resources = new System::Resources::ResourceManager(__typeof(projection::projeter));
this->groupBox1 = new System::Windows::Forms::GroupBox();
this->btEteindre = new System::Windows::Forms::Button();
this->btAllumer = new System::Windows::Forms::Button();
this->checkBox1 = new System::Windows::Forms::CheckBox();
this->numericUpDown1 = new System::Windows::Forms::NumericUpDown();
this->dudDuree = new System::Windows::Forms::DomainUpDown();
this->btstart = new System::Windows::Forms::Button();
this->rbanimation = new System::Windows::Forms::RadioButton();
this->rbimage = new System::Windows::Forms::RadioButton();
this->zoneGraphique = new System::Windows::Forms::PictureBox();
this->lbImages = new System::Windows::Forms::ListBox();
this->groupBox1->SuspendLayout();
(__try_cast<System::ComponentModel::ISupportInitialize * >(this->numericUpDown1))->BeginInit();
this->SuspendLayout();
//
// groupBox1
//
this->groupBox1->Controls->Add(this->btEteindre);
this->groupBox1->Controls->Add(this->btAllumer);
this->groupBox1->Controls->Add(this->checkBox1);
this->groupBox1->Controls->Add(this->numericUpDown1);
this->groupBox1->Controls->Add(this->dudDuree);
this->groupBox1->Controls->Add(this->btstart);
this->groupBox1->Controls->Add(this->rbanimation);
this->groupBox1->Controls->Add(this->rbimage);
this->groupBox1->Location = System::Drawing::Point(24, 288);
this->groupBox1->Name = S"groupBox1";
this->groupBox1->Size = System::Drawing::Size(496, 88);
this->groupBox1->TabIndex = 32;
this->groupBox1->TabStop = false;
this->groupBox1->Text = S"Projeter";
//
// btEteindre
//
this->btEteindre->FlatStyle = System::Windows::Forms::FlatStyle::Popup;
this->btEteindre->Location = System::Drawing::Point(240, 56);
this->btEteindre->Name = S"btEteindre";
this->btEteindre->Size = System::Drawing::Size(64, 24);
this->btEteindre->TabIndex = 43;
this->btEteindre->Text = S"Eteindre";
this->btEteindre->Click += new System::EventHandler(this, OnEteindre);
//
// btAllumer
//
this->btAllumer->FlatStyle = System::Windows::Forms::FlatStyle::Popup;
this->btAllumer->Location = System::Drawing::Point(240, 24);
this->btAllumer->Name = S"btAllumer";
this->btAllumer->Size = System::Drawing::Size(64, 24);
this->btAllumer->TabIndex = 42;
this->btAllumer->Text = S"Allumer";
this->btAllumer->Click += new System::EventHandler(this, OnAllumer);
//
// checkBox1
//
this->checkBox1->Location = System::Drawing::Point(384, 24);
this->checkBox1->Name = S"checkBox1";
this->checkBox1->Size = System::Drawing::Size(104, 16);
this->checkBox1->TabIndex = 41;
this->checkBox1->Text = S"coché données";
//
// numericUpDown1
//
this->numericUpDown1->Location = System::Drawing::Point(328, 24);
System::Int32 __mcTemp__1[] = new System::Int32[4];
__mcTemp__1[0] = 255;
__mcTemp__1[1] = 0;
__mcTemp__1[2] = 0;
__mcTemp__1[3] = 0;
this->numericUpDown1->Maximum = System::Decimal(__mcTemp__1);
this->numericUpDown1->Name = S"numericUpDown1";
this->numericUpDown1->Size = System::Drawing::Size(48, 20);
this->numericUpDown1->TabIndex = 40;
//
// dudDuree
//
this->dudDuree->Location = System::Drawing::Point(112, 24);
this->dudDuree->Name = S"dudDuree";
this->dudDuree->ReadOnly = true;
this->dudDuree->Size = System::Drawing::Size(112, 20);
this->dudDuree->TabIndex = 39;
this->dudDuree->Text = S"durée d\'exposition";
//
// btstart
//
this->btstart->FlatStyle = System::Windows::Forms::FlatStyle::Popup;
this->btstart->Location = System::Drawing::Point(352, 56);
this->btstart->Name = S"btstart";
this->btstart->Size = System::Drawing::Size(96, 24);
this->btstart->TabIndex = 30;
this->btstart->Text = S"Démarrer";
this->btstart->Click += new System::EventHandler(this, OnDemarrerProjection);
//
// rbanimation
//
this->rbanimation->Checked = true;
this->rbanimation->Location = System::Drawing::Point(16, 24);
this->rbanimation->Name = S"rbanimation";
this->rbanimation->Size = System::Drawing::Size(88, 24);
this->rbanimation->TabIndex = 27;
this->rbanimation->TabStop = true;
this->rbanimation->Text = S"L\'animation";
//
// rbimage
//
this->rbimage->Location = System::Drawing::Point(16, 56);
this->rbimage->Name = S"rbimage";
this->rbimage->Size = System::Drawing::Size(208, 24);
this->rbimage->TabIndex = 28;
this->rbimage->Text = S"Seulement l\'image sélectionnée";
//
// zoneGraphique
//
this->zoneGraphique->BackColor = System::Drawing::Color::White;
this->zoneGraphique->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
this->zoneGraphique->Cursor = System::Windows::Forms::Cursors::Cross;
this->zoneGraphique->Location = System::Drawing::Point(264, 16);
this->zoneGraphique->Name = S"zoneGraphique";
this->zoneGraphique->Size = System::Drawing::Size(256, 256);
this->zoneGraphique->TabIndex = 31;
this->zoneGraphique->TabStop = false;
//
// lbImages
//
this->lbImages->Location = System::Drawing::Point(24, 16);
this->lbImages->Name = S"lbImages";
this->lbImages->Size = System::Drawing::Size(216, 251);
this->lbImages->TabIndex = 30;
this->lbImages->SelectedIndexChanged += new System::EventHandler(this, OnChangementImage);
//
// projeter
//
this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
this->ClientSize = System::Drawing::Size(544, 398);
this->Controls->Add(this->groupBox1);
this->Controls->Add(this->zoneGraphique);
this->Controls->Add(this->lbImages);
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
this->Icon = (__try_cast<System::Drawing::Icon * >(resources->GetObject(S"$this.Icon" )));
this->MaximizeBox = false;
this->MinimizeBox = false;
this->Name = S"projeter";
this->ShowInTaskbar = false;
this->Text = S"Projeter l\'animation";
this->groupBox1->ResumeLayout(false);
(__try_cast<System::ComponentModel::ISupportInitialize * >(this->numericUpDown1))->EndInit();
this->ResumeLayout(false);
}
//
// <summary>
// Liste des images
// </summary>
ArrayList *images ;
//
// <summary>
// Couleur principale
// </summary>
Color coulPrincipale ;
//
// <summary>
// Couleur de sélection
// </summary>
Color coulSelection ;
//
// <summary>
// Couleur du calque
// </summary>
Color coulCalque ;
//
// <summary>
// Thread pour la projection
// </summary>
Thread * thproj ;
//
// <summary>
// Charger images
// </summary>
bool chargerImages(String *filename)
{
XmlTextReader* reader = NULL ;
bool retval=true ;
try {
// Intitialise le reader avec le fichier et ignore les noeuds vides
reader = new XmlTextReader(filename) ;
reader->WhitespaceHandling = WhitespaceHandling::None ;
// On rejoint le noeud racine "Projection"
while (reader->Read() && (reader->NodeType != XmlNodeType::Element || String::Compare(reader->Name, S"Projection" )))
;
// On doit être sur le noeud Projection
if (reader->NodeType != XmlNodeType::Element || String::Compare(reader->Name, S"Projection" ))
throw new Exception("Balise Animation ou Optimisation non trouvée" ) ;
chargerCouleurs(reader) ;
chargerImages(reader) ;
} catch(Exception *e) {
AFFICHE_ERREUR(String::Concat("Erreur lors du chargement à partir du fichier \"", filename, "\"\n\nCause : \n", e->ToString())) ;
retval=false ;
}
if (reader!=0)
reader->Close() ;
if (images->Count)
lbImages->SelectedIndex=0 ;
return retval ;
}
//
// <summary>
// Code spécifique au chargement des couleurs
// </summary>
void chargerCouleurs(XmlTextReader* reader)
{
// Lecture des couleurs
reader->MoveToContent() ;
coulPrincipale = Color::FromArgb(System::Convert::ToInt32(reader->GetAttribute(S"CoulPrincipale" ))) ;
coulSelection = Color::FromArgb(System::Convert::ToInt32(reader->GetAttribute(S"CoulSelection" ))) ;
coulCalque = Color::FromArgb(System::Convert::ToInt32(reader->GetAttribute(S"CoulCalque" ))) ;
reader->MoveToElement() ;
// On se place sur le noeud suivant, qui doit donc être une vue
reader->Read() ;
}
//
// <summary>
// Code spécifique au chargement des lignesBrisees
// </summary>
void chargerImages(XmlTextReader* reader)
{
forme *f ;
// Si il y a bien des images... (balise ouverte et fermante en même temps!)
if (reader->NodeType == XmlNodeType::Element && !String::Compare(reader->Name, S"Forme" )) {
// On charge les formes tant qu'on est pas sur la fin du fichier et qu'on est sur une forme
while (!reader->EOF && reader->NodeType == XmlNodeType::Element && !String::Compare(reader->Name, S"Forme" )) {
f=formeFromXML(reader) ;
images->Add(f) ;
lbImages->Items->Add(f->get_nom()) ;
}
// On a terminé de lire les formes, on vérifie que l'on est sur la balise fermante de Projection
if (reader->NodeType != XmlNodeType::EndElement || String::Compare(S"Projection", reader->Name))
throw new Exception("Erreur de syntaxe XML" ) ;
if (lbImages->Items->Count)
lbImages->SelectedItem=0 ;
}
}
//
// <summary>
// Quand on change d'image, redessine la zone graphique
// </summary>
System::Void OnChangementImage(System::Object * sender, System::EventArgs * e)
{
// On vérifie qu'un élément est sélectionné
if (lbImages->SelectedIndex != -1) {
Graphics *graphics ;
// Effacer la zone graphique
try {
zoneGraphique->set_Image(new Bitmap(zoneGraphique->get_Width(), zoneGraphique->get_Height())) ;
} catch (...) {
throw new Exception(S"Erreur lors du chargement du bitmap" ) ;
}
// Pour éviter que ça ne plante au démarrage
// en effet, vues n'est pas initialisé lors du premier appel de cette méthode
try {
Pen *NewPen = new Pen(coulPrincipale, 1) ;
dynamic_cast<ligneBrisee*>(images->get_Item(lbImages->SelectedIndex))->paint(graphics=System::Drawing::Graphics::FromImage(zoneGraphique->get_Image()), NewPen) ;
NewPen->Dispose() ;
}
CATCH_DEBUG // Affiche un message d'erreur uniquement si __DEBUG__ est défini
zoneGraphique->set_Image(zoneGraphique->Image) ;
graphics->Dispose() ;
}
}
//
// <summary>
// Quand l'utilisateur clique sur le bouton pour démarrer la projection
// </summary>
System::Void OnDemarrerProjection(System::Object * sender, System::EventArgs * e)
{
// S'il faut démarrer
if (!String::Compare(btstart->Text, "Démarrer" )) {
MessageBox::Show("Demarrage de la projection" ) ;
btstart->Text=S"Arrêter" ;
lbImages->Enabled=false ;
rbanimation->Enabled=false ;
rbimage->Enabled=false ;
dudDuree->Enabled=false ;
thproj = new Thread(new ThreadStart(this, test /*projSelImg*/));
thproj->Start() ;
}
// Il faut arrêter
else {
btstart->Text=S"Démarrer" ;
lbImages->Enabled=true ;
rbanimation->Enabled=true ;
rbimage->Enabled=true ;
dudDuree->Enabled=true ;
thproj->Abort() ;
thproj->Join() ;
}
/*
for (i=0; i<1000; i++) {
// Envoi de 11110000 sur la ligne de données
outportb(0x378,0xF0) ;
// Ligne de commade : X - X - X - X - /SELECT - /INIT - AUTOFEED - /STROBE
outportb(0x37A,0x0F) ;
}
*/
}
void test()
{
unsigned short adresse ;
int valeur ;
if (this->checkBox1->Checked == true)
adresse=0x378 ;
else
adresse=0x37A ;
valeur=Convert::ToInt32(this->numericUpDown1->Value) ;
//Dialogue avec le port parallèle
_outp(0x37A, 12) ;
while(1) {
_outp(0x378, valeur) ;
_outp(0x37A, 14) ;
_outp(0x37A, 2) ;
_outp(0x378, valeur) ;
_outp(0x37A, 6) ;
_outp(0x37A, 2) ;
_outp(0x378, valeur) ;
_outp(0x37A, 8) ;
_outp(0x37A, 2) ;
_outp(0x378, valeur) ;
_outp(0x37A, 0) ;
_outp(0x37A, 2) ;
}
}
//
// <summary>
// Pour projeter en boucle l'image sélectionnée
// </summary>
void projSelImg()
{
ligneBrisee *lb=dynamic_cast<ligneBrisee*>(images->get_Item(lbImages->SelectedIndex)) ;
int i ;
while(1)
for (i=0 ; i<(int) lb->get_nbPoints(); i++)
projeterPoint(lb->get_point(i)) ;
}
//
// <summary>
// projeter un point
// </summary>
void projeterPoint(PointF pt)
{
this->rbimage->Text=pt.ToString() ;
Thread::Sleep(500) ;
/*
// envoi du poids faible de x
_outp(0x378,mat[i][j]);
_outp(0x37A,15);
_outp(0x37A,7);
j++;
// envoi du poids fort de x
_outp(0x378,mat[i][j]);
_outp(0x37A,13);
_outp(0x37A,7);
j++;
// envoi du poids faible de y
_outp(0x378,mat[i][j]);
_outp(0x37A,3);
_outp(0x37A,7);
j++;
// envoi du poids fort de y
_outp(0x378,mat[i][j]);
_outp(0x37A,1);
_outp(0x37A,9);
j++;
for(l=0;l<vit;l++);
if (j>=param[i*2]*4) j=0;
*/
}
System::Void OnAllumer(System::Object * sender, System::EventArgs * e)
{
_outp(0x37A, 12) ;
}
System::Void OnEteindre(System::Object * sender, System::EventArgs * e)
{
_outp(0x37A, 4) ;
}
} ;
}