Illusion Posté(e) le 9 février 2004 Partager Posté(e) le 9 février 2004 Je ne sais pas si quelqu'un pourra m'aider mais bon...pour un projet je dois programmer un driver pour les ports numériques d'un beck dk40. En fait je dois, en envoyant un certain code (d'une longueur de 3 bits) je sélectionne un store et en envoyant 1 ou 0 je descends ou remonte le store électrique sélectionné. Mon problème, c'est que je dois sélectionner le store sur une page HTML (un serveur web inclu sur le beck) et que je ne sais pas comment envoyer les bits lorsque je clique sur le bouton correspondant au store....je n'arrive pas à inclure le code html dans le code c... #include <DOS.H> #include <STDIO.H> #include <STRING.H> #include <STDLIB.H> #include "TCPIPAPI.H" #include "CGI.H" #include "CGIAPI.H" #define TCPIPVECT 0xAC static char * HtmlPageName = "submit_envoi"; static char * ProcessName = "process_envoi"; static CGI_Entry submit_envoi; static CGI_Entry process_envoi; /***************************************************************************/ static char ProcessPageBuffer[2048]; /***************************************************************************/ static char HtmlSubmitPage[] = "<HTML><HEAD><TITLE>IPC@Chip Form Page</TITLE></HEAD>" "<BODY BGCOLOR=\"#A0A0A0\">" "<BR><BR>" "<CENTER>" "<H1>ENVOI</H1>" "<HR size=0>" "</CENTER>" "<P>" "<FORM ACTION=/process_envoi METHOD=POST>" "Cliquez sur le bouton pour envoyer quelque chose " "<BR><BR>and <INPUT TYPE=SUBMIT NAME=\"Button\" VALUE=\"Submit\">" "</FORM>" "<HR size=0>" "</BODY>" "</HTML>"; /****************************************************************************/ //Microsoft Visual C #ifdef _MSC_VER void far _saveregs _loadds _pascal Submit_Func(rpCgiPtr CgiRequest) #else void huge _pascal Submit_Func(rpCgiPtr CgiRequest) #endif { CgiRequest->fHttpResponse = CgiHttpOk; CgiRequest->fDataType = CGIDataTypeHtml; CgiRequest->fResponseBufferPtr = HtmlSubmitPage; CgiRequest->fResponseBufferLength = strlen(HtmlSubmitPage); } /****************************************************************************/ /* int CGI_Send(char far * ArgumentBufferPtr) { union REGS inregs; union REGS outregs; struct SREGS segregs; inregs.h.ah = API_SEND; inregs.x.bx = FP_SEG(ArgumentBufferPtr); inregs.x.si = FP_OFF(ArgumentBufferPtr); int86x(CGIVECT,&inregs,&outregs,&segregs); return outregs.x.dx; } */ int Enable_IO() { //initialise les chips sélectionnés avec l'api hardware inregs.h.ah=0x83; inregs.x.dx=0x40; int86(0xA2,&inregs,&outregs); // ouvre les PIO 1 à 4 inregs.h.ah=0x82; inregs.h.al=0x05; for (i=1;i<5;i++) { inregs.x.dx=i; } int86(0xA2,&inregs,&outregs); } int Write_IO(store) { //Envoie de bit style: store=1010 ou 101 sont les 3 bits qui désignent //le store a actionner et le 4em qui désigne la montée ou la descente //récupération du paramètre qui contient les bits sous forme d'un entier //décomposition en 4 entiers int store=1001; char mot[200]; sprintf(mot,"%d",store); char bit0[2]; char bit1[2]; char bit2[2]; char bit3[2]; int D0,D1,D2,D3; bit0[0]=mot[0]; bit0[1]='\0'; printf(bit0,"%s"); bit1[0]=mot[1]; bit1[1]='\0'; printf(bit1,"%s"); bit2[0]=mot[2]; bit2[1]='\0'; printf(bit2,"%s"); bit3[0]=mot[3]; bit3[1]='\0'; printf(bit3,"%s"); D0= atoi(bit0); D1= atoi(bit1); D2= atoi(bit2); D3= atoi(bit3); union REGS inregs; union REGS outregs; struct SREGS segregs; //Selection du store avec les 3 premiers bits inregs.h.ah = 0x8D; inregs.h.dx = PIO[1] = (D0 & 0xFFFF) ^ 0x0000; inregs.h.dx = PIO[2] = (D1 & 0xFFFF) ^ 0x0000; inregs.h.dx = PIO[3] = (D2 & 0xFFFF) ^ 0x0000; inregs.x.bx = 0xFFFF; inregs.x.cx = 0x0000; int86x(0xA1,&inregs,&outregs,&segregs); //Attente d'une milliseconde avant d'envoyer le 4em bit inregs.h.ah = API_SLEEP; inregs.x.bx = 1; //milliseconds int86(TCPIPVECT,&inregs,&outregs); //Déclenchement du store (descente=0, montée=1) inregs.h.ah = 0x8D; inregs.h.dx = PIO[0] = (D3 & 0xFFFF) ^ 0x0000; inregs.x.bx = 0xFFFF; inregs.x.cx = 0x0000; int86x(0xA1,&inregs,&outregs,&segregs); } /****************************************************************************/ //Microsoft Visual C #ifdef _MSC_VER void far _saveregs _loadds _pascal Process_Func(rpCgiPtr CgiRequest) #else void huge _pascal Process_Func(rpCgiPtr CgiRequest) #endif { union REGS inregs; union REGS outregs; struct SREGS segregs; char far * FormValuePtr = NULL; char far * helpnext = NULL; int result, result2; FormItem far * formitem = NULL; strcpy(ProcessPageBuffer,HtmlPageHead); if(strlen(CgiRequest->fArgumentBufferPtr)) { FormValuePtr=(char far *)malloc(sizeof(char )*250); formitem=(FormItem far *)malloc(sizeof(FormItem)); if((FormValuePtr!=NULL) && (formitem!=NULL)) { formitem->ValuePtr = FormValuePtr; CGI_GetFormItem(CgiRequest->fArgumentBufferPtr, formitem); //activation des Input/Output PINs result = Enable_IO(); if(result == 0) {printf("Input-Output bien actives/n");} else {printf("Problème Activation Input-Output Bits/n");} //envoie d'un mot sur le PIN n°0 result2 = Write_IO(); if(result2 == 0) {printf("Mot bien envoye/n");} else {printf("Problème Envoie (fonction Write_IO()) Input-Output Bits/n");} //free memory free(FormValuePtr); free(formitem); }// else { strcat(ProcessPageBuffer,"<P>Webserver, memory allocation failed<P>"); } }//if(strlen(CgiRequest->fArgumentBufferPtr)) CgiRequest->fHttpResponse = CgiHttpOk; CgiRequest->fDataType = CGIDataTypeHtml; CgiRequest->fResponseBufferPtr = ProcessPageBuffer; CgiRequest->fResponseBufferLength = strlen(ProcessPageBuffer); } /****************************************************************************/ int main(void) { int result; union REGS inregs; union REGS outregs; printf("\r\nInstalling CGI second submit example\r\n"); #ifdef _MSC_VER printf("Microsoft C\r\n"); #endif submitexample.PathPtr = HtmlPageName; submitexample.method = CgiHttpGet; submitexample.CgiFuncPtr = Submit_Func; result = CGI_Install(&submit_envoi); if(result == CGI_ERROR) { printf("\r\nInstalling CGI function %s failed --> exit program\r\n",submit_envoi.PathPtr); return 0; } process_envoi.PathPtr = ProcessName; process_envoi.method = CgiHttpPost; process_envoi.CgiFuncPtr = Process_Func; result = CGI_Install(&process_envoi); if(result == CGI_ERROR) { printf("\r\nInstalling CGI function %s failed --> exit program\r\n",submit_envoi.PathPtr); return 0; } } Voila ce que j'ai pour le moment. J'arrive à envoyer les bits sur les ports mais je n'arrive pas à faire la liaison bouton html --> envoi de données. PS : je sais que mon code contient des erreurs (de déclarations) et qu'il n'est pas optimisé mais pour le moment, le plus important est que j'arrive à faire cette liaison. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Illusion Posté(e) le 9 février 2004 Auteur Partager Posté(e) le 9 février 2004 Je suis bloquée depuis deux jours sur cette relation html/C, j'ai besoin d'aide...svp Lien vers le commentaire Partager sur d’autres sites More sharing options...
njoyard Posté(e) le 10 février 2004 Partager Posté(e) le 10 février 2004 tu peux pas essayer de mettre dans ta page html un script qui écrit un fichier texte quelque part contenant "sélectionner le store X" par exemple, puis ensuite dans ton prog C tu fais une boucle qui checke si ce fichier existe, et si c'est le cas, tu le supprime et tu envoies la commande a tes IO... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Illusion Posté(e) le 10 février 2004 Auteur Partager Posté(e) le 10 février 2004 tu peux pas essayer de mettre dans ta page html un script qui écrit un fichier texte quelque part contenant "sélectionner le store X" par exemple, puis ensuite dans ton prog C tu fais une boucle qui checke si ce fichier existe, et si c'est le cas, tu le supprime et tu envoies la commande a tes IO... Pourquoi faire simple quand on peut faire compliquer C'est vrai que c'est plus facile pour le code C. Merci pour l'idée, je vais essayer cette solution :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
wanders Posté(e) le 15 février 2004 Partager Posté(e) le 15 février 2004 je ne peux pas te donner de code mais au moins un principe que j'avais applique pour lie une sonde numerique avec une page web. tu creer les routines pour faire faire a ton beck ce que tu as envie et apres sur la page html contenue dans le serveur web du beck tu fais un appel a un cgi qui est ton programme c compilé. faudrais que tu vois comment est architecture ton serveur web integrer au niveau des repertoires et des droits. il te faudrais une repertoire /cgi-bin par exemple avec les droits execute dessus declarer dans ton serveur. ensuite dans ta page web tu lance l'exec du cgi dans un formulaire avec la method action ou bien par un lien. voila j'espere que cela pourra t'aider. ps : mon premier message sur le forum faut que j'aille feter ca moi Lien vers le commentaire Partager sur d’autres sites More sharing options...
Illusion Posté(e) le 15 février 2004 Auteur Partager Posté(e) le 15 février 2004 je ne peux pas te donner de code mais au moins un principe que j'avais applique pour lie une sonde numerique avec une page web.tu creer les routines pour faire faire a ton beck ce que tu as envie et apres sur la page html contenue dans le serveur web du beck tu fais un appel a un cgi qui est ton programme c compilé. faudrais que tu vois comment est architecture ton serveur web integrer au niveau des repertoires et des droits. il te faudrais une repertoire /cgi-bin par exemple avec les droits execute dessus declarer dans ton serveur. ensuite dans ta page web tu lance l'exec du cgi dans un formulaire avec la method action ou bien par un lien. voila j'espere que cela pourra t'aider. ps : mon premier message sur le forum faut que j'aille feter ca moi C'est ce que j'ai fait en fait :) J'ai crée 8 process liés aux différents stores et j'ai appliqué un script cgi pour chacunà partir de la page web, ca m'a fait un code un peu "lourd" mais bon...l'essentiel est que ca marche, j'optimiserai plus tard Merci quand même (c'est vrai que j'aurais du éditer le titre du topic plus tôt ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.