#include "StdAfx.h" #include "Form2.h" #include "baseutil.h" #include "resource.h" #include "DTAPI.h" #include "DtPlay.h" #include "string.h" #include #include "stdio.h" #include "communication.h" using namespace std; using namespace Commande_Generateur2; using namespace System; using namespace System::Windows::Forms; using namespace System::IO; using namespace System::Threading; using namespace System::Globalization; using namespace System::Resources; using namespace System::Diagnostics; using namespace System::Runtime::InteropServices; //VARIABLE GLOBALE extern bool play_boucle; // pour lancer ou arrêter la boucle loopfile int colonne=2, ligne=2; ref class ThreadParametre { private: char *_commande; public: // Constructeur ThreadParametre(char *commande) { _commande = commande; //paramètre de la fonction utiliser lors du Thread } // Exécution de la méthode du thread void Envoi_Donnees() { int RetValue(0); Player ThePlayer; static char argv[32][32]; char* pargv[32]; char* cmd= _commande; char* pt = cmd; // extract elemantary commands from the command string int i = 0; while (true) { pt = strstr(cmd, " "); // find space if (pt == 0) // space not find { strcpy(argv[i++], cmd); // last command break; // end of cmd } *pt = 0; // end of string strcpy(argv[i++], cmd); // one command pargv[i] = &argv[i][0]; // init pointer *pt++; // next command strcpy(cmd, pt); // erase previous command } if (RetValue==0) { try { RetValue = ThePlayer.Play(i-1, pargv); if (RetValue==-1) exit(2); } catch(...) { RetValue = -1; } } else return; } }; void Form2::Initialisation() { char selection=0, select_band=0, select_mode=0, select_rate_T=0, select_rate_S=0, select_guard=0, select_const=0, select_qam=0; //permet d'afficher le premier article de la comboBox Combo_MODULATOR_TYPE->SelectedIndex= selection; //gBaseUtil.SetText_Label(label1, selection); // temporaire: affiche la valeur de l'index de la comboBox de modulation gBaseUtil.SetEnableControl(combo_band,true); gBaseUtil.SetEnableControl(combo_mode,true); gBaseUtil.SetEnableControl(combo_rate_S,true); gBaseUtil.SetEnableControl(combo_rate_T,true); gBaseUtil.SetEnableControl(combo_guard,true); gBaseUtil.SetEnableControl(combo_const,true); gBaseUtil.SetEnableControl(combo_qam,true); //Tous les groupbox et label sont gBaseUtil.SetEnableControl(label_band,true); //utilisables et non grisés gBaseUtil.SetEnableControl(label_mode,true); gBaseUtil.SetEnableControl(label_rate,true); gBaseUtil.SetEnableControl(label_guard,true); gBaseUtil.SetEnableControl(label_const,true); gBaseUtil.SetEnableControl(label_snr,true); gBaseUtil.SetEnableControl(label_dB,true); gBaseUtil.SetEnableControl(label3,true); gBaseUtil.SetEnableControl(numericUpDown1,true); gBaseUtil.SetEnableControl(button_open, true); gBaseUtil.SetEnableControl(checkBox1, true); // si aucune selection de modulation n'est faite, on rend invisible tout les paramètres if (selection<0) { Modulator_Type->Width= 190; gBaseUtil.SetShowContol(label_band, SW_HIDE); gBaseUtil.SetShowContol(label_mode, SW_HIDE); gBaseUtil.SetShowContol(label_rate, SW_HIDE); gBaseUtil.SetShowContol(label_guard, SW_HIDE); gBaseUtil.SetShowContol(label_const, SW_HIDE); gBaseUtil.SetShowContol(label3, SW_HIDE); gBaseUtil.SetShowContol(label_snr, SW_HIDE); gBaseUtil.SetShowContol(label_dB, SW_HIDE); gBaseUtil.SetShowContol(combo_band, SW_HIDE); gBaseUtil.SetShowContol(combo_mode, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_T, SW_HIDE); gBaseUtil.SetShowContol(combo_guard, SW_HIDE); gBaseUtil.SetShowContol(combo_const, SW_HIDE); gBaseUtil.SetShowContol(combo_qam, SW_HIDE); gBaseUtil.SetShowContol(numericUpDown1, SW_HIDE); gBaseUtil.SetShowContol(checkBox1, SW_HIDE); } // DVB-S.2 8PSK choisi par defaut, on affiche les paramètres en conséquence. if (selection==0) { gBaseUtil.SetShowContol(label_band, SW_SHOW); gBaseUtil.SetShowContol(label_mode, SW_SHOW); gBaseUtil.SetShowContol(label_rate, SW_SHOW); gBaseUtil.SetShowContol(label_guard, SW_SHOW); gBaseUtil.SetShowContol(label_const, SW_SHOW); gBaseUtil.SetShowContol(label_snr, SW_SHOW); //gBaseUtil.SetShowContol(label3, SW_SHOW); gBaseUtil.SetShowContol(combo_band, SW_SHOW); gBaseUtil.SetShowContol(combo_mode, SW_SHOW); gBaseUtil.SetShowContol(combo_rate_S, SW_SHOW); //gBaseUtil.SetShowContol(combo_rate_T, SW_SHOW); gBaseUtil.SetShowContol(combo_guard, SW_SHOW); gBaseUtil.SetShowContol(combo_const, SW_SHOW); gBaseUtil.SetShowContol(combo_qam, SW_SHOW); gBaseUtil.SetShowContol(checkBox1, SW_SHOW); //Permet d'afficher le premier article de chaque comboBox combo_band->SelectedIndex= select_band; combo_mode->SelectedIndex= select_mode; combo_rate_S->SelectedIndex= select_rate_S; combo_rate_T->SelectedIndex= select_rate_T; combo_guard->SelectedIndex= select_guard; combo_const->SelectedIndex= select_const; combo_qam->SelectedIndex= select_qam; } } void Form2::ConfigModulation() { int selection; selection = gBaseUtil.SelectedIndex_Combo(Combo_MODULATOR_TYPE); // gBaseUtil.SetText_Label(label1, selection); // temporaire: affiche la valeur de l'index de la comboBox de modulation if (selection<0) { gBaseUtil.SetShowContol(label_band, SW_HIDE); gBaseUtil.SetShowContol(label_mode, SW_HIDE); gBaseUtil.SetShowContol(label_rate, SW_HIDE); gBaseUtil.SetShowContol(label_guard, SW_HIDE); gBaseUtil.SetShowContol(label_const, SW_HIDE); gBaseUtil.SetShowContol(label_snr, SW_HIDE); gBaseUtil.SetShowContol(checkBox1, SW_HIDE); gBaseUtil.SetShowContol(combo_band, SW_HIDE); gBaseUtil.SetShowContol(combo_mode, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_T, SW_HIDE); gBaseUtil.SetShowContol(combo_guard, SW_HIDE); gBaseUtil.SetShowContol(combo_const, SW_HIDE); gBaseUtil.SetShowContol(combo_qam, SW_HIDE); } //////DVB-S.2 8PSK : 0\\\\\\ //////DVB-S.2 QPSK : 1\\\\\\ //////DVB-T/H : 2\\\\\\\\\\\ //////QUAM-n : 3\\\\\\\\\\\\ //////DVB-S QSPK : 4\\\\\\\\ //AFFICHE LES BONS PARAMETRES SELON LE TYPE DE MODULATION switch (selection) { case 0: Modulator_Type->Width= 190; gBaseUtil.SetShowContol(combo_qam, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_SHOW); gBaseUtil.SetShowContol(combo_rate_T, SW_HIDE); break; case 1: Modulator_Type->Width= 190; gBaseUtil.SetShowContol(combo_qam, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_SHOW); gBaseUtil.SetShowContol(combo_rate_T, SW_HIDE); break; case 2: Modulator_Type->Width= 190; gBaseUtil.SetShowContol(combo_qam, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_T, SW_SHOW); break; case 3: Modulator_Type->Width= 399; gBaseUtil.SetShowContol(combo_qam, SW_SHOW); gBaseUtil.SetShowContol(combo_rate_S, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_T, SW_SHOW); break; case 4: Modulator_Type->Width= 190; gBaseUtil.SetShowContol(combo_qam, SW_HIDE); gBaseUtil.SetShowContol(combo_rate_S, SW_SHOW); gBaseUtil.SetShowContol(combo_rate_T, SW_HIDE); break; } } void Form2::Click_Play_Stop() { String^ cmd; //Commande à envoyer au 786x ou 780x static char *c_cmd; // Pareil que String^ cmd int freq; //Il faut choisir un ts pour pouvoir envoyer les données if (textBox1->Text=="") //Si on ne choisit aucun fichier { MessageBox::Show("Choisissez un fichier de type .ts", "Erreur - Mauvais fichier Selectionné", MessageBoxButtons::OK, MessageBoxIcon::Exclamation ); // Si on clique sur Play avant d'ouvrir un fichier return; } cmd=Donnees(); //On récupère les données des paramètres qu'on met dans une chaine de caractères freq=param_frequence(); //on met la fréquence de l'appareil à celle que l'on a choisie. Init_communication(); //On initialise la communication, soit en USB ou en TCP/IP Envoi_Commande("*REM\n"); //Mise en mode "Commande à Distance de l'appareil", la face avant est désactivée, et REMOTE est indiqué en bas de l'écran Changer_Frequence_Appareil(freq); Envoi_Commande("*LOC\n"); //Mise en mode LOCAL, les parametres peuvent etre utilisés par la face avant Close_communication(); //convertit un string en char c_cmd= (char*)(void*)Marshal::StringToHGlobalAnsi(cmd); //On crée un thread avec les commandes comme paramètres ThreadParametre ^ExempleThread = gcnew ThreadParametre(c_cmd); Thread ^envoyer = gcnew Thread(gcnew ThreadStart(ExempleThread, &ThreadParametre::Envoi_Donnees)); // Envoi_Donnees est la fonction exécutée par le thread. if (Play_Stop->ImageIndex==0) //si l'image du bouton est une fleche { play_boucle=true; //pour boucle de loopfile. Play_Stop->ImageIndex=1; // le bouton devient un bouton stop // Dès qu'on appuie sur PLAY on ne peut plus changer les paramètres, il faut appuyer sur Stop pour pouvoir les changer gBaseUtil.SetEnableControl(Combo_MODULATOR_TYPE,false); gBaseUtil.SetEnableControl(combo_band,false); gBaseUtil.SetEnableControl(combo_mode,false); gBaseUtil.SetEnableControl(combo_rate_S,false); gBaseUtil.SetEnableControl(combo_rate_T,false); gBaseUtil.SetEnableControl(combo_guard,false); gBaseUtil.SetEnableControl(combo_const,false); gBaseUtil.SetEnableControl(combo_qam,false); gBaseUtil.SetEnableControl(label_band,false); //Tous les Boutons et groupbox deviennent Grisés, on ne peux plus les utiliser gBaseUtil.SetEnableControl(label_mode,false); gBaseUtil.SetEnableControl(label_rate,false); gBaseUtil.SetEnableControl(label_guard,false); gBaseUtil.SetEnableControl(label_const,false); gBaseUtil.SetEnableControl(label_snr,false); gBaseUtil.SetEnableControl(label_dB,false); gBaseUtil.SetEnableControl(label3,false); gBaseUtil.SetEnableControl(numericUpDown1,false); gBaseUtil.SetEnableControl(button_open, false); gBaseUtil.SetEnableControl(textBox1, false); gBaseUtil.SetEnableControl(checkBox1, false); gBaseUtil.SetEnableControl(ELabOutputFrequency, false); if (button_OK->Text=="Changer")// si les limites du graph sont validés on peut activer le lancement des mesures. { button_lancer->Enabled=true; } else { button_lancer->Enabled=false;//sinon on n'active pas le lancement des mesures } envoyer->Start(); //on démarre le thread } else//on appuie sur stop { if(button_lancer->Text=="Arrêter la mesure") MessageBox::Show("Veuillez d'abord arrêter la mesure "); else { play_boucle=false; //pour boucle de loopfile. Play_Stop->ImageIndex=0; envoyer->Abort(); MessageBox::Show("TEST: Après l'arret du thread"); //Les paramètres sont de nouveau accessible. gBaseUtil.SetEnableControl(Combo_MODULATOR_TYPE,true); gBaseUtil.SetEnableControl(combo_band,true); gBaseUtil.SetEnableControl(combo_mode,true); gBaseUtil.SetEnableControl(combo_rate_S,true); gBaseUtil.SetEnableControl(combo_rate_T,true); gBaseUtil.SetEnableControl(combo_guard,true); gBaseUtil.SetEnableControl(combo_const,true); gBaseUtil.SetEnableControl(combo_qam,true); gBaseUtil.SetEnableControl(label_band,true); gBaseUtil.SetEnableControl(label_mode,true); gBaseUtil.SetEnableControl(label_rate,true); gBaseUtil.SetEnableControl(label_guard,true); gBaseUtil.SetEnableControl(label_const,true); gBaseUtil.SetEnableControl(label_snr,true); gBaseUtil.SetEnableControl(label_dB,true); gBaseUtil.SetEnableControl(numericUpDown1,true); gBaseUtil.SetEnableControl(button_open, true); gBaseUtil.SetEnableControl(textBox1, true); gBaseUtil.SetEnableControl(checkBox1, true); gBaseUtil.SetEnableControl(ELabOutputFrequency, true); button_lancer->Enabled=false; } } } String^ Form2::Donnees() { short unsigned int modul, band, mode, rate_T, rate_S, guard, conste, qam ; char* c_modulation; char* c_constellation; char* total; char* modulation[5]={"DVBS2_8PSK","DVBS2_QPSK","OFDM","QAM","QSPK"}; char* constellation[6]={"QPSK","QAM16","QAM64","QAM4NR","QAM4","QAM32"}; static char cmd[256]; String^ s_band; String^ s_mode; String^ s_rate_T; String^ s_rate_S; String^ s_guard; String^ s_qam; String^ s_snr; String^ s_file; String^ s_file_name; String^ s_total; String^ s_loop; String^ s_frequence; //On prend le numero de l'index de chaque comboBox modul = gBaseUtil.SelectedIndex_Combo(Combo_MODULATOR_TYPE); band = gBaseUtil.SelectedIndex_Combo(combo_band); mode = gBaseUtil.SelectedIndex_Combo(combo_mode); rate_T = gBaseUtil.SelectedIndex_Combo(combo_rate_T); rate_S = gBaseUtil.SelectedIndex_Combo(combo_rate_S); guard = gBaseUtil.SelectedIndex_Combo(combo_guard); conste = gBaseUtil.SelectedIndex_Combo(combo_const); qam = gBaseUtil.SelectedIndex_Combo(combo_qam); //gBaseUtil.SetText_Label(label1,modul); //si on autorise le bruit, alors on prend la valeur de la numricUpDown sinon elle vaut -1 par defaut, ce qui signifie qu'il n'y a pas de bruit if(checkBox1->Checked==true) s_snr=Get_Value(); else s_snr= "-1"; //on récupère chaque texte des paramètres choisit (Bandwidth, qam, code rate, guard interval,snr, ts file) s_band = combo_band->Items[band]->ToString(); s_mode = combo_mode->Items[mode]->ToString(); s_rate_T = combo_rate_T->Items[rate_T]->ToString(); s_rate_S = combo_rate_S->Items[rate_S]->ToString(); s_guard = combo_guard->Items[guard]->ToString(); s_qam = combo_qam->Items[qam]->ToString(); s_file = textBox1->Text->ToString(); s_file_name = openFileDialog1->SafeFileName->ToString(); s_frequence= ELabOutputFrequency->Text->ToString(); //on affecte la vraie valeur de la constellation et modulation grâce au tableau c_constellation=constellation[conste]; c_modulation= modulation[modul]; //convertit un char en string String^ s_modulation= gcnew String( c_modulation ); String^ s_constellation= gcnew String(c_constellation); //gBaseUtil.SetText_Label(label1, total); ////////MODULATION\\\\\\\\\\////CONSTELLATION\\\\\\\ //////DVB-S.2 8PSK : 0\\\\\\//////QPSK : 0\\\\\\\\\\ //////DVB-S.2 QPSK : 1\\\\\\//////16-QAM : 1\\\\\\\\ //////DVB-T/H : 2\\\\\\\\\\\//////64-QAM : 2\\\\\\\\ //////QUAM-n : 3\\\\\\\\\\\\//////4NR-QAM : 3\\\\\\\ //////DVB-S QSPK : 4\\\\\\\\//////4-QAM : 4\\\\\\\\\ //////////////////////////////////32-QAM : 5\\\\\\\\ // frequence fixe -mf: 474 MHz pour T et 1000 mhZ pour S //level fixe -ml: -30 par defaut //nombre de fois qu'il faut boucler le dossier fixe -l=: 0 par defaut switch (modul) //selon la modulation, la fréquence n'est pas la même ni le code rate { case 0: // Modulation DVB-S2 8PSK //on rentre tout les paramètres dans une chaine String s_total= "DtPlay "+s_file_name+" "+"-mf "+s_frequence+" "+"-ml -30"+" "+"-mt "+s_modulation+" "+"-mB "+s_band+" "+"-mT "+s_mode+" "+"-mC "+s_constellation+" "+"-mG "+s_guard+" "+"-mc "+s_rate_S+" "+"-snr "+s_snr+" "+"-l 0 "; //convertit un string en char total= (char*)(void*)Marshal::StringToHGlobalAnsi(s_total); //on passe le char dans cmd et on peut envoyer au géné strcpy(cmd, total); break; case 1: // Modulation DVB-S2 QPSK s_total= "DtPlay "+s_file_name+" "+"-mf "+s_frequence+" "+"-ml -30"+" "+"-mt "+s_modulation+" "+"-mB "+s_band+" "+"-mT "+s_mode+" "+"-mC "+s_constellation+" "+"-mG "+s_guard+" "+"-mc "+s_rate_S+" "+"-snr "+s_snr+" "+"-l "+s_loop+" "; // header + TS file name + [option] [param] + [option] [param]... total= (char*)(void*)Marshal::StringToHGlobalAnsi(s_total); strcpy(cmd, total); //On copie total ( Chaine de caracteres de tous les parametres) dans cmd break; case 2: // Modulation DVB-T/H s_total= "DtPlay "+s_file_name+" "+"-mf "+s_frequence+" "+"-ml -30"+" "+"-mt "+s_modulation+" "+"-mB "+s_band+" "+"-mT "+s_mode+" "+"-mC "+s_constellation+" "+"-mG "+s_guard+" "+"-mc "+s_rate_T+" "+"-snr "+s_snr+" "+"-l 0 "; // header + TS file name + [option] [param] + [option] [param]... total= (char*)(void*)Marshal::StringToHGlobalAnsi(s_total); strcpy(cmd, total); // gBaseUtil.SetText_Label(label2, cmd); // gBaseUtil.SetText_Label(label1, "DtPlay TS188-15Mbps.ts -mf 474.0 -ml -30 -mt OFDM -mB 8 -mT 8k -mC QAM64 -mG 1/32 -mc 2/3 -l 0"); // header + TS file name + [option] [param] + [option] [param]... // Refresh(); break; case 3: // Modulation QAM-n s_total= "DtPlay "+s_file_name+" "+"-mf "+s_frequence+" "+"-ml -30"+" "+"-mt "+s_modulation+" "+"-mB "+s_band+" "+"-mT "+s_mode+" "+"-mC "+s_constellation+" "+"-mG "+s_guard+" "+"-mc "+s_rate_T+" "+"-snr "+s_snr+" "+"-l "+s_loop+" "; // header + TS file name + [option] [param] + [option] [param]... total= (char*)(void*)Marshal::StringToHGlobalAnsi(s_total); strcpy(cmd, total); break; case 4: // Modulation DVB-S QPSK s_total= "DtPlay "+s_file_name+" "+"-mf "+s_frequence+" "+"-ml -30"+" "+"-mt "+s_modulation+" "+"-mB "+s_band+" "+"-mT "+s_mode+" "+"-mC "+s_constellation+" "+"-mG "+s_guard+" "+"-mc "+s_rate_S+" "+"-snr "+s_snr+" "+"-l "+s_loop+" "; // header + TS file name + [option] [param] + [option] [param]... total= (char*)(void*)Marshal::StringToHGlobalAnsi(s_total); strcpy(cmd, total); break; } String^ s_cmd= gcnew String( cmd ); // la fonction retourne un string donc on convertit le char. return s_cmd; } String^ Form2::Get_Value()//on récupère la valeur de la numericUpDown et on remplace la virgule par un point { String^ snr; snr=numericUpDown1->Text->ToString(); String^ snr2= snr->Replace(",","."); return snr2; } void Form2::affichage_limites(int type_bouton) { switch (type_bouton) { //bouton Niveau/puissance case 0: this->groupBox_limite->Location = System::Drawing::Point(10, 360); label_min_ab->Text= "Fréquence Min (MHz):"; label_max_ab->Text= "Fréquence Max (MHz):"; label_pas_ab->Text= "Fréquence Pas (MHz):"; label_min_or->Text= "Niveau Min (dB):"; label_max_or->Text= "Niveau Max (dB):"; label_pas_or->Text= "Niveau Pas (dB):"; break; //bouton X case 1: this->groupBox_limite->Location = System::Drawing::Point(200, 360); //nom des abscisses et ordonnées break; } } void Form2::Bouton_OK() { if((textBox_min_ab->Text=="")||(textBox_max_ab->Text=="")||(textBox_pas_ab->Text=="")||(textBox_min_or->Text=="")||(textBox_max_or->Text=="")||(textBox_pas_or->Text=="")) MessageBox::Show("Veuillez remplir toutes les limites"); else { if(button_OK->Text=="OK")// si on clique sur ok, le bouton devient changer et on rend les textbox inaccessibles { // le bouton lancer la mesure devient accessible. button_OK->Text="Changer"; textBox_min_ab->Enabled=false; textBox_max_ab->Enabled=false; textBox_pas_ab->Enabled=false; textBox_min_or->Enabled=false; textBox_max_or->Enabled=false; textBox_pas_or->Enabled=false; if(Play_Stop->ImageIndex==1) //Si on a rempli les mesures et appuyé sur Ok, alors si On envoie un fichier au Dektek ou Teleview button_lancer->Enabled=true; //On peut lancer les mesures } else if(button_OK->Text=="Changer") { if(button_lancer->Text=="Lancer la mesure")// si on clique sur changer que que la mesure n'est pas lancer, le bouton devient Ok et les textbox accessible { // le bouton lancer la mesure devient inaccessible. button_OK->Text="OK"; // textBox_min_ab->Enabled=true; textBox_max_ab->Enabled=true; textBox_pas_ab->Enabled=true; textBox_min_or->Enabled=true; //On réactive les boutons de mesure textBox_max_or->Enabled=true; textBox_pas_or->Enabled=true; button_lancer->Enabled=false; } if(button_lancer->Text=="Arrêter la mesure") // Si la mesure est lancé il faut d'avoir l'arrêter pour pouvoir changer les limites. MessageBox::Show("Veuillez arrêter la mesure"); } } } void Form2::Lancer_Mesure(int type_mesure) { Utiliser_Excel xl; char* lim; //du graphique String^limites; //les limites char* pt; static char argv[32][32]; char* pargv[20]; //pour decortiquer des chaines int num[6]; //valeurs des limites int i=0; unsigned int colonne=2, ligne=2; if(button_lancer->Text=="Arrêter la mesure")// si la mesure est lancée, on l'arrête. { button_lancer->Text="Lancer la mesure"; Click_Play_Stop(); //on arrête l'envoi des données comme si on appuyait sur stop. } else if (Play_Stop->ImageIndex==1) { if(button_OK->Text=="OK") // les limites ne sont pas validées. MessageBox::Show("Veuillez valider les limites"); else//si l'application est lancée et les limites validées, on peut lancer les mesures { button_lancer->Text="Arrêter la mesure"; Init_communication(); //on intialise la connection avec l'appareil. //ON RECUPERE LES LIMITES limites=valeur_limites(); //convertit un string en char lim= (char*)(void*)Marshal::StringToHGlobalAnsi(limites); //on décortique la chaine totale pour avoir les valeurs des limites while (true) { pt = strstr(lim, " "); // find space if (pt == 0) // space not find { strcpy(argv[i++], lim); // last command break; // end of cmd } *pt = 0; // end of string strcpy(argv[i++], lim); // one command pargv[i] = &argv[i][0]; // init pointer *pt++; // next command strcpy(lim, pt); // erase previous command } // on convertit les limites char en int num[0] = atoi(pargv[1]); // freq min num[1] = atoi(pargv[2]); // freq max num[2] = atoi(pargv[3]); // pas freq num[3] = atoi(pargv[4]); // niveau min num[4] = atoi(pargv[5]); // niveau max num[5] = atoi(pargv[6]); // pas niveau switch(type_mesure) { case 0: //mesure niveau/puissance //int *num; int niv, freq;// valeur de la fréquence int *tableau; //nombre de colonne et ligne du graphique char *resultat; //ce que renvoie l'appareil char* ptA; String^ result; String^ nom_appareil; //Limites miniamales du niveau de dektec if (num[3]<60) num[3]=60; if (num[4]>80) num[4]=80; Envoi_Commande("*REM\n"); //Mise en mode Commande a distance nom_appareil=Identite_Appareil(); //On ouvre excel, on initialise le tableur et le graphique, on recupère le nb de colonne et ligne tableau = xl.Init_Excel(num,"Niveau en fonction de la fréquence "+nom_appareil, "Fréquence (MHz)","Niveau(dB/µV)"); //fonction qui initalise tableur et graphique for(niv=num[3]; niv<=num[4]; niv=niv+num[5])// pour le niveau allant de la valeur min à la valeur max à un pas donné. { Changer_Niveau_Gene(niv); for(freq=num[0];freq<=num[1]; freq=freq+num[2]) //pour la fréquence allant de la valeur min à la valeur max à un pas donné. { //0: si la fréquence est en abscisse, 1: si la fréquence est en abcisse Changer_Frequence_Gene(freq); Changer_Frequence_Appareil(freq); Sleep(3000); result/*resultat*/=Interroger_Appareil(); //convertit un string en char resultat= (char*)(void*)Marshal::StringToHGlobalAnsi(result); //on décortique la chaine resultat pour avoir le niveau. if(strstr(resultat, "RESULT ")) { ptA = strstr(resultat, " "); // find space *ptA++; // next command strcpy(resultat, ptA); // erase previous command ptA = strstr(resultat, ","); //find comma *ptA = 0; // end of string } else { MessageBox::Show("Erreur dans la chaîne renvoyée par l'appareil"); return; } xl.Resultat_Excel(resultat, colonne, ligne); colonne++; } colonne=2; ligne++; } Envoi_Commande("*LOC\n"); Close_communication(); break; //MESURE X case 1: //Faire les mesures necessaires //les limites on été récupérer dans num break; } xl.Fermer_Excel(); button_lancer->Text="Lancer la mesure"; } } } String^Form2::valeur_limites() { String^ min_ab; String^ max_ab; String^ pas_ab; String^ min_or; String^ max_or; String^ pas_or; String^ total; //int min; min_ab=textBox_min_ab->Text->ToString(); max_ab=textBox_max_ab->Text->ToString(); pas_ab=textBox_pas_ab->Text->ToString(); min_or=textBox_min_or->Text->ToString(); max_or=textBox_max_or->Text->ToString(); pas_or=textBox_pas_or->Text->ToString(); total="x"+" "+min_ab+" "+max_ab+" "+pas_ab+" "+min_or+" "+max_or+" "+pas_or+" "; return total; } int Form2::param_frequence() { String^ s_frequence; char *c_frequence; int freq; s_frequence=ELabOutputFrequency->Text->ToString(); //On récupere la fréquence qu'on a tapé a la main c_frequence= (char*)(void*)Marshal::StringToHGlobalAnsi(s_frequence); //convertit un string en char freq=atoi(c_frequence); return freq; }