/* * 扫描可用的终端模块 * 若在一轮中发现可用的终端后 * 将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; }
/* * 读取相关寄存器判断模块是否工作正常 */ 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); }
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); }
/* * 设置发送或接收的数据地址 * 此函数以后必定重写,写的太难受了。。。 * 里面还存在问题,在输入的值超过输入返回内后 * 返回值是将原来的值/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; }
// 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; } }