pocketcmd.c

Go to the documentation of this file.
00001 
00033 #include "pocketcmd.h"
00034 #include "pocketbus.h"
00035 
00036 #include <cfg/macros.h>
00037 #include <cfg/debug.h>
00038 #include <cfg/module.h>
00039 
00040 #include <drv/timer.h>
00041 
00042 #include <mware/byteorder.h>
00043 
00044 #include <string.h>
00045 
00050 void pocketcmd_poll(struct PocketCmdCtx *ctx)
00051 {
00052     PocketMsg msg;
00053 
00054     /* Try to read a packet from pocketBus */
00055     while (pocketbus_recv(ctx->bus_ctx, &msg))
00056     {
00057         /* Check address */
00058         if (msg.addr == ctx->addr ||
00059             msg.addr == POCKETBUS_BROADCAST_ADDR)
00060         {
00061             const PocketCmdHdr *hdr = (const PocketCmdHdr *)msg.payload;
00062             pocketcmd_t cmd = be16_to_cpu(hdr->cmd);
00063 
00064             /* We're no longer waiting for a reply (in case we were) */
00065             if (cmd == ctx->waiting)
00066                 ctx->waiting = PKTCMD_NULL;
00067 
00068             /* Check for command callback */
00069             pocketcmd_hook_t callback = ctx->search(cmd);
00070 
00071             /* Call it if exists */
00072             if (callback)
00073             {
00074                 PocketCmdMsg cmd_msg;
00075 
00076                 cmd_msg.cmd_ctx = ctx;
00077                 cmd_msg.cmd = cmd;
00078                 cmd_msg.len = msg.len - sizeof(PocketCmdHdr);
00079                 cmd_msg.buf = msg.payload + sizeof(PocketCmdHdr);
00080 
00081                 callback(&cmd_msg);
00082             }
00083         }
00084     }
00085 }
00086 
00093 bool pocketcmd_send(struct PocketCmdCtx *ctx, pocketcmd_t cmd, const void *buf, size_t len, bool wait_reply)
00094 {
00095     /* Check if we are waiting a reply from someone */
00096     if (ctx->waiting != PKTCMD_NULL)
00097     {
00098         /* Check is reply timeout is elapsed */
00099         if (timer_clock() - ctx->reply_timer < ms_to_ticks(PKTCMD_REPLY_TIMEOUT))
00100         {
00101             TRACEMSG("Pkt discard! waiting cmd[%04X]\n", ctx->waiting);
00102             return false;
00103         }
00104         else
00105         {
00106             TRACEMSG("Timeout waiting cmd[%04X]\n", ctx->waiting);
00107             ctx->waiting = PKTCMD_NULL;
00108         }
00109     }
00110 
00111     /* Endianess! */
00112     cmd = cpu_to_be16(cmd);
00113 
00114     /* Send packet */
00115     pocketbus_begin(ctx->bus_ctx, ctx->addr);
00116     pocketbus_write(ctx->bus_ctx, &cmd, sizeof(cmd));
00117     pocketbus_write(ctx->bus_ctx, buf, len);
00118     pocketbus_end(ctx->bus_ctx);
00119 
00120     if (wait_reply)
00121     {
00122         ctx->waiting = cmd;
00123         ctx->reply_timer = timer_clock();
00124     }
00125     return true;
00126 }
00127 
00135 void pocketcmd_init(struct PocketCmdCtx *ctx, struct PocketBusCtx *bus_ctx, pocketbus_addr_t addr, pocketcmd_lookup_t search)
00136 {
00137     ASSERT(ctx);
00138     ASSERT(bus_ctx);
00139     ASSERT(search);
00140     MOD_CHECK(timer);
00141 
00142     memset(ctx, 0, sizeof(*ctx));
00143     ctx->bus_ctx = bus_ctx;
00144     ctx->search = search;
00145     pocketcmd_setAddr(ctx, addr);
00146 }
00147 
00151 void pocketcmd_replyAck(struct PocketCmdMsg *msg)
00152 {
00153     uint8_t ack[] = { POCKETBUS_ACK };
00154 
00155     pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, ack, sizeof(ack));
00156 }
00157 
00161 void pocketcmd_replyNak(struct PocketCmdMsg *msg)
00162 {
00163     uint8_t nak[] = { POCKETBUS_NAK };
00164 
00165     pocketcmd_slaveReply(msg->cmd_ctx, msg->cmd, nak, sizeof(nak));
00166 }
00167