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     /* Try to read a packet from pocketBus */
00080     while (pocketbus_recv(ctx->bus_ctx, &msg))
00081     {
00082         /* Check address */
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             /* We're no longer waiting for a reply (in case we were) */
00090             if (cmd == ctx->waiting)
00091                 ctx->waiting = PKTCMD_NULL;
00092 
00093             /* Check for command callback */
00094             pocketcmd_hook_t callback = ctx->search(cmd);
00095 
00096             /* Call it if exists */
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     /* Check if we are waiting a reply from someone */
00121     if (ctx->waiting != PKTCMD_NULL)
00122     {
00123         /* Check is reply timeout is elapsed */
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     /* Endianess! */
00137     cmd = cpu_to_be16(cmd);
00138 
00139     /* Send packet */
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