led % 비율 설정할 때 (정수/실수)의 형태인데,
이 경우 정수는 4바이트, 실수는 8바이트라서 자동으로 정수를 실수로 형변환해준다
-> 실수/실수 형태가 되어버림
위의 내용을 추가함으로써 창을 늘렸을 때 재배치하면서 조절함
파이에서 실행할 때
mknod, insmod 두개를 하고 실행해야함
만약 insmod를 안했는데 lsmod에 있으면 빌트인 커널이므로 잘못된 것
이제 타이머를 해볼 것이다
전역으로 사용하기 때문에 클래스의 멤버변수로 넣는다
pQTimer = new QTimer(this);
connect(ui->pPBtimerStart, SIGNAL(clicked(bool)), this, SLOT(timerStartSlot(bool)));
void Tab1DeviceControl::timerStartSlot(bool bCheck)
{
if(bCheck)
{
QString strValue = ui->pCBtimerValue->currentText(); // 50, 100 등 숫자는 문자열이다
pQTimer->start(strValue.toInt()); // 가져온 문자열을 정수로 변환한다
ui->pPBtimerStart->setText("Timer Stop");
}
else
{
pQTimer->stop();
ui->pPBtimerStart->setText("Timer Start");
}
}
led처럼 cpp에 미리 선언해주고, 함수까지 추가한 뒤
#include <QTimer>
private:
void timerStartSlot(bool);
헤더에도 포함한다
근데 이 상태에서 실행하면 실행 중에 콤보박스의 숫자를 조절해도 변경된 값으로 타이머를 조절하지 않는다
connect(ui->pCBtimerValue, SIGNAL(currentIndexChanged(QString)), this, SLOT(timerValueChangedSlot(QString)));
cpp에 이 내용을 추가해주고 위에서 한 내용처럼 헤더와 함수선언을 한다
void Tab1DeviceControl::timerValueChangedSlot(QString strValue)
{
if(pQTimer->isActive())
{
pQTimer->stop();
pQTimer->start(strValue.toInt());
}
}
이제 key를 이용해볼 것이다
connect(pKeyLed, SIGNAL(updateKeydataSig(int)), this, SLOT(keyCheckBoxSlot(int)));
늘 하던대로 cpp에 입력하고 헤더에 선언하고 함수로 만든다
void Tab1DeviceControl::keyCheckBoxSlot(int keyNo)
{
// qDebug() << "KeyNo" << keyNo;
static int lcdData = 0;
lcdData ^= (0x01 << (keyNo - 1));
ui->pLcdNumberKey->display(lcdData);
QCheckBox * pQCheckBoxArray[8] = {ui->pCBKey1, ui->pCBKey2, ui->pCBKey3, ui->pCBKey4,
ui->pCBKey5, ui->pCBKey6, ui->pCBKey7, ui->pCBKey8};
for (int i=0;i<8;i++)
{
if(keyNo == i + 1)
{
if(pQCheckBoxArray[i]->isChecked())
pQCheckBoxArray[i]->setChecked(false);
else
pQCheckBoxArray[i]->setChecked(true);
}
}
}
Tab2에 소켓통신을 넣어볼 것이다
nfs에 파일을 복사하여 넣고, 실행한 뒤
form에 add로 Tab2TcpSocket으로 생성한다
pro에
QT += network
추가 해야한다
mainwidget.h에
#include "tab2tcpsocket.h"
Tab2TcpSocket *pTab2TcpSocket;
추가하고
cpp에
pTab2TcpSocket = new Tab2TcpSocket(ui->pTab2);
ui->pTab2->setLayout(pTab2TcpSocket->layout());
추가한다
mainwidget의 tabWidget의 이름을 pTabWidget으로 변경 후
cpp에서
ui->pTabWidget->setCurrentIndex(0);
추가한다
안되면 clean all 하고 rebuild 해본다
label, push button 2개로 다음과 같이 만들고
hbox로 묶는다
6,2,2로 설정했음
text edit 1개와 line edit 2개를 가져온다
line edit 2개는 hbox에 넣고
맨 오른쪽에 push button을 하나 넣는다
2,7,2
이렇게 만들어졌고 오브젝트 이름을 변경해준다
ipc_socket의 server.c 파일을 수정한다
우선 소켓 통신이 가능하다
go to slot으로 함수를 만들고, clicked(bool)로 만든다
void Tab2TcpSocket::on_pPBserverConnect_clicked(bool checked)
{
bool bOk;
if(checked)
{
pSocketClient->slotConnectToServer(bOk);
if(bOk)
{
ui->pPBserverConnect->setText("서버해제");
ui->pPBsendButton->setEnabled(true);
}
}
else
{
pSocketClient->slotClosedByServer();
ui->pPBserverConnect->setText("서버연결");
ui->pPBsendButton->setEnabled(false);
}
}
ui에서 checkable 한다
추가로 다음 내용으로 추가한다 tap2.cpp
connect(pSocketClient, SIGNAL(sigSocketRecv(QString)), this, SLOT(sockedRecvUpdateSlot(QString)));
헤더도 추가해주고
함수도 추가한다
void Tab2TcpSocket::sockedRecvUpdateSlot(QString strRecvData)
{
ui->pTErecvData->append(strRecvData);
ui->pTErecvData->moveCursor(QTextCursor::End);
}
화면에 줄로 로그를 띄우고
화면에 꽉 차면 아래로 스크롤바가 생긴다
그런데 \n이 추가되어있는데, 이것을 제거하겠다
strRecvData.chop(1);
맨 마지막 1문자를 제거하겠다는 뜻
앞에가 좀 밋밋하니까 시간을 넣어보겠다
tab2.h에
#include <QTime>
추가한 함수는
void Tab2TcpSocket::sockedRecvUpdateSlot(QString strRecvData)
{
strRecvData.chop(1);
QTime time = QTime::currentTime();
QString strTime = time.toString();
strTime = strTime + " " + strRecvData;
ui->pTErecvData->append(strTime);
ui->pTErecvData->moveCursor(QTextCursor::End);
}
이렇게 되고
이렇게 보인다
이제 메시지로 led 제어를 하려한다
이 내용을 추가하려면 바로 위의 함수를 수정해야한다
문자열을 꺼내와서 분리해야하므로
먼저, 대괄호를 @로 치환한다
strRecvData.replace("[", "@");
strRecvData.replace("]", "@");
QStringList qlist = strRecvData.split("@");
[PYG_QT]LED@0xff 라고 입력할 때
이렇게하면 qlist[0] = null
qlist[1] = PYG_QT
qlist[2] = LED
qlist[3] = 0xff
가 등록된다
// if(strRecvData.index0f("LED"))
if(qlist[2]=="LED")
{
bool bOk;
int ledNo = qlist[3].toInt(&bOk, 16);
if(bOk)
{
emit ledWriteSig(ledNo);
}
}
함수에 이렇게 추가해주고
시그널을 등록한다
signals:
void ledWriteSig(int);
이후 mainwidget.cpp에 가서 tab1의 dial값을 바꾸려한다
근데 private이라 접근할 수 없다(ui->pDialLed 가 안된다는 뜻)
그래서 get 함수를 만들어서 호출해야한다
mainwidget.cpp에 만들어두고
connect(pTab2TcpSocket, SIGNAL(ledWriteSig(int)), pTab1DeviceControl->getpDialLed(), SLOT(setValue));
tab1.h에 정의하고
#include <QDial>
public:
QDial * getpDialLed();
tab1.cpp에 함수 선언한다
QDial * Tab1DeviceControl::getpDialLed()
{
}
아까 빼먹은 송신 키를 살려보려한다
ui에 가서 송신 키를 go to slot - clicked()로 선택한다
그리고 아까 잘못적은 pLErecvData를 pLEsendData로 수정한다
다시 컴파일
void Tab2TcpSocket::on_pPBsendButton_clicked()
{
QString strRecvId = ui->pLErecvId->text();
QString strSendData = ui->pLEsendData->text();
if(!strSendData.isEmpty())
{
if(strRecvId.isEmpty())
strSendData = "[ALLMSG]" + strSendData;
else
strSendData = "[" + strRecvId + "]" + strSendData;
pSocketClient->slotSocketSendData(strSendData);
ui->pLEsendData->clear();
}
}
함수를 위와 같이 만든다
이번에 keyupdate를 할 것이다
pKeyled도 private라서 get함수로 접근한 뒤 받아와야 한다
connect(pTab1DeviceControl->getpKeyled(),SIGNAL(updatekeyledSig(int)), pTab1DeviceControl->getpDialLed(), SLOT(setValue(int)));
위의 tab2.cpp 부분 만든 것에
헤더에 getKeyled()함수를 선언하고
함수를 tab2.cpp다음과 같이 만든다
KeyLed * Tab1DeviceControl::getpKeyled()
{
return pKeyled;
}