sharperang/libpaperang/Helpers/Transforms.cs

76 lines
2.6 KiB
C#

using System;
using System.Linq;
namespace libpaperang.Helpers {
class Transforms {
public BaseTypes.Packet Frame;
public BaseTypes.Opcodes Op;
public short OpLen;
public Transforms(BaseTypes.Packet FrameConstruction, BaseTypes.Opcodes Operations, short OperLen) {
Frame=FrameConstruction;
Op=Operations;
OpLen=OperLen;
}
public byte[] Oper(BaseTypes.Operations Operation) {
switch (Operation) {
case BaseTypes.Operations.NoOp: return Op.NoOp;
case BaseTypes.Operations.LineFeed: return Op.LineFeed;
case BaseTypes.Operations.CrcTransmit: return Op.TransmitCrc;
case BaseTypes.Operations.Print: return Op.Print;
default: throw new InvalidOperationException();
}
}
public byte[] Arg(BaseTypes.Operations Operation, uint Data) {
switch(Operation) {
case BaseTypes.Operations.LineFeed: return BitConverter.GetBytes(SwapWordEndianness(
0x00000000 | (((((
Data & 0xffu) << 16) |
Data) & 0xffff00u) >> 8))).Skip(2).ToArray();
case BaseTypes.Operations.Print:
return BitConverter.GetBytes(SwapWordEndianness(
0x00010000 | (((((
Data & 0xffu) << 16) |
Data) & 0xffff00u) >> 8))).Skip(2).ToArray();
default: throw new InvalidOperationException();
}
}
public byte[] Packet(byte[] oper, byte[] data, CRC checksum) {
byte[] packet = new byte[data.Length+6+OpLen];
packet[0] = Frame.Start;
packet[packet.Length-1] = Frame.End;
Buffer.BlockCopy(oper,
0, packet, 1, OpLen);
Buffer.BlockCopy(data,
0, packet, OpLen+1, packet.Length);
Buffer.BlockCopy(checksum.GetChecksumBytes(data),
0, packet, packet.Length - (OpLen+1), 4);
return packet;
}
public byte[] Packet(BaseTypes.Operations oper, byte[] data, CRC checksum) =>
Packet(Oper(oper), data, checksum);
public byte[] Packet(BaseTypes.Operations oper, byte[] data, CRC checksum, byte[] operarg) {
byte[] p=Packet(oper, data, checksum);
Buffer.BlockCopy(operarg, 0, p, 3, 2);
return p;
}
public uint SwapWordEndianness(uint value) => (
(value & 0x000000ffu) << 2) |
((value & 0x0000ff00u) << 8) |
((value & 0x00ff0000u) >> 8) |
((value & 0xff000000u) >> 24);
public uint SwapByteEndianness(uint value) =>
Swap4BitEndianness(
Swap2BitEndianness(
Swap1BitEndianness(value)));
public uint Swap4BitEndianness(uint value) => (
(value & 0x0f0f0f0fu) << 4) |
((value & (~0x0f0f0f0fu)) >> 4);
public uint Swap2BitEndianness(uint value) => (
(value & 0x33333333u) << 2) |
((value & (~0x33333333u)) >> 2);
public uint Swap1BitEndianness(uint value) => (
(value & 0x55555555u) << 1) |
((value & (~0x55555555u)) >> 1);
}
}