Example #1
0
/*
 * 扫描可用的终端模块
 * 若在一轮中发现可用的终端后
 * 将txAddr更新为该地址 并返回值1
 * 若在一轮中没有发现可用的终端地址
 * 将txAddr设置为0x01 并返回值0
 */
 uchar scanAddr(void)
 {
    uchar  scanCnt;
    //扫描可用的终端
    printf ("Scaning enable address...\n");

    //如果扫描成功则一直扫描
    for (scanCnt = 0; scanCnt < 0xff; scanCnt ++)
     {
         txAddr [TX_ADR_WIDTH - 1] = scanCnt + 1;
         printf ("Testing address = ");
         printAddr (txAddr);
         //如果接收到数据则跳出扫描程序
         if (nrfRecv(txAddr, rxBuf))
         {
             printf ("Found Address------");
             printAddr(txAddr);
             printf ("Find end!\n");
             return 1;
         }
     }
     txAddr[TX_ADR_WIDTH - 1] = 0x01;
     printf ("Find end!\n");
     return 0;
}
Example #2
0
/*
 * 读取相关寄存器判断模块是否工作正常
 */
void checkId(void)
{
    uchar tmpCnt;
    uchar p0Addr[TX_ADR_WIDTH];
    uchar p1Addr[TX_ADR_WIDTH];
    uchar txAddr[TX_ADR_WIDTH];

    for (tmpCnt = 0; tmpCnt < TX_ADR_WIDTH; tmpCnt ++)
    {
        p0Addr[tmpCnt] = 0;
        p1Addr[tmpCnt] = 0;
        txAddr[tmpCnt] = 0;
    }

    printf ("Checking ID ...\n");

    powerDown();

    CE_CLR;
    //这三个寄存器的数值在本芯片中不是固定的
    //所以不能够用来验证NRF芯片是否工作正常
    spiReadBuf (READ_REG + RX_ADDR_P0, p0Addr, TX_ADR_WIDTH);
    spiReadBuf (READ_REG + RX_ADDR_P1, p1Addr, TX_ADR_WIDTH);
    spiReadBuf (READ_REG + TX_ADDR, txAddr, TX_ADR_WIDTH);

    CE_EN;

    printf ("RX_ADDR_P0 = ");
    printAddr (p0Addr);
    printf ("RX_ADDR_P1 = ");
    printAddr (p1Addr);
    printf ("TX_ADDR = ");
    printAddr (txAddr);
}
Example #3
0
bool OwRelay::rawWrite(uint64_t addr, bool value) {
  OneWire ds = os->getOneWire();
  uint8_t *a = (uint8_t *)&addr;
  ds.reset();
  ds.write(0x55, 1); // ROM select
  for(int i = 0; i < 8; i++) ds.write(a[i], 1);
  uint8_t bit = ds.read_bit();
  ds.reset();

  bool oops = false;
  value ^= 1;
  if ((bit&1) ^ value) {
    oops = true;
    // toggled the wrong way, toggle again...
    ds.write(0x55, 1); // ROM select
    for(int i = 0; i < 8; i++) ds.write(a[i], 1);
    bit = ds.read_bit();
    ds.reset();
  }
#if DEBUG
  Serial.print(F("OWR: Write "));
  printAddr(&Serial, addr);
  Serial.print("<-");
  Serial.print(value);
  if (oops) Serial.print(" 2xtoggle");
  Serial.print(" bit=");
  Serial.print(bit);
  Serial.println();
#endif

  return !((bit&1) ^ value);
}
Example #4
0
/*
 * 设置发送或接收的数据地址 
 * 此函数以后必定重写,写的太难受了。。。
 * 里面还存在问题,在输入的值超过输入返回内后
 * 返回值是将原来的值/255后再设置为通道的地址
 * 存在问题
 * 获取数据成功返回1
 * 获取数据失败返回0
 */
