= StartRepeatMulti = Start repeating communications from main board to report weights, I/O status, COM3, COM4 and optionally input counters. {{{ int StartRepeatMulti(uint32 interval, struct mnbd_multi_rep_counters_struct& counters); }}} {{{ int StartRepeatMulti(uint32 interval, struct mnbd_multi_rep_counters_struct* counters = NULL); }}} == Parameters == * interval - update interval in milliseconds * counters - structure to define any DIO counters to be reported == Return Value == * Returns the result - OK success == Remarks == The main board or option card must already be opened by calling OpenMnBd first. The call does a wait for acknowledgement. If the application is using main board communication events these events may be called during the wait for acknowledgement. COM3 (and COM4 on new style 2012 main board) receive data is also reported. == Examples == {{{ if(StartRepeatMulti(100) == OK) DisplayText(0, 0, "Wt and I/O 10 times per second"); }}} {{{ int bd = 1; int inp = 8; SetDIOCounter(bd, inp, dioSetCount, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioSetPrescaler, 1, WAIT_ACK); SetDIOCounter(bd, inp, dioSetCountUp, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioSetCountLowToHigh, 0, WAIT_ACK); SetDIOCounter(bd, inp, dioEnableCounter, 0, WAIT_ACK); struct mnbd_multi_rep_counters_struct counters; memset(&counters, 0, sizeof(counters)); counters.cnt1_bd = bd; counters.cnt1_input = inp; if(StartRepeatMulti(100, counters) == OK) DisplayText(0, 0, "Wt, I/O, cnt 10 times per second"); }}} Here is an example of a complete sample application: repeatmulti.h: {{{ #ifndef REPEATMULTI_H_ #define REPEATMULTI_H_ EVENT(MainScreenShow); BACKGROUND_EVENT(Comm); MNBD_EVENT(MultiRcv); EVENT(Exit); #endif /* REPEATMULTI_H_ */ }}} repeatmulti.cpp: {{{ #include "cardinal825.h" #include "repeatmulti.h" int main() { InitLCD(); SetCurColor(COLOR_ATTENTION); DisplayText(0, 0, "Repeat Multi Example"); ReadTouchCal(); OpenBeeper(); OpenTouch(); MnBdStartup(); MnBdSetEvent(MNBD_REQ_REP_MULTI, MnBdEventMultiRcv); MnBdSetCommEvent(MnBdSerialDataRcv); SetBackgroundEvent(BackgroundEventComm); if(StartRepeatMulti(100) != OK) { DisplayText(0, FONT_HEIGHT, "Error starting repeat multi"); return 0; } FORM_INIT(Main, EventMainScreenShow, NULL, NULL, NULL, nFormFlgNone); FORM_ADD_BUTTON(Main, Exit, 0, FONT_HEIGHT * 12, " Exit ", 'X', EventExit, FORM_BUTTON_INVERT); FORM_SHOW(Main); FORM_RUN(Main); FORM_HIDE(Main); MnBdClearCommEvent(); StopRepeatMulti(); SetBackgroundEvent(NULL); MnBdShutdown(); return 0; } EVENT(MainScreenShow) { ClearLCD(); SetCurColor(COLOR_ATTENTION); DisplayText(0, 0, "Repeat Multi Example"); ResetPrevGrossWt(); return 0; } EVENT(Exit) { return 1; // return non-zero to exit form } MNBD_EVENT(MultiRcv) { int n; for(n = 1; n <= GetNumScales(); n++) { if(IsGrossWtChanged(n)) { DisplayText(0, (FONT_HEIGHT * n) + FONT_HEIGHT, GetChangedGrossWt(n)); } } return 0; } BACKGROUND_EVENT(Comm) { // Use MnBdRead directly to prevent overhead of MnBdProcess // MnBdRead will call event MultiRcv that we registered previously when scale and DIO status is received int n; // in case we have more I/O cards than scales change this for(n = 0; n <= GetNumScales(); n++) { // 0 = MNBD_DEV, 1 .. Scales and I/O cards MnBdRead(n); } return 0; } struct mnbd_serial_struct { char buffer[100]; int pos; } mnbd_serial[2] = { { "", 0 }, { "", 0 } }; int MnBdSerialDataRcv(int nPort, int nLen, unsigned char* data) { int n; for(n = 0; n < nLen; n++) { if(data[n] == '\r') { mnbd_serial[nPort].buffer[mnbd_serial[nPort].pos = '\0'; printf("rcv com %d [%s]\r\n", nPort + 3, mnbd_serial[nPort].buffer); } else { mnbd_serial[nPort].buffer[mnbd_serial[nPort].pos++] = data[n]; } } } }}} == See Also == * [http://tech.825spectrum.com/trac/wiki/Docs/Prog/Manual/ApplicationLibraries/lib825ev/Weight/StopRepeatMulti StopRepeatMulti] * [http://tech.825spectrum.com/trac/wiki/Docs/Prog/Manual/ApplicationLibraries/lib825ev/Weight/MnBdSetEvent MnBdSetEvent]