Beispiel #1
0
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 */
Beispiel #2
0
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 */
Beispiel #3
0
/* 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;
}
Beispiel #4
0
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 */
Beispiel #5
0
/* 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;
}