1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include <jni.h>
#include <stdio.h>
#include <parportlin_ParallelPortLin.h>
#include <linux/ioctl.h>
#include <linux/parport.h>
#include <linux/ppdev.h>
#include <fcntl.h>
struct readportpar environment[_MAXPPDEV];
int initAllEnv = -1;
/**
* Lit un Byte sur le port parallèle défini par la structure n°portBase de environment
*/
JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_readOneByte
(JNIEnv *env, jclass laclass, jint portBase)
{
struct readportpar p;
setReadportpar(portBase, &p);
if(p.define >= 0){
printf("PORT[%d] nbconnect=%d, define=%d, lecture du fd=%d = %s\n", portBase, p.nbconnect, p.define, p.fd, p.nomfich);
p.ioct = ioctl(p.fd , PPCLAIM);
if(p.ioct != 0){
printf("Erreur lors de la réclamation du port parallèle avant l'écoute.\nioctl renvoie '%d'\n", p.ioct);
}
p.ioct = ioctl(p.fd, PPRSTATUS, &p.status);
if(p.ioct != 0){
printf("Erreur lors de la récupération du status du port parallèle.\nioctl renvoie '%d'\n", p.ioct);
p.status = 0;
}
p.ioct = ioctl(p.fd, PPRELEASE);
if(p.ioct != 0){
printf("Erreur lors de la libération du port parallèle après l'écoute.\nioctl renvoie '%d'\n", p.ioct);
}
}
environment[portBase] = p;
return p.status;
}
JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_initNative
(JNIEnv *env, jclass laclass, jstring ppdevfile, jint portBase)
{
// J'initialise toutes les structure de environment une fois
if(initAllEnv < 0){
init_all_env();
}
struct readportpar p;
setReadportpar(portBase, &p);
if(p.define >= 0){
p.nbconnect = p.nbconnect+1;
printf("Ajout d'une connexion sur le fichier %s. Il y en a maintenant %d\n", p.nomfich, p.nbconnect);
environment[portBase] = p;
return 0;
}
jstring ppdf = ppdevfile;
const char *nomfich;
int fd = -1;
int ioct = -1;
nomfich = (*env)->GetStringUTFChars(env, ppdf, 0);
printf("Initialisation de ParallelPortLin avec le fichier : %s\n", nomfich);
printf("Il y a %d connexion déjà dessus.\n", p.nbconnect);
fd = open (nomfich, O_RDONLY);
if (fd == -1) {
perror ("Erreur lors de l'ouverture du fichier ppdev");
environment[portBase].define=-1;
return -1;
}
/*ioct = ioctl(fd , PPCLAIM);
if(ioct != 0){
perror("Une erreur est survenue lors de l'appropriation du port via la commande PPCLAIM de ioctl.");
return -1;
}*/
printf("File descriptor de %s = %d\n", nomfich, fd);
p.fd = fd;
p.status = 0;
p.nomfich = nomfich;
p.ppdf = ppdf;
p.ioct = ioct;
p.define = 0;
p.nbconnect = 1;
environment[portBase] = p;
return 0;
}
JNIEXPORT jint JNICALL Java_parportlin_ParallelPortLin_releaseNative
(JNIEnv *env, jclass laclass, jint portBase)
{
jint r = 0;
struct readportpar p;
setReadportpar(portBase, &p);
printf("Liberation d'une ressource sur le fichier %s. Il y en a actuellement %d.\n", p.nomfich, p.nbconnect);
if(p.define >= 0){
p.nbconnect = p.nbconnect - 1;
if(p.nbconnect <= 0){
printf("Libération des ressource de la struct readportpar '%s'.\n", p.nomfich);
(*env)->ReleaseStringUTFChars(env, p.ppdf, p.nomfich);
/*p.ioct = ioctl(p.fd, PPRELEASE);
if(p.ioct != 0){
perror("ioctl a renvoyé une erreur lors de la libération du port avec la commande PPRELEASE");
}*/
r = close (p.fd);
if(r != 0){
perror("Erreur lors de la fermeture du fichier ppdev");
}
p.define = -1;
p.nbconnect = 0;
}
printf("Libération d'une ressource sur le fichier %s. Il en reste %d.\n", p.nomfich, p.nbconnect);
}
else{
printf("Aucune structure readportpar n'est définie pour le port n° %d\n", portBase);
}
environment[portBase] = p;
return r;
}
void setReadportpar(jint portBase, struct readportpar *p){
(*p).fd = environment[portBase].fd;
(*p).status = environment[portBase].status;
(*p).nomfich = environment[portBase].nomfich;
(*p).ppdf = environment[portBase].ppdf;
(*p).ioct = environment[portBase].ioct;
(*p).define = environment[portBase].define;
(*p).nbconnect = environment[portBase].nbconnect;
}
void init_all_env(){
printf("Initialisation des environnements des port ppdev...");
int i = 0;
for(i=0; i<_MAXPPDEV; i++){
struct readportpar p;
environment[i].fd = -1;
environment[i].status = -1;
environment[i].ioct = -1;
environment[i].define = -1;
environment[i].nbconnect = 0;
}
initAllEnv = 255;
} |
Partager