فهرست منبع

Biutify onewire module.

Vladimir N. Shilov 1 سال پیش
والد
کامیت
4122d21689
3فایلهای تغییر یافته به همراه47 افزوده شده و 16 حذف شده
  1. 0 2
      lib/onewire/boarddef.h
  2. 37 13
      lib/onewire/onewire.c
  3. 10 1
      lib/onewire/onewire.h

+ 0 - 2
lib/onewire/boarddef.h

@@ -21,8 +21,6 @@
 #define ONEWIRE_PIN                   0
 #define ONEWIRE_PAD_MODE_IDLE         PAL_MODE_INPUT
 #define ONEWIRE_PAD_MODE_ACTIVE       PAL_MODE_STM32_ALTERNATE_OPENDRAIN
-#define search_led_on()               (palClearPad(GPIOC, GPIOC_LED))
-#define search_led_off()              (palSetPad(GPIOC, GPIOC_LED))
 #define ONEWIRE_MASTER_CHANNEL        2
 #define ONEWIRE_SAMPLE_CHANNEL        3
 

+ 37 - 13
lib/onewire/onewire.c

@@ -18,6 +18,7 @@
 
 #include "hal.h"
 #include "boarddef.h"
+#include "onewire.h"
 
 /*
  ******************************************************************************
@@ -55,6 +56,7 @@ static uint8_t testbuf[12];
 /* stores 3 temperature values in millicelsius */
 static int32_t temperature[3];
 static size_t devices_on_bus = 0;
+static onewire_error_t error_code;
 
 /*
  * Config for underlying PWM driver.
@@ -133,8 +135,8 @@ static void strong_pullup_release(void) {
 /*
  *
  */
-void onewireTest(void) {
-
+void onewireMeasure(void) {
+  error_code = onewire_OK;
   int16_t tmp;
   uint8_t rombuf[24];
   size_t i = 0;
@@ -153,26 +155,38 @@ void onewireTest(void) {
   if (true == onewireReset(&OWD1)){
 
     memset(rombuf, 0x55, sizeof(rombuf));
-    search_led_on();
     devices_on_bus = onewireSearchRom(&OWD1, rombuf, 3);
-    search_led_off();
-    osalDbgCheck(devices_on_bus <= 3);
-    osalDbgCheck(devices_on_bus  > 0);
+    if (devices_on_bus == 0) {
+      error_code = onewire_No_Dev;
+      return;
+    }
 
     if (1 == devices_on_bus){
       /* test read rom command */
       presence = onewireReset(&OWD1);
-      osalDbgCheck(true == presence);
+      if (true != presence) {
+        error_code = onewire_Dev_Lost;
+        return;
+      }
       testbuf[0] = ONEWIRE_CMD_READ_ROM;
       onewireWrite(&OWD1, testbuf, 1, 0);
       onewireRead(&OWD1, testbuf, 8);
-      osalDbgCheck(testbuf[7] == onewireCRC(testbuf, 7));
-      osalDbgCheck(0 == memcmp(rombuf, testbuf, 8));
+      if (testbuf[7] != onewireCRC(testbuf, 7)) {
+        error_code = onewire_CRC_Err;
+        return;
+      }
+      if (0 != memcmp(rombuf, testbuf, 8)) {
+        error_code = onewire_MemCmp_Err;
+        return;
+      }
     }
 
     /* start temperature measurement on all connected devices at once */
     presence = onewireReset(&OWD1);
-    osalDbgCheck(true == presence);
+    if (true != presence) {
+      error_code = onewire_Dev_Lost;
+      return;
+    }
     testbuf[0] = ONEWIRE_CMD_SKIP_ROM;
     testbuf[1] = ONEWIRE_CMD_CONVERT_TEMP;
 
@@ -191,7 +205,10 @@ void onewireTest(void) {
     for (i=0; i<devices_on_bus; i++) {
       /* read temperature device by device from their scratchpads */
       presence = onewireReset(&OWD1);
-      osalDbgCheck(true == presence);
+      if (true != presence) {
+        error_code = onewire_Dev_Lost;
+        return;
+      }
 
       testbuf[0] = ONEWIRE_CMD_MATCH_ROM;
       memcpy(&testbuf[1], &rombuf[i*8], 8);
@@ -199,7 +216,10 @@ void onewireTest(void) {
       onewireWrite(&OWD1, testbuf, 10, 0);
 
       onewireRead(&OWD1, testbuf, 9);
-      osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8));
+      if (testbuf[8] != onewireCRC(testbuf, 8)) {
+        error_code = onewire_CRC_Err;
+        return;
+      }
       memcpy(&tmp, &testbuf, 2);
       temperature[i] = ((int32_t)tmp * 625) / 10;
     }
@@ -212,6 +232,10 @@ void onewireTest(void) {
   onewireStop(&OWD1);
 }
 
+onewire_error_t onewireGetErrorCode(void) {
+  return error_code;
+}
+
 uint8_t onewireGetDevicesNum(void) {
   return (uint8_t)devices_on_bus;
 }
@@ -220,6 +244,6 @@ int32_t onewireGetTemperature(const size_t num) {
   if (num > devices_on_bus || num < devices_on_bus) {
     return -999;
   } else {
-    return temperature[num-1];
+    return temperature[num];
   }
 }

+ 10 - 1
lib/onewire/onewire.h

@@ -17,10 +17,19 @@
 #ifndef _ONEWIRE_H_
 #define _ONEWIRE_H_
 
+typedef enum {
+  onewire_OK = 0,
+  onewire_No_Dev,
+  onewire_Dev_Lost,
+  onewire_CRC_Err,
+  onewire_MemCmp_Err
+} onewire_error_t;
+
 #ifdef __cplusplus
 extern "C" {
 #endif
-  void onewireTest(void);
+  void onewireMeasure(void);
+  onewire_error_t onewireGetErrorCode(void);
   uint8_t onewireGetDevicesNum(void);
   int32_t onewireGetTemperature(size_t num);
 #ifdef __cplusplus