pocketcmd.c
Go to the documentation of this file.00001
00058 #include "pocketcmd.h"
00059 #include "pocketbus.h"
00060
00061 #include <cfg/macros.h>
00062 #include <cfg/debug.h>
00063 #include <cfg/module.h>
00064
00065 #include <drv/timer.h>
00066
00067 #include <cpu/byteorder.h>
00068
00069 #include <string.h>
00070
00075 void pocketcmd_poll(struct PocketCmdCtx *ctx)
00076 {
00077 PocketMsg msg;
00078
00079
00080 while (pocketbus_recv(ctx->bus_ctx, &msg))
00081 {
00082
00083 if (msg.addr == ctx->addr ||
00084 msg.addr == POCKETBUS_BROADCAST_ADDR)
00085 {
00086 const PocketCmdHdr *hdr = (const PocketCmdHdr *)msg.payload;
00087 pocketcmd_t cmd = be16_to_cpu(hdr->cmd);
00088
00089
00090 if (cmd == ctx->waiting)
00091 ctx->waiting = PKTCMD_NULL;
00092
00093
00094 pocketcmd_hook_t callback = ctx->search(cmd);
00095
00096
00097 if (callback)
00098 {
00099 PocketCmdMsg cmd_msg;
00100
00101 cmd_msg.cmd_ctx = ctx;
00102 cmd_msg.cmd = cmd;
00103 cmd_msg.len = msg.len - sizeof(PocketCmdHdr);
00104 cmd_msg.buf = msg.payload + sizeof(PocketCmdHdr);
00105
00106 callback(&cmd_msg);
00107 }
00108 }
00109 }
00110 }
00111
00118 bool pocketcmd_send(struct PocketCmdCtx *ctx, pocketcmd_t cmd, const void *buf, size_t len, bool wait_reply)
00119 {
00120
00121 if (ctx->waiting != PKTCMD_NULL)
00122 {
00123
00124 if (timer_clock() - ctx->reply_timer < ms_to_ticks(PKTCMD_REPLY_TIMEOUT))
00125 {
00126 TRACEMSG("Pkt discard! waiting cmd[%04X]\n", ctx->waiting);
00127 return false;
00128 }
00129 else
00130 {
00131 TRACEMSG("Timeout waiting cmd[%04X]\n", ctx->waiting);
00132 ctx->waiting = PKTCMD_NULL;
00133 }
00134 }
00135
00136
00137 cmd = cpu_to_be16(cmd);
00138
00139
00140 pocketbus_begin(ctx->bus_ctx, ctx->addr);
00141 pocketbus_write(ctx->bus_ctx, &cmd, sizeof(cmd));
00142 pocketbus_write(ctx->bus_ctx, buf, len);
00143 pocketbus_end(ctx->bus_ctx);
00144
00145 if (wait_reply)
00146 {
00147 ctx->waiting = cmd;
00148 ctx->reply_timer = timer_clock();
00149 }
00150 return true;
00151 }
00152
00160 void pocketcmd_init(struct PocketCmdCtx *ctx, struct PocketBusCtx *bus_ctx, pocketbus_addr_t addr, pocketcmd_lookup_t search)
00161 {
00162 ASSERT(ctx);
00163 ASSERT(bus_ctx);
00164 ASSERT(search);
00165 MOD_CHECK(timer);
00166
00167 memset(ctx, 0, sizeof(*ctx));
00168 ctx->bus_ctx = bus_ctx;
00169 ctx->search = search;
00170 pocketcmd_setAddr(ctx, addr);
00171 }
00172
00176 void pocketcmd_replyAck(struct PocketCmdMsg *msg)
00177 {
00178 uint8_t ack[] = { POCKETBUS_ACK };
00179
00180 pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, ack, sizeof(ack));
00181 }
00182
00186 void pocketcmd_replyNak(struct PocketCmdMsg *msg)
00187 {
00188 uint8_t nak[] = { POCKETBUS_NAK };
00189
00190 pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, nak, sizeof(nak));
00191 }
00192