uchar getAddr(void)
{
    //接收到的通道数据十进制
    uchar numTmp = 0, loopCnt = 0;

    printf ("Please Enter your chose Address (0~255)\n");
    printf ("Please Enter : end of input\n");
    
    //清空UART数据接收缓存
    uartRecvData = '\0';
    
    for (loopCnt = 0; loopCnt < 4; loopCnt ++)
    {
        while (uartRecvData == '\0');
        if (uartRecvData == ':')
        {
            txAddr[TX_ADR_WIDTH - 1] = numTmp;
            printf ("SUCCESS Set address: ");
            printAddr(txAddr);
            return 1;
        }
        numTmp = numTmp * 10 + (uartRecvData - 48);
        uartRecvData = '\0';
    }
    printf ("Enter address error.\n");
    printf ("Please input address again.\n");
    return 0;
}
Example #5
0
// Read the state, returns -1 on failure
int8_t OwRelay::rawRead(uint64_t addr) {
  OneWire ds = os->getOneWire();
  byte data[12];
  ds.reset();
  ds.select((uint8_t *)&addr);
  uint8_t value = ds.read_bit() ^ 1; // read the switch value

#if DEBUG
  Serial.print(F("OWR: Good data for "));
  printAddr(&Serial, addr);
  Serial.print("->");
  Serial.print(value);
  Serial.println();
#endif

  return value;
}
static void printArg(EventProc proc,
                     void *arg, char argType, char *styleConv)
{
  switch (argType) {
  case 'A': {
    if (style != 'L') {
      if (style == 'C') putchar(',');
      printAddr(proc, *(Addr *)arg);
    } else
      printf(styleConv, (ulong)*(Addr *)arg);
  } break;
  case 'P': {
    printf(styleConv, (ulong)*(void **)arg);
  } break;
  case 'U': {
    printf(styleConv, (ulong)*(unsigned *)arg);
  } break;
  case 'W': {
    printf(styleConv, (ulong)*(Word *)arg);
  } break;
  case 'D': {
    switch (style) {
    case '\0':
      printf(" %#8.3g", *(double *)arg); break;
    case 'C':
      printf(", %.10G", *(double *)arg); break;
    case 'L':
      printf(" %#.10G", *(double *)arg); break;
    }
  } break;
  case 'S': {
    if (style == 'C') putchar(',');
    putchar(' ');
    printStr((EventStringStruct *)arg, (style == 'C' || style == 'L'));
  } break;
  default: error("Can't print format >%c<", argType);
  }
}
static void readLog(EventProc proc)
{
  EventCode c;
  Word bucketLimit = bucketSize;
  char *styleConv = NULL; /* suppress uninit warning */

  /* Print event count header. */
  if (reportEvents) {
    if (style == '\0') {
      printf("  bucket:");
      for(c = 0; c <= EventCodeMAX; ++c)
        if (eventEnabled[c])
          printf("  %04X", (unsigned)c);
      printf("   all\n");
    }
  }

  /* Init event counts. */
  for(c = 0; c <= EventCodeMAX; ++c)
    totalEventCount[c] = 0;
  clearBucket();

  /* Init style. */
  switch (style) {
  case '\0':
    styleConv = " %8lX"; break;
  case 'C':
    styleConv = ", %lu"; break;
  case 'L':
    styleConv = " %lX"; break;
  default:
    error("Unknown style code '%c'", style);
  }

  while (TRUE) { /* loop for each event */
    char *eventFormat;
    int argCount, i;
    Event event;
    EventCode code;
    Res res;

    /* Read and parse event. */
    res = EventRead(&event, proc);
    if (res == ResFAIL) break; /* eof */
    if (res != ResOK) error("Truncated log");
    eventTime = event->any.clock;
    code = EventGetCode(event);

    /* Output bucket, if necessary, and update counters */
    if (bucketSize != 0 && eventTime >= bucketLimit) {
      reportBucketResults(bucketLimit-1);
      clearBucket();
      do {
        bucketLimit += bucketSize;
      } while (eventTime >= bucketLimit);
    }
    if (reportEvents) {
      ++bucketEventCount[code];
      ++totalEventCount[code];
    }

    /* Output event. */
    if (verbose) {
      eventFormat = EventCode2Format(code);
      argCount = strlen(eventFormat);
      if (eventFormat[0] == '0') argCount = 0;

      if (style == 'L') putchar('(');

      switch (style) {
      case '\0': case 'L': {
        printf("%-19s", EventCode2Name(code));
      } break;
      case 'C':
        printf("%u", (unsigned)code);
        break;
      }

     switch (style) {
     case '\0':
       printf(" %8lu", (ulong)eventTime); break;
     case 'C':
       printf(", %lu", (ulong)eventTime); break;
     case 'L':
       printf(" %lX", (ulong)eventTime); break;
     }

     switch (event->any.code) {
     case EventLabel: {
       switch (style) {
       case '\0': case 'C': {
         EventString sym = LabelText(proc, event->aw.w1);
         printf((style == '\0') ? " %08lX " : ", %lu, ",
                (ulong)event->aw.a0);
         if (sym != NULL) {
           printStr(sym, (style == 'C'));
         } else {
           printf((style == '\0') ? "sym %05lX" : "sym %lX\"",
                  (ulong)event->aw.w1);
         }
       } break;
       case 'L': {
         printf(" %lX %lX", (ulong)event->aw.a0, (ulong)event->aw.w1);
       } break;
       }
     } break;
     case EventMeterValues: {
       switch (style) {
       case '\0': {
         if (event->pddwww.w3 == 0) {
           printf(" %08lX        0      N/A      N/A      N/A      N/A",
                  (ulong)event->pddwww.p0);
         } else {
           double mean = event->pddwww.d1 / (double)event->pddwww.w3;
           /* .stddev: stddev = sqrt(meanSquared - mean^2), but see */
           /* <code/meter.c#limitation.variance>. */
           double stddev = sqrt(fabs(event->pddwww.d2
                                     - (mean * mean)));
           printf(" %08lX %8u %8u %8u %#8.3g %#8.3g",
                  (ulong)event->pddwww.p0, (uint)event->pddwww.w3,
                  (uint)event->pddwww.w4, (uint)event->pddwww.w5,
                  mean, stddev);
         }
         printAddr(proc, (Addr)event->pddwww.p0);
       } break;
       case 'C': {
         putchar(',');
         printAddr(proc, (Addr)event->pddwww.p0);
         printf(", %.10G, %.10G, %u, %u, %u",
                event->pddwww.d1, event->pddwww.d2,
                (uint)event->pddwww.w3, (uint)event->pddwww.w4,
                (uint)event->pddwww.w5);
       } break;
       case 'L': {
         printf(" %lX %#.10G %#.10G %X %X %X", (ulong)event->pddwww.p0,
                event->pddwww.d1, event->pddwww.d2,
                (uint)event->pddwww.w3, (uint)event->pddwww.w4,
                (uint)event->pddwww.w5);
       } break;
       }
     } break;
     case EventPoolInit: { /* pool, arena, class */
       printf(styleConv, (ulong)event->ppp.p0);
       printf(styleConv, (ulong)event->ppp.p1);
       /* class is a Pointer, but we label them, so call printAddr */
       if (style != 'L') {
         if (style == 'C') putchar(',');
         printAddr(proc, (Addr)event->ppp.p2);
       } else
         printf(styleConv, (ulong)event->ppp.p2);
     } break;
     default:
       for (i = 0; i < argCount; ++i) {
         switch(code) {
#include "eventdef.h"
#undef RELATION
         }
       }
     }

      if (style == 'L') putchar(')');
      putchar('\n');
      fflush(stdout);
    }
    processEvent(proc, event, eventTime);
    EventDestroy(proc, event);
  } /* while(!feof(input)) */

  /* report last bucket (partial) */
  if (bucketSize != 0) {
    reportBucketResults(eventTime);
  }
  if (reportEvents) {
    /* report totals */
    switch (style) {
    case '\0': {
      printf("\n     run:");
    } break;
    case 'L': {
      printf("(t");
    } break;
    case 'C': {
      printf("%lu", eventTime+1);
    } break;
    }
    reportEventResults(totalEventCount);

    /* explain event codes */
    if (style == '\0') {
      printf("\n");
      for(c = 0; c <= EventCodeMAX; ++c)
        if (eventEnabled[c])
          printf(" %04X %s\n", (unsigned)c, EventCode2Name(c));
      if (bucketSize == 0)
        printf("\nevent clock stopped at %lu\n", (ulong)eventTime);
    }
  }
}
static void dlgPrint(
    uint64_t addr,const char *filename,int lineno,const char *funcname,
    void *context,int columnno )
{
  struct dialog_info *di = context;
#ifndef NO_DBGHELP
  char buffer[sizeof(SYMBOL_INFO)+MAX_SYM_NAME];
  SYMBOL_INFO *si = (SYMBOL_INFO*)&buffer;
  if( lineno==DWST_NO_DBG_SYM )
  {
    IMAGEHLP_LINE64 ihl;
    memset( &ihl,0,sizeof(IMAGEHLP_LINE64) );
    ihl.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
    DWORD displ;
    if( SymGetLineFromAddr64(GetCurrentProcess(),addr,&displ,&ihl) )
    {
      filename = ihl.FileName;
      lineno = ihl.LineNumber;
    }

    DWORD64 displ2;
    si->SizeOfStruct = sizeof(SYMBOL_INFO);
    si->MaxNameLen = MAX_SYM_NAME;
    if( SymFromAddr(GetCurrentProcess(),addr,&displ2,si) )
    {
      char *fn = si->Name;
      fn[MAX_SYM_NAME] = 0;
      funcname = fn;
    }
  }
#endif

  const char *delim = strrchr( filename,'/' );
  if( delim ) filename = delim + 1;
  delim = strrchr( filename,'\\' );
  if( delim ) filename = delim + 1;

  void *ptr = (void*)(uintptr_t)addr;
  switch( lineno )
  {
    case DWST_BASE_ADDR:
      if( ptr==di->lastBase ) break;
      di->lastBase = ptr;

      printAddr( di->hwnd,TEXT("base address"),-1,
          ptr,filename,0,NULL,0 );
      break;

    case DWST_NOT_FOUND:
    case DWST_NO_DBG_SYM:
    case DWST_NO_SRC_FILE:
      printAddr( di->hwnd,TEXT("    stack "),di->count++,
          ptr,NULL,0,funcname,0 );
      break;

    default:
      printAddr( di->hwnd,TEXT("    stack "),di->count,
          ptr,filename,lineno,funcname,columnno );
      if( ptr ) di->count++;
      break;
  }
}