static int cow_simple_read (void) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; char *buffer; size_t buffer_size; int status; char *endptr; direct_access_element_t *traverse; /* traverse list and check entries */ for (traverse = direct_list; traverse != NULL; traverse = traverse->next) { vl.values = values; vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "onewire", sizeof (vl.plugin)); sstrncpy (vl.plugin_instance, traverse->address, sizeof (vl.plugin_instance)); status = OW_get (traverse->path, &buffer, &buffer_size); if (status < 0) { ERROR ("onewire plugin: OW_get (%s) failed. status = %#x;", traverse->path, status); return (-1); } DEBUG ("onewire plugin: Read onewire device %s as %s", traverse->path, buffer); endptr = NULL; values[0].gauge = strtod (buffer, &endptr); if (endptr == NULL) { ERROR ("onewire plugin: Buffer is not a number: %s", buffer); continue; } sstrncpy (vl.type, traverse->file, sizeof (vl.type)); sstrncpy (vl.type_instance, "", sizeof ("")); plugin_dispatch_values (&vl); free (buffer); } /* for (traverse) */ return 0; } /* int cow_simple_read */
static int cow_read_bus (const char *path) { char *buffer; size_t buffer_size; int status; char *buffer_ptr; char *dummy; char *saveptr; char subpath[4096]; status = OW_get (path, &buffer, &buffer_size); if (status < 0) { ERROR ("onewire plugin: OW_get (%s) failed. status = %#x;", path, status); return (-1); } DEBUG ("onewire plugin: OW_get (%s) returned: %s", path, buffer); dummy = buffer; saveptr = NULL; while ((buffer_ptr = strtok_r (dummy, ",/", &saveptr)) != NULL) { int i; dummy = NULL; if (strcmp ("/", path) == 0) status = ssnprintf (subpath, sizeof (subpath), "/%s", buffer_ptr); else status = ssnprintf (subpath, sizeof (subpath), "%s/%s", path, buffer_ptr); if ((status <= 0) || (status >= (int) sizeof (subpath))) continue; for (i = 0; i < ow_family_features_num; i++) { if (strncmp (ow_family_features[i].family, buffer_ptr, strlen (ow_family_features[i].family)) != 0) continue; cow_read_values (subpath, buffer_ptr + strlen (ow_family_features[i].family), ow_family_features + i); break; } if (i < ow_family_features_num) continue; /* DS2409 */ if (strncmp ("1F.", buffer_ptr, strlen ("1F.")) == 0) { cow_read_ds2409 (subpath); continue; } } /* while (strtok_r) */ free (buffer); return (0); } /* int cow_read_bus */
/* Lire la liste des capteurs du reseau OW */ int OneWire_Liste() { char Name[20]; char ValDef[20]; CAPTEUR *Capteur; CAPTEUR *LstCapteur; char *buf, *Id, *fin; size_t s ; if (g_debuglevel>=DEBUG_VERBOSE) Flog_Ecrire("Recherche automatique des capteurs"); //Initialisation LstCapteur = g_LstCapteur; while(LstCapteur != NULL) { Capteur = LstCapteur; LstCapteur = Capteur->Suivant; free(Capteur); } LstCapteur = NULL; //Obtenir la liste des capteurs //Exemple de liste 10.0429A9010800/,10.E20E4C010800/,10.7E474C010800/,10.13EF5F010800/,10.5349A9010800/,28.494D48010000/,22.12591A000000/,22.558B1A000000/,12.8D7845000000/,29.41C105000000/,bus.0/,uncached/,settings/,system/,statistics/,structure/,simultaneous/,alarm/ if(!OneWire_Acquire()) return FALSE; OW_get("/",&buf,&s) ; if (g_debuglevel>=DEBUG_VERBOSE) Flog_Ecrire("Liste des capteurs trouvés : %s", buf); //Mémoriser les capteurs Id = buf; while(*Id!='\0') { //Isoler le capteur dans la liste fin = strchr(Id, '/'); if(fin==NULL) { Flog_Ecrire("Fin anormal de la liste des capteurs : '/' non trouvé."); goto OneWire_Liste_LblFin; } *fin = '\0'; //Contrôle validité if(Id[2] != '.') { if (g_debuglevel>=DEBUG_INFO) Flog_Ecrire("Capteur inconnu : %s (Pas de . en 3ème position).", Id); Id = fin+2; continue; } //Contrôle gestion if(!OneWire_Serial2Name(Id, Name, ValDef)) { if (g_debuglevel>=DEBUG_INFO) Flog_Ecrire("Capteur non géré : %s", Id); Id = fin+2; continue; } //Ajout dans la liste chainée Capteur = malloc(sizeof(CAPTEUR)); if(Capteur==NULL) { if(g_debuglevel>=DEBUG_INFO) Flog_Ecrire("Pas assez de mémoire pour créer un capteur."); goto OneWire_Liste_LblFin; } Capteur->No = ++g_NbCapteur; Capteur->ValeurFloat = 0; Capteur->Valeur1 = 0; Capteur->Valeur2 = 0; Capteur->DerniereLecture = 0; Capteur->Interval = 10; Capteur->bMasquer = FALSE; sprintf(Capteur->Id, "%s/%s", Id, ValDef); Capteur->Nom[0] = Id[0]; Capteur->Nom[1] = Id[1]; strcpy(Capteur->Nom+2, Id+3); Capteur->Suivant = LstCapteur; LstCapteur = Capteur; if (g_debuglevel>=DEBUG_INFO) Flog_Ecrire("Capteur n°%d: %s (%s)", Capteur->No, Capteur->Id, Name); Id = fin+2; } //Déconnexion OneWire_Liste_LblFin: g_LstCapteur = LstCapteur; if((g_debuglevel>=DEBUG_INFO)&&(LstCapteur==NULL)) Flog_Ecrire("Aucun capteur prise en charge"); free(buf); OW_finish(); if (g_debuglevel>=DEBUG_VERBOSE) Flog_Ecrire("Fin de recherche automatique des capteurs"); return TRUE; }
static int cow_read_values (const char *path, const char *name, const ow_family_features_t *family_info) { value_t values[1]; value_list_t vl = VALUE_LIST_INIT; int success = 0; if (sensor_list != NULL) { DEBUG ("onewire plugin: Checking ignorelist for `%s'", name); if (ignorelist_match (sensor_list, name) != 0) return 0; } vl.values = values; vl.values_len = 1; sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "onewire", sizeof (vl.plugin)); sstrncpy (vl.plugin_instance, name, sizeof (vl.plugin_instance)); for (size_t i = 0; i < family_info->features_num; i++) { char *buffer; size_t buffer_size; int status; char file[4096]; char *endptr; snprintf (file, sizeof (file), "%s/%s", path, family_info->features[i].filename); file[sizeof (file) - 1] = 0; buffer = NULL; buffer_size = 0; DEBUG ("Start reading onewire device %s", file); status = OW_get (file, &buffer, &buffer_size); if (status < 0) { ERROR ("onewire plugin: OW_get (%s/%s) failed. status = %#x;", path, family_info->features[i].filename, status); return (-1); } DEBUG ("Read onewire device %s as %s", file, buffer); endptr = NULL; values[0].gauge = strtod (buffer, &endptr); if (endptr == NULL) { ERROR ("onewire plugin: Buffer is not a number: %s", buffer); continue; } sstrncpy (vl.type, family_info->features[i].type, sizeof (vl.type)); sstrncpy (vl.type_instance, family_info->features[i].type_instance, sizeof (vl.type_instance)); plugin_dispatch_values (&vl); success++; free (buffer); } /* for (i = 0; i < features_num; i++) */ return ((success > 0) ? 0 : -1); } /* int cow_read_values */
/* Fonctions OneWire Haut niveau */ int OneWire_Lire(CAPTEUR *Capteur) { int i; char Txt[24], No; float ValFloat = 0; int Valeur1 = 0; int Valeur2 = 0; int Retour; char *buf; size_t s ; //Lecture du capteur //Retour = OW_lread(Capteur->Id, Txt, sizeof(Txt), 0); Retour = OW_get(Capteur->Id, &buf, &s); strcpy(Txt, buf); free(buf); if(Retour<1) { Flog_Ecrire("Impossible de lire le capteur %s (%s)", Capteur->Nom, Capteur->Id); return FALSE; } Txt[Retour] = '\0'; //affectation de la valeur i = ((int) Capteur->Id[0]-48)*16+(int) Capteur->Id[1]-48; switch(i) { case 0x05 : //DS2405 Valeur1 = atoi(Txt); break; case 0x10 : //DS1820 ValFloat = atof(Txt); if(ValFloat == 85.0) ValFloat = Capteur->ValeurFloat; break; case 0x12 : //DS2406/07 Valeur1 = atoi(Txt); break; case 0x22 : //DS1822 ValFloat = atof(Txt); if(ValFloat == 85.0) ValFloat = Capteur->ValeurFloat; break; case 0x26 : //DS2438 ValFloat = atof(Txt); break; case 0x28 : //DS18?20 ValFloat = atof(Txt); if(ValFloat == 85.0) ValFloat = Capteur->ValeurFloat; break; case 0x29 : //DS2408 No = Capteur->Id[strlen(Capteur->Id)-1]; if( (No>='0') && (No<='9') ) Valeur1 = atoi(Txt); else Valeur2 = atoi(Txt); break; case 0x3A : //DS2413 Valeur1 = atoi(Txt); break; } if (g_debuglevel>=DEBUG_VERBOSE) Flog_Ecrire("Lecture ok pour le capteur %s (%s) = %s", Capteur->Nom, Capteur->Id, Txt); if( (Capteur->ValeurFloat != ValFloat) || (Capteur->Valeur1 != Valeur1) || (Capteur->Valeur2 != Valeur2) || (Capteur->DerniereLecture == 0) ) { Capteur->ValeurFloat = ValFloat; Capteur->Valeur1 = Valeur1; Capteur->Valeur2 = Valeur2; if(!Capteur->bMasquer) xpp_event(Capteur->No, Capteur->Nom, Capteur->Valeur1, Capteur->Valeur2, Capteur->ValeurFloat); } return TRUE; }