00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "CD_Main.h"
00016
00017 #include <stdio.h>
00018 #include <string.h>
00019
00020 #include <C8051F340.h>
00021
00022
00023 sbit Led1 = P2^2;
00024 sbit Sw1 = P2^0;
00025
00026
00027
00028
00029
00030 void cds_DOL(unsigned char *msg) large {
00031
00032 unsigned char subdevice;
00033 unsigned char line;
00034 unsigned char value;
00035
00036
00037 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00038 CD_LinkMsgError(CD_Err_BadSubdevice);
00039 return;
00040 };
00041
00042 if (CD_HexaStrTo_u8(msg+2, 2, &line)) {
00043 CD_LinkMsgError(CD_Err_BadLine);
00044 return;
00045 };
00046
00047 if (CD_HexaStrTo_u8(msg+4, 1, &value)) {
00048 CD_LinkMsgError(CD_Err_BadValue);
00049 return;
00050 };
00051
00052 switch(subdevice) {
00053
00054 case 0x00:
00055 if (value) {
00056 P0 |= (1 << line);
00057 } else {
00058 P0 &= ~(1 << line);
00059 }
00060 break;
00061 case 0x01:
00062 if (value) {
00063 P1 |= (1 << line);
00064 } else {
00065 P1 &= ~(1 << line);
00066 }
00067 break;
00068 case 0x02:
00069 if (value) {
00070 P2 |= (1 << line);
00071 } else {
00072 P2 &= ~(1 << line);
00073 }
00074 break;
00075 case 0x03:
00076 if (value) {
00077 P3 |= (1 << line);
00078 } else {
00079 P3 &= ~(1 << line);
00080 }
00081 break;
00082 default:
00083 CD_LinkMsgError(CD_Err_BadSubdevice);
00084 return;
00085 }
00086
00087
00088 CD_LinkMsgOK();
00089 }
00090
00091
00092
00093
00094
00095 void cds_DOP(unsigned char *msg) large {
00096
00097 unsigned char subdevice;
00098
00099 unsigned char value;
00100
00101
00102 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00103 CD_LinkMsgError(CD_Err_BadSubdevice);
00104 return;
00105 };
00106
00107 if (CD_HexaStrTo_u8(msg+8, 2, &value)) {
00108 CD_LinkMsgError(CD_Err_BadValue);
00109 return;
00110 };
00111
00112 switch(subdevice) {
00113
00114 case 0x00:
00115 P0= value;
00116 break;
00117 case 0x01:
00118 P1= value;
00119 break;
00120 case 0x02:
00121 P2= value;
00122 break;
00123 case 0x03:
00124 P3= value;
00125 break;
00126 default:
00127 CD_LinkMsgError(CD_Err_BadSubdevice);
00128 return;
00129 }
00130
00131
00132 CD_LinkMsgOK();
00133 }
00134
00135
00136
00137
00138 void cds_DOM(unsigned char *msg) large {
00139
00140 unsigned char subdevice;
00141
00142 unsigned char value;
00143 unsigned char mask;
00144 unsigned char data val_and, data val_or;
00145
00146
00147 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00148 CD_LinkMsgError(CD_Err_BadSubdevice);
00149 return;
00150 };
00151
00152
00153 if (CD_HexaStrTo_u8(msg+8, 2, &value)) {
00154 CD_LinkMsgError(CD_Err_BadValue);
00155 return;
00156 };
00157
00158
00159 if (CD_HexaStrTo_u8(msg+16, 2, &mask)) {
00160 CD_LinkMsgError(CD_Err_BadValue);
00161 return;
00162 };
00163
00164
00165 val_and = ~mask | value;
00166 val_or = mask & value;
00167
00168 switch(subdevice) {
00169
00170 case 0x00:
00171 P0 &= val_and;
00172 P0 |= val_or;
00173 break;
00174 case 0x01:
00175 P1 &= val_and;
00176 P1 |= val_or;
00177 break;
00178 case 0x02:
00179 P2 &= val_and;
00180 P2 |= val_or;
00181 break;
00182 case 0x03:
00183 P3 &= val_and;
00184 P3 |= val_or;
00185 break;
00186 default:
00187 CD_LinkMsgError(CD_Err_BadSubdevice);
00188 return;
00189 }
00190
00191
00192 CD_LinkMsgOK();
00193 }
00194
00195
00196
00197 void cds_DIL(unsigned char *msg) large {
00198
00199 unsigned char subdevice;
00200 unsigned char line;
00201 unsigned char value;
00202
00203
00204 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00205 CD_LinkMsgError(CD_Err_BadSubdevice);
00206 return;
00207 };
00208
00209 if (CD_HexaStrTo_u8(msg+2, 2, &line)) {
00210 CD_LinkMsgError(CD_Err_BadValue);
00211 return;
00212 };
00213
00214 switch(subdevice) {
00215
00216 case 0x00:
00217 value = P0;
00218 break;
00219 case 0x01:
00220 value = P1;
00221 break;
00222 case 0x02:
00223 value = P2;
00224 break;
00225 case 0x03:
00226 value = P3;
00227 break;
00228 default:
00229 CD_LinkMsgError(CD_Err_BadSubdevice);
00230 return;
00231 }
00232
00233
00234 if (value & (1<<line)) {
00235 CD_LinkTXStr("#!1\x0D");
00236 } else {
00237 CD_LinkTXStr("#!0\x0D");
00238 }
00239 }
00240
00241
00242
00243
00244 void cds_DIP(unsigned char *msg) large {
00245
00246 unsigned char subdevice;
00247 unsigned char value;
00248
00249 unsigned char resp[3];
00250
00251
00252
00253 if (CD_HexaStrTo_u8(msg, 2, &subdevice)) {
00254 CD_LinkMsgError(CD_Err_BadSubdevice);
00255 return;
00256 };
00257
00258 switch(subdevice) {
00259
00260 case 0x00:
00261 value = P0;
00262 break;
00263 case 0x01:
00264 value = P1;
00265 break;
00266 case 0x02:
00267 value = P2;
00268 break;
00269 case 0x03:
00270 value = P3;
00271 break;
00272 default:
00273 CD_LinkMsgError(CD_Err_BadSubdevice);
00274 return;
00275 }
00276
00277
00278 CD_u8_ToHexaStr(value, 2, resp);
00279 CD_LinkTXStr("#!000000");
00280 CD_LinkTXStr(resp);
00281 CD_LinkTXChar('\x0D');
00282 }