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
00055 while (pocketbus_recv(ctx->bus_ctx, &msg))
00056 {
00057
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
00065 if (cmd == ctx->waiting)
00066 ctx->waiting = PKTCMD_NULL;
00067
00068
00069 pocketcmd_hook_t callback = ctx->search(cmd);
00070
00071
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
00096 if (ctx->waiting != PKTCMD_NULL)
00097 {
00098
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
00112 cmd = cpu_to_be16(cmd);
00113
00114
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