mirror of
https://github.com/lindbergh-loader/lindbergh-loader.git
synced 2026-10-15 02:20:12 +03:00
Compare commits
1
Commits
master
...
bobby/test
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2dc358acda |
Submodule
+1
Submodule scripts/appimage/build-deps/FAudio added at e9e9d9478f
Submodule
+1
Submodule scripts/appimage/build-deps/SDL added at 129627068f
Submodule
+1
Submodule scripts/appimage/build-deps/SDL_image added at d516bc507f
Submodule
+1
Submodule scripts/appimage/build-deps/SDL_ttf added at 053bbc8951
@@ -83,7 +83,6 @@ int initBaseboard()
|
|||||||
}
|
}
|
||||||
|
|
||||||
initJVSSerial(jvsFileDescriptor);
|
initJVSSerial(jvsFileDescriptor);
|
||||||
startJVSFrameThread(&jvsFileDescriptor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(serialString, SERIAL_STRING);
|
strcpy(serialString, SERIAL_STRING);
|
||||||
@@ -216,9 +215,9 @@ int baseboardIoctl(int fd, unsigned long request, void *data)
|
|||||||
}
|
}
|
||||||
else if (jvsFileDescriptor >= 0)
|
else if (jvsFileDescriptor >= 0)
|
||||||
{
|
{
|
||||||
|
write(jvsFileDescriptor, inputBuffer, jvsCommand.srcSize);
|
||||||
for (int i = 0; i < jvsCommand.srcSize; i++)
|
for (int i = 0; i < jvsCommand.srcSize; i++)
|
||||||
{
|
{
|
||||||
write(jvsFileDescriptor, &inputBuffer[i], 1);
|
|
||||||
if (inputBuffer[i] == 0xF0)
|
if (inputBuffer[i] == 0xF0)
|
||||||
{
|
{
|
||||||
setSenseLine(3);
|
setSenseLine(3);
|
||||||
@@ -228,6 +227,7 @@ int baseboardIoctl(int fd, unsigned long request, void *data)
|
|||||||
setSenseLine(1);
|
setSenseLine(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -278,12 +278,23 @@ int baseboardIoctl(int fd, unsigned long request, void *data)
|
|||||||
}
|
}
|
||||||
else if (jvsFileDescriptor >= 0)
|
else if (jvsFileDescriptor >= 0)
|
||||||
{
|
{
|
||||||
JVSFrame frame = readJVSFrameFromThread();
|
if(getSenseLine() == 3)
|
||||||
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size);
|
{
|
||||||
_data[2] = jvsCommand.destAddress;
|
char errorMessage[5] = {0xE0, 0x00, 0x02, 0x01, 0x03};
|
||||||
_data[3] = frame.size;
|
memcpy(&sharedMemory[jvsCommand.destAddress], errorMessage, 5);
|
||||||
_data[1] = frame.ready;
|
_data[2] = jvsCommand.destAddress;
|
||||||
|
_data[3] = 5;
|
||||||
|
_data[1] = 1;
|
||||||
|
} else {
|
||||||
|
JVSFrame frame = readJVSFrameFromThread(jvsFileDescriptor);
|
||||||
|
memcpy(&sharedMemory[jvsCommand.destAddress], frame.buffer, frame.size);
|
||||||
|
_data[2] = jvsCommand.destAddress;
|
||||||
|
_data[3] = frame.size;
|
||||||
|
_data[1] = frame.ready;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
+121
-19
@@ -13,6 +13,14 @@
|
|||||||
#define TIMEOUT_SELECT 200
|
#define TIMEOUT_SELECT 200
|
||||||
#define CTS_ON_RETRY 100
|
#define CTS_ON_RETRY 100
|
||||||
|
|
||||||
|
#define JVS_MAX_PACKET_SIZE 255
|
||||||
|
|
||||||
|
#define SYNC 0xE0
|
||||||
|
#define ESCAPE 0xD0
|
||||||
|
#define BROADCAST 0xFF
|
||||||
|
#define BUS_MASTER 0x00
|
||||||
|
#define DEVICE_ADDR_START 0x01
|
||||||
|
|
||||||
// Used to read JVS frame in a non-blocking way
|
// Used to read JVS frame in a non-blocking way
|
||||||
JVSFrame jvsFrameBuffer;
|
JVSFrame jvsFrameBuffer;
|
||||||
pthread_mutex_t jvsBuffer_lock = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t jvsBuffer_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
@@ -95,7 +103,7 @@ int initJVSSerial(int fd)
|
|||||||
|
|
||||||
// Block until either VMIN characters have been received or VTIME **after first character** has been received
|
// Block until either VMIN characters have been received or VTIME **after first character** has been received
|
||||||
options.c_cc[VMIN] = 0;
|
options.c_cc[VMIN] = 0;
|
||||||
options.c_cc[VTIME] = 1;
|
options.c_cc[VTIME] = 2; // 200ms
|
||||||
|
|
||||||
// options.c_cflag |= CREAD; // Turn on READ, let ctrl lines work
|
// options.c_cflag |= CREAD; // Turn on READ, let ctrl lines work
|
||||||
tcsetattr(fd, TCSANOW, &options);
|
tcsetattr(fd, TCSANOW, &options);
|
||||||
@@ -224,6 +232,8 @@ int startJVSFrameThread(int *fd)
|
|||||||
{
|
{
|
||||||
printf("SERIAL: starting thread.\n");
|
printf("SERIAL: starting thread.\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
// Clean shared JVS frame buffer
|
// Clean shared JVS frame buffer
|
||||||
jvsFrameBuffer.ready = 0;
|
jvsFrameBuffer.ready = 0;
|
||||||
jvsFrameBuffer.size = 0;
|
jvsFrameBuffer.size = 0;
|
||||||
@@ -240,30 +250,122 @@ int startJVSFrameThread(int *fd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char destination;
|
||||||
|
unsigned char length;
|
||||||
|
unsigned char data[JVS_MAX_PACKET_SIZE];
|
||||||
|
} JVSPacket;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a JVSFrame structure with empty or full data, no in between
|
* Return a JVSFrame structure with empty or full data, no in between
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
JVSFrame readJVSFrameFromThread()
|
JVSFrame readJVSFrameFromThread(int fd)
|
||||||
{
|
{
|
||||||
JVSFrame frame;
|
|
||||||
// Lock while reading/writing to shared frame
|
|
||||||
pthread_mutex_lock(&jvsBuffer_lock);
|
|
||||||
|
|
||||||
// Check if we have a valid frame
|
JVSFrame frame;
|
||||||
if (jvsFrameBuffer.ready == 1)
|
JVSPacket packet = {0};
|
||||||
{
|
|
||||||
frame = jvsFrameBuffer;
|
frame.size = 0;
|
||||||
// It has been read, we disable this frame
|
frame.ready = 1;
|
||||||
jvsFrameBuffer.ready = 0;
|
|
||||||
}
|
int bytesAvailable = 0, escape = 0, phase = 0, index = 0, dataIndex = 0, finished = 0;
|
||||||
else
|
unsigned char checksum = 0x00;
|
||||||
{
|
int timeout = 3;
|
||||||
frame.ready = 0;
|
|
||||||
frame.size = 0;
|
unsigned char inputBuffer[JVS_MAX_PACKET_SIZE];
|
||||||
memset(frame.buffer, 0, JVSBUFFER_SIZE);
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&jvsBuffer_lock);
|
while (!finished)
|
||||||
|
{
|
||||||
|
int bytesRead = read(fd, inputBuffer + bytesAvailable, JVS_MAX_PACKET_SIZE - bytesAvailable);
|
||||||
|
|
||||||
|
if(bytesRead > 0) {
|
||||||
|
timeout = 3;
|
||||||
|
} else {
|
||||||
|
timeout = timeout - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(timeout == 0) {
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (bytesRead < 0)
|
||||||
|
return frame;
|
||||||
|
|
||||||
|
bytesAvailable += bytesRead;
|
||||||
|
|
||||||
|
while ((index < bytesAvailable) && !finished)
|
||||||
|
{
|
||||||
|
/* If we encounter a SYNC start again */
|
||||||
|
if (!escape && (inputBuffer[index] == SYNC))
|
||||||
|
{
|
||||||
|
phase = 0;
|
||||||
|
dataIndex = 0;
|
||||||
|
packet.data[dataIndex++] = inputBuffer[index];
|
||||||
|
index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we encounter an ESCAPE byte escape the next byte */
|
||||||
|
if (!escape && inputBuffer[index] == ESCAPE)
|
||||||
|
{
|
||||||
|
escape = 1;
|
||||||
|
index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Escape next byte by adding 1 to it */
|
||||||
|
if (escape)
|
||||||
|
{
|
||||||
|
inputBuffer[index]++;
|
||||||
|
escape = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deal with the main bulk of the data */
|
||||||
|
switch (phase)
|
||||||
|
{
|
||||||
|
case 0: // If we have not yet got the address
|
||||||
|
packet.data[dataIndex++] = inputBuffer[index];
|
||||||
|
packet.destination = inputBuffer[index];
|
||||||
|
checksum = packet.destination & 0xFF;
|
||||||
|
phase++;
|
||||||
|
break;
|
||||||
|
case 1: // If we have not yet got the length
|
||||||
|
packet.length = inputBuffer[index];
|
||||||
|
packet.data[dataIndex++] = inputBuffer[index];
|
||||||
|
checksum = (checksum + packet.length) & 0xFF;
|
||||||
|
phase++;
|
||||||
|
break;
|
||||||
|
case 2: // If there is still data to read
|
||||||
|
if (dataIndex == (packet.length + 2))
|
||||||
|
{
|
||||||
|
if (checksum != inputBuffer[index]) {
|
||||||
|
printf("CHEKCSUM ERROR\n");
|
||||||
|
return frame; // Checksum error, return empty frame
|
||||||
|
}
|
||||||
|
|
||||||
|
packet.data[dataIndex++] = checksum;
|
||||||
|
|
||||||
|
|
||||||
|
finished = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
packet.data[dataIndex++] = inputBuffer[index];
|
||||||
|
checksum = (checksum + inputBuffer[index]) & 0xFF;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frame.size = dataIndex;
|
||||||
|
memcpy(frame.buffer, packet.data, dataIndex);
|
||||||
|
frame.ready = 1;
|
||||||
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ int getDCD(int fd);
|
|||||||
int getDSR(int fd);
|
int getDSR(int fd);
|
||||||
int getCTS(int fd);
|
int getCTS(int fd);
|
||||||
|
|
||||||
JVSFrame readJVSFrameFromThread();
|
JVSFrame readJVSFrameFromThread(int fd);
|
||||||
int startJVSFrameThread(int * fd);
|
int startJVSFrameThread(int * fd);
|
||||||
void * readJVSFrameThread(void * arg);
|
void * readJVSFrameThread(void * arg);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